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

如何让这个程序在屏幕输出10进制的AX的内容datasegmentbuffer1db0,1,2,3,4buffer2db0,1,2,3,4buffer3db100dup(... 如何让这个程序在屏幕输出10进制的AX的内容

data segment
buffer1 db 0,1,2,3,4
buffer2 db 0,1,2,3,4
buffer3 db 100 dup(?)
data ends
code segment
assume cs:code,ds:data,es:data
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
dec bx
inc di
dec cx
jnz m
mov ah,4ch
int 21h
ret
main endp
code ends
end begin
这个程序就是将Buffer1和Buffer2中的数相加然后将结果放在Buffer3中,只是程序运行除了Bebug看不到结果,就是想将它改成能在屏幕上显示AX中的运算结果。
展开
 我来答
ferdinand016
2011-11-13
知道答主
回答量:14
采纳率:0%
帮助的人:26.2万
展开全部
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
Creaspan
2011-11-13 · 超过24用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:56.5万
展开全部
MOV AH,2
INT 21H
这条指令的意思是把AL里的内容在屏幕上显示,你可以把你要显示的内容先传入AL中在执行上述指令
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yeyulong4
2011-11-12 · TA获得超过454个赞
知道小有建树答主
回答量:307
采纳率:0%
帮助的人:302万
展开全部
恕我眼拙看不出你的程序是这个意思。再请问一下你是不是想输出ax里面的字符的ASCII码
比如你存的是一个空格,ASCII码是20h,你想得到的输出结果是20吗?
首先就是先把ax里面的内容存起来,然后对ax进行逻辑右移得到高四位的值就是2,你要加上30h输出就是'2'了,然后再把原来ax里的值取回来,再和0fh进行and运算,得到ax的低四位,也就是0,同样加上30h,输出就是'0'了.
追问
这个程序就是将Buffer1和Buffer2中的数相加然后将结果放在Buffer3中,只是程序运行除了Bebug看不到结果,就是想将它改成能在屏幕上显示AX中的运算结果。
追答
如果你想显示出来的话,就要把你向显示的东西放到dx或dl里然后调用09h号或02h号dos中断就可以显示了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2011-11-12 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3.2万
采纳率:86%
帮助的人:8819万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
寻找Rocky
2011-11-12 · TA获得超过777个赞
知道小有建树答主
回答量:1004
采纳率:34%
帮助的人:187万
展开全部
减去30h 就行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式