-
-
[旧帖]
[求助]汇编几个小问题请教
0.00雪花
-
发表于:
2010-7-12 14:31
1379
-
[旧帖] [求助]汇编几个小问题请教
0.00雪花
例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 探索篇!