请问《80x86汇编语言程序设计教程》上的一个例子

swcims 2005-10-20 09:50:09
求16X+Y的值:(杨季文《80x86汇编语言程序设计教程》最新版,p81)
表达式的结果可能超出16位,所以定义两个字变量用于保存X和Y,另外用一个32位的双字变量来保存结果。
用DX和AX保存中间结果,DX保存高16位,AX保存低16位。
DSEG SEGMEN
XXX DW 1234H ;设X为1234H
YYY DW 5678H ;设Y为5678H
ZZZ DD ? ;用于保存结果
DSEG ENDS

CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG ;(1)设置数据段寄存器值
MOV DS,AX
MOV AX,XXX ;(2)把X送AX并扩展到32位
XOR DX,DX
ADD AX,AX ;(3)计算X*16
ADDC DX,DX
ADD AX,AX ;X*4
ADDC DX,DX
ADD AX,AX ;X*8
ADDC DX,DX
ADD AX,AX ;X*16
ADDC DX,DX
ADD AX,YYY ;(4)在X*16结果上再加上Y
ADDC DX,0
MOV WORD PTR ZZZ,AX ;(5)保存结果
MOV WORD PTR ZZZ+2,DX
MOV AH,4CH ;(6)返回DOS
INT 21H

CSEG ENDS
END START

我猜得出程序的意思是用循环的方式来做X*16,但看不懂:
1)XOR DX,DX的作用。-> 这行的结果岂不是DX=0?
2)ADDC DX,DX的作用。-> 既然DX=0,这样带进位加有什么用呢?
我没看到“DX保存高16位”这样的表达式,怀疑是不是DX应该有个赋值的过程?
谢谢!
...全文
178 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
swcims 2005-10-21
  • 打赏
  • 举报
回复
有没有大侠帮帮忙?谢谢!
beijingbeerman 2005-10-21
  • 打赏
  • 举报
回复
有电子版吗?
swcims 2005-10-20
  • 打赏
  • 举报
回复
谢谢VxD1。
再请问CF不是等于0吗?CF记录的是ADD AX,AX的值?
如果是后者,那么假设有这样的程序(AX,DX与上面的例子没有任何关系):
ADD AX,AX
ADD DX,DX
ADDC CX,CX.
请问这时CF保存的是“ADD AX,AX”的值,还是“ADD DX,DX”?我一直不知道标志寄存器的CF,OF或SF的值是从哪里获得的。(有没有一般规律?)
请指教菜鸟。非常感谢!
VxD1 2005-10-20
  • 打赏
  • 举报
回复
xor dx,dx =>dx清0
adc dx,dx = add dx,dx,cf

21,459

社区成员

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

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