汇编语言输出ax时为什么要把值放在一个变量里才能正确输出?

zhangwei502 2012-04-30 02:25:47
汇编语言输出ax时为什么要把值放在一个变量里才能正确输出?
如果把 输出结果 那行的 result 替换成 al, result+1 ah 就不能正确输出,为什么?
data segment
result db ?,?
data ends
code segment
assume cs:code,ds:data
main proc far
start:
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
L:
;初始化数据
mov bh,1
mov bl,1

L1:
mov dl,bh
call output

call mulfun

mov dl,bl
call output

call deng

mov al,bh
mul bl
aam

mov result,al
mov result+1,ah

;输出结果
mov dl,result+1
call output
mov dl,result
call output

call space

inc bl
cmp bl,bh
jna L1

call retxx
mov bl,1
inc bh
cmp bh,9
jna L1
ret
main endp
;输出数
output proc near ;输出
add dl,30h
mov ah,02h
int 21h
ret
output endp
;输出乘号
mulfun proc near
push dx
mov dl,'*'
mov ah,02h
int 21h
pop dx
ret
mulfun endp
;输出等于号
deng proc near
push dx
mov dl,'='
mov ah,02h
int 21h
pop dx
ret
deng endp
;换行
retxx proc near
push dx
mov dl,0ah
int 21h
mov dl,0dh
int 21h
pop dx
ret
retxx endp
;输出空格
space proc near
push dx
mov dl,' '
mov ah,02h
int 21h
pop dx
ret
space endp

code ends
end start
如果把 输出结果 那行的 result 替换成 al, result+1 ah 就不能正确输出,为什么?
...全文
762 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gsy999 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:

;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
output proc near ;输出
add dl,30h ;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
mov ah,02h ;子程序里用到了ah
int 21h
ret
output endp

不好意思,……
[/Quote]
  病因:LZ的output子程序修改了ax,所以不能实现
  建议:进入output后立即保存ax旧值,返回前恢复之即可解决。
a835829001 2012-05-02
  • 打赏
  • 举报
回复
因为,调用call的时候ah,和al的值都发生了改变
zhangwei502 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
output proc near ;输出
add dl,30h ;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
mov ah,02h ;子程序里用到了ah
int 21h
ret
output endp
[/Quote]
不好意思,我没说清楚~!
我的意思是,如果改成 这个样子就不能出成确的结果
;输出结果
mov dl,ah
call output
mov dl,al
call output
我以经把值送给提前 DL 了啊~!!
zhangwei502 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
output proc near ;输出
add dl,30h ;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
mov ah,02h ;子程序里用到了ah
int 21h
ret
output endp
[/Quote]
不好意思,我没说清楚~!
我的意思是,如果改成 这个样子就不能出成确的结果
;输出结果
mov dl,ah
call output
mov dl,al
call output
masmaster 2012-04-30
  • 打赏
  • 举报
回复
;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
output proc near ;输出
add dl,30h ;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
mov ah,02h ;子程序里用到了ah
int 21h
ret
output endp
zhangwei502 2012-04-30
  • 打赏
  • 举报
回复
问题是 我提前把 AH里的值 送给 DL 里了~![Quote=引用 1 楼 的回复:]

因为output里,ah装的是中断功能号,dl里装的是要打印的字符。
[/Quote]
zhangwei502 2012-04-30
  • 打赏
  • 举报
回复
问题是 我提前把 AH里的值 送给 DL 里了~!
masmaster 2012-04-30
  • 打赏
  • 举报
回复
因为output里,ah装的是中断功能号,dl里装的是要打印的字符。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧