MOV BX,6
把6,送到显存,能显示什么呀?
改成:
MOV BX,41H
试试看。
楼主的写入,显示的位置在屏幕的左上角,
楼主给出的,却没有包括这个位置。
看看:
>
CODE SEGMENT ;;代码段开始
ASSUME CS:CODE ;;代码段地址和CS段寄存器关联
START:MOV AL,0ABH ;;START是一个标签, 将 *** 作数0ABH 放在寄存器AL中
MOV CL,4 ;;将4放在寄存器CL中
ROL AL,CL ;;将AL中的数循环左移4位 左移的位数时根据cl的值来决定
MOV AX,4C00H ;;21号中断的4c号功能用于退出程序返回执行权给 *** 作系统
INT 21H ;;调用中断21h, 退出程序 不写这个你的程序运行后dos就会死住无法继续 *** 作
CODE ENDS
END START
assume cs:cseg
cseg segment
hextab db '0123456789ABCDEF'
A dd 11118888H
b dd 33339444H
c dd 0
start:
mov ax, cseg
mov ds, ax
mov ax, word ptr a
add ax, word ptr b
mov word ptr c, ax
mov ax, word ptr a+2
adc ax, word ptr b+2
mov word ptr c+2, ax
;16进制显示结果
lea bx, hextab
mov ah, 0eh
;高16位
mov dx, word ptr c+2
mov cx, 404h
c1:
rol dx, cl
mov al, dl
and al, 0fh
xlat
int 10h
dec ch
jnz c1
;低16位
mov dx, word ptr c
mov cx, 404h
c2:
rol dx, cl
mov al, dl
and al, 0fh
xlat
int 10h
dec ch
jnz c2
mov ah,4ch
int 21h
cseg ends
end start
;======================
DISP_STR MACRO X ;宏定义
MOV DX, OFFSET X
MOV AH, 9
INT 21H
ENDM
;----------------------
DATA SEGMENT ;数据段
MSG1 DB 13, 10, 'Please Input : $'
MSG3 DB 13, 10, 'The HEX is : $'
x DW ;存放新输入数据
DATA ENDS
;----------------------
CODE SEGMENT ;代码段
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
;--------------------------------
IN_LOOP:
DISP_STR MSG1 ;宏调用,提示 Please Input :
;--------------------------------
MOV x, 0 ;数据清零
_INX:
MOV AH, 1 ;输入字符
INT 21H
;--------------------------------
CMP AL, 13 ;回车
JE _IN_END ;是则结束输入
CMP AL, '0'
JB IN_LOOP ;小于'0',不是数字
CMP AL, '9'
JA IN_LOOP ;大于'9',不是数字
SUB AL, '0'
MOV CL, AL
MOV CH, 0
MOV AX, x
MOV BX, 10 ;老数据乘以10
MUL BX
ADD AX, CX ;加上新数据
MOV x, AX ;保存
CMP AX, 99
JA IN_LOOP
JMP _INX
;--------------------------------
_IN_END:
DISP_STR MSG3 ;宏调用,提示 The HEX is :
MOV AX, x
MOV BX, 16
MOV CX, 0
D_1:MOV DX, 0
DIV BX
ADD DL, '0'
CMP DL, 3AH
JB ZZZ
ADD DL, 7
ZZZ:
PUSH DX
INC CX
CMP AX, 0
JNE D_1
MOV AH, 2
D_2:POP DX
INT 21H
LOOP D_2
;--------------------------------
MOV AH, 4CH
INT 21H
;--------------------------------
CODE ENDS
END START
;=====================
1、程序如下:
code segment
assume cs:code, ds:code, ss:code
org 100h
main: mov si,offset x ;取数组中第一个元素的内存地址
mov cx,100 ;数组元素个数
cld ;以下使用lodsb来获得各元素值,为此先清除方向标志
xor ah,ah ;因x内全部为无符号数,所以将ah设为0,以便累加(根据 _fmlyht 意见从循环内移出以提高代码效率)
lab1: lodsb ;从ds:si处取一个字节放入al中,同时si增1即指向下个元素
add sum,ax ;累加
loop lab1 ;循环,前面对cx的赋值规定了循环次数为100次
int 20h ;循环结束后sum中为总和,此处用int 20h退出
x db 100 dup () ;定义100个字节型元素的数组,但不指定初值
sum dw 0 ;sum的初值为0,在程序代码部分中没有对该变量进行初始化,所以会使用这里定义的值为总和的初值
code ends
end main
2、代码如下:
cmp ax,bx ;比较ax与bx
jge lab2 ;若ax>=bx则转至lab2,带符号数比较须使用jg(e)/jl(e)/jng/jnl等指令
xchg ax,bx ;根据 _fmlyht 意见,将ax与bx交换,如此,ax中为两者的较大值,bx为较小值
lab2: cmp ax,cx ;执行到此时,ax中有最初时ax与bx中较大者,这时再比较ax与cx
jge lab3 ;方法与前次类似,至lab3时ax将存有原来三者中最大的数
xchg ax,cx ;没有跳转的话需将cx中较大的值与ax中较小的值交换以使ax中含最大值
lab3:
;至此ax中已是三者中的最大值,下面代码是为完成中间值与最小值的排序,使三者从大到小分别存放于ax、bx、cx。原题无此要求,可去掉。
cmp bx,cx
jge lab4
xchg bx,cx
lab4:
;至此,ax>=bx>=cx
----
谢谢楼下 _fmlyht 朋友指正,已在此答案中改进并注明。
通常8086用汇编程序编写,通常用wmd86。
通俗来说,用C语言编程来控制8086是顺理成章的事情,比如从前的TurboC、后来的borlandC,以及现在的VC++等编译后生成的可执行代码都是X86上运行的,如果一定要在8086CPU上运行,则直接指定CPU类别为8086即可。
code segment
assume cs:code
start: mov ax,2ab0h
mov ds,ax
mov ax,03abh
mov es,ax
mov si,1000h
mov di,1008h
mov cx,8192
cld
rep movs
mov ax,4c00h
int 21h
code ends
end start
以上就是关于8086汇编语言 简单的程序 ,只写显存0b800H ;为什么没有显示,请教了全部的内容,包括:8086汇编语言 简单的程序 ,只写显存0b800H ;为什么没有显示,请教了、求一个程序,微机原理,8086汇编语言,实现一个简单实用功能,如时钟显示、请分析这道8086汇编语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)