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

[复制链接]
查看11 | 回复8 | 2021-1-27 06:05:17 | 显示全部楼层 |阅读模式
汇编语言输出ax时为什么要把值放在一个变量里才能正确输出?
如果把输出结果那行的result替换成al,result+1ah就不能正确输出,为什么?
datasegment
resultdb?,?
dataends
codesegment
assumecs:code,ds:data
mainprocfar
start:
pushds
xorax,ax
pushax
movax,data
movds,ax
L:
;初始化数据
movbh,1
movbl,1
L1:
movdl,bh
calloutput
callmulfun
movdl,bl
calloutput
calldeng
moval,bh
mulbl
aam
movresult,al
movresult+1,ah
;输出结果
movdl,result+1
calloutput
movdl,result
calloutput
callspace
incbl
cmpbl,bh
jnaL1
callretxx
movbl,1
incbh
cmpbh,9
jnaL1
ret
mainendp
;输出数
outputprocnear;输出
adddl,30h
movah,02h
int21h
ret
outputendp
;输出乘号
mulfunprocnear
pushdx
movdl,'*'
movah,02h
int21h
popdx
ret
mulfunendp
;输出等于号
dengprocnear
pushdx
movdl,'='
movah,02h
int21h
popdx
ret
dengendp
;换行
retxxprocnear
pushdx
movdl,0ah
int21h
movdl,0dh
int21h
popdx
ret
retxxendp
;输出空格
spaceprocnear
pushdx
movdl,''
movah,02h
int21h
popdx
ret
spaceendp
codeends
endstart
如果把输出结果那行的result替换成al,result+1ah就不能正确输出,为什么?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
因为output里,ah装的是中断功能号,dl里装的是要打印的字符。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
问题是我提前把AH里的值送给DL里了~!
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
问题是我提前把AH里的值送给DL里了~!引用1楼的回复:因为output里,ah装的是中断功能号,dl里装的是要打印的字符。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
outputprocnear;输出
adddl,30h;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
movah,02h;子程序里用到了ah
int21h
ret
outputendp

回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
引用4楼的回复:;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
outputprocnear;输出
adddl,30h;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
movah,02h;子程序里用到了ah
int21h
ret
outputendp

不好意思,我没说清楚~!
我的意思是,如果改成这个样子就不能出成确的结果
;输出结果
movdl,ah
calloutput
movdl,al
calloutput

回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
引用4楼的回复:;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
outputprocnear;输出
adddl,30h;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
movah,02h;子程序里用到了ah
int21h
ret
outputendp

不好意思,我没说清楚~!
我的意思是,如果改成这个样子就不能出成确的结果
;输出结果
movdl,ah
calloutput
movdl,al
calloutput
我以经把值送给提前DL了啊~!!
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
引用6楼的回复:引用4楼的回复:
;这个子程序的入口参数是dl,dl里的值是由result传入的
;如果把result给ah,那么,会跟子程序里2号中断冲突
outputprocnear;输出
adddl,30h;参数dl,加上‘0’,作为下面2号中断(AH=2)的参数
movah,02h;子程序里用到了ah
int21h
ret
outputendp
不好意思,……

  病因:LZ的output子程序修改了ax,所以不能实现
  建议:进入output后立即保存ax旧值,返回前恢复之即可解决。

回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
因为,调用call的时候ah,和al的值都发生了改变
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行