首页
社区
课程
招聘
[旧帖] [求助]汇编几个小问题请教 0.00雪花
发表于: 2010-7-12 14:31 1379

[旧帖] [求助]汇编几个小问题请教 0.00雪花

2010-7-12 14:31
1379
例5.3 已知有二个32位数d1和d2(用数据类型DD说明),编写程序片段把d2的值加到d1中。

解: 方法1:用16位寄存器编写程序
MOV AX, word ptr d1 ;由于d1是双字类型,必须使用强制类型说明符。以下同。
MOV DX, word ptr d1+2 ;(DX,AX)构成一个32位数据 //这里为什么是加2呢?不是加1吗?
ADD AX, word ptr d2 ;低字相加
ADC DX, word ptr d2+2 ;高字相加。在低字相加时,有可能会产生“进位”
MOV word ptr d1, AX ;低字送给d1的低字
MOV word ptr d1+2, DX ;高字送给d1的高字
方法2:用32位寄存器编写程序
MOV EAX, d1
ADD EAX, d2
MOV d1, EAX

编写程序段,完成下面计算公式,并把所得的商和余数分别存入X和Y中(其中:A,B,C,X和Y都是有符号的字变量)。

(C - 120 + A*B) / C

解:

A DW  ?
B DW  ?
C DW  ?
X DW  ?
Y DW  ?

MOV AX, C
SUB AX, 120D ;书写指令“ADD AX, -120D”也可以
CWD  ;能否详细说明一下这句的作用?和下句相关,对吧?为什么要把符号扩充后移到CX?如果为负数,DX为全1,能否举个例子具体说明运算过程,以保证DX为全1时才能保证运算正确?
MOV CX, DX
MOV BX, AX ;(CX, BX)←(DX, AX),调度寄存器,为作乘法准备必要的寄存器
MOV AX, A
IMUL B ;(DX, AX)←A*B  ;AB的积是怎么分配到DX/AX中的?
ADD AX, BX ;计算32位二进制之和,为作除法作准备
ADC DX, CX  ;这一句也不懂:(
IDIV C ;AX是商,DX是余数
MOV X, AX ;分别保存商和余数到指定的字变量单元里
MOV Y, DX

十分感谢啦!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
复杂。。。。。。。。。。。
2010-7-12 15:01
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
d1占4个字节,word型数据占2个字节,所以d1的高16位数据的地址相对于d1的地址其偏移量为2。

A*B的结果有可能超过32位,故要将(C-120)的结果扩充成64位,(C-120)有可能是负数,故扩充时要符号扩充,以保证扩充后值不变。A*B的结果的低32位存储在AX中,高32位存储在DX中。(CX:BX)+(DX:AX)时,BX+AX的结果有可能产生进位,故CX+DX时要用带进位加法指令ADC。
2010-7-12 16:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
十分感谢KABBIN的详细解决!

第一个问题中+2,照你的理解,2这个数字代表的是2个字节,
而不是按前面强制转换成的word而理解成2个word,
不知这样理解对不对?

第二个,是不是扩展成32位而不是64位?

再次感谢!
2010-7-12 19:12
0
游客
登录 | 注册 方可回帖
返回
//