汇编 在屏幕上显示AX的内容

2025-04-28 16:06:37
推荐回答(4个)
回答1:

stack segment para stack 'stack'
db 8 dup('mystack ') ;共有8*8个字节
stack ends

data segment
buffer1 db 0,1,2,3,4
buffer2 db 0,1,2,3,4
buffer3 db 100 dup(?)
sAscii db 6 dup(?) ;新增的,用来存放输出的数字串的
data ends

code segment
assume cs:code,ds:data,es:data,ss:stack
main proc far
begin: push ds
mov ax,0000h
push ax

mov ax,data
mov ds,ax
mov es,ax

lea si,buffer1
lea bx,buffer2
add bx,4

lea di,buffer3
mov cx,5

m: mov al,[si]
add al,[bx]
mov [di],al
inc si ;buffer1的指针
dec bx ;buffer2的指针
inc di ;buffer3的指针
loop m
;-------------------------------------
;显示数据
;新增的内容:
mov cx,5 ;有5条数据要输出
xor si,si ;si为数组下标,初值指向第0个元素
GetNext:
;显示数据是由disp_number子程序实现的,
;它要求把要显示的数据放在bx中:
xor bx,bx ;因为要显示的数据只有一个字节,所以清bx
mov bl,buffer3[si] ;从数组读数据进bl(bx是disp_number的参数)
call disp_number ;调用子程序,它把数转换成ASCII串并输出到屏幕

;每显示一个数之后追加显示一个逗号,最后一个数没有
.IF cx>1 ;如果不是最后一个数,则:
mov ah,2 ;传入显示ASCII符的功能号
mov dl,',' ;传入要显示的字符
int 21h ;调用DOS
.ENDIF

inc si ;调整数组下标,指向下一个
loop GetNext ;如果cx!=0,就进入下一个循环
;--------------------------------------------
;终止程序
mov ah,4ch
mov al,0 ;al是返回码,应该设置一下
int 21h
ret ;返回DOS
main endp
;---------------------------------------------------------------------
; 过程名:disp_number
; 功能:将bx中的无符号整数转换成十进制串并送屏幕输出
; 输入参数:bx = 要转换并输出的数据(无符号整数)
; 返回:无
;---------------------------------------------------------------------
disp_number proc near
push si ;保存寄存器旧值
push cx ;
;sASCii是存放转换后的串的
;首先将这个串的最后一个字节送入串结束符'$'
mov si, offset sAscii+5 ;让si指向最后一个字节
mov byte ptr [si] ,'$' ;obuf的最后一位放'$'
dec si ;修正si,使其指向要输出的数字串的个位数位置
mov cx,10 ;设置cx等于除数10
mov ax,bx ;bx即为要输出的数,送ax,作为被除数
again:
mov dx,0 ;无符号数扩展,它下面用来存放余数
div cx ;dx:ax := ax/cx(结果:dx=余数,ax=商)
add dl,30h ;把余数转换为相应的ASCII码
mov [si],dl ;存进相应的位置(因为是碾转除,dl第一次得个位,第二次得十位...)
dec si ;调整存放ASCII数据的指针(注意是减1,即由个位调整为十位...)
cmp ax,0 ;是0吗(经过碾转除以后,商可都除尽吗?0表示商没有了)
jnz again ;是就跳转进入下一循环(即商还有就再进入循环做除法)
;否则没有了,就准备输出转换后的串
inc si ;修正输出的串的首地址(上面si向左移了一位,可是没用到,所以再调回来)
mov dx,si ;首地址送dx
mov ah,9
int 21h ;显示器输出字符串

pop cx ;恢复寄存器旧值
pop si ;
ret
disp_number endp

code ends
end main

回答2:

MOV AH,2
INT 21H
这条指令的意思是把AL里的内容在屏幕上显示,你可以把你要显示的内容先传入AL中在执行上述指令

回答3:

恕我眼拙看不出你的程序是这个意思。再请问一下你是不是想输出ax里面的字符的ASCII码
比如你存的是一个空格,ASCII码是20h,你想得到的输出结果是20吗?
首先就是先把ax里面的内容存起来,然后对ax进行逻辑右移得到高四位的值就是2,你要加上30h输出就是'2'了,然后再把原来ax里的值取回来,再和0fh进行and运算,得到ax的低四位,也就是0,同样加上30h,输出就是'0'了.

回答4:

这个,也是用十进制输出AX中的数:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/7d8efcb239a3a7bbd8335ae1.html