主题:[讨论]请教--谁给我解释一下这个命令--ADC
yn8202
[专家分:80] 发布于 2006-07-15 21:49:00
这个命令书上是这么说的“这条指令把两个操作数以及进位标志位CF相加,其和送入目的操作数”,但其中有说“这个是可以表示更大的数相加的”“用两个数表示一个整数,称为双精度,用更多的字表示,称为高精度表示,”我不明白的也就是下边这句话“若想把两个高精度整数相加,要从低到高对应字依次相加。最低字相加用ADD指令,其他字相加要用ADC指令,这样可以把来自较低字的进位加到下一个字中。下面有个例子
DNUMI DD 01234567H
DNUM2 DD 89ABCDEFH
DNUM3 DD ?
略
MOV AX,WORD PTR DNUM1
ADD AX,WORD PTR DNUM2
MOV WORD PTR DNUM3,AX
MOV AX,WORD PTR DNUM1+2
ADC AX,WORD PTR DNUM2+2
MOV WORD PTR DNUM3+2,AX
我想问倒数三句中,DNUM1、2、3加2是什么意思????谢谢!
是不是说前面的ADD加的是低位的,而后面的ADC加的是高位的,那么加上2是什么意思呢?还是有点不太明白???请指教??!!!谢谢!!
回复列表 (共6个回复)
沙发
henrya2 [专家分:590] 发布于 2006-07-15 22:19:00
MOV AX,WORD PTR DNUM1+2,是把DNUM1的地址加上2(下一个字的地址),和MOV AX,WORD PTR DNUM1[2] 等价,这种寻址模式叫Direct-Offset Addressing
ADC dst,src 仅仅是dst=dst+src+CF(对不起,我以为你说CF加到一个字的高位)
强烈建议换一本书看,IBM PC ASSEMBLY LANGUAGE AND PROGRAMMING就比较适合于初学者
板凳
yn8202 [专家分:80] 发布于 2006-07-16 15:01:00
为什么要加2呢??不明白???
第一个字是16位,也就是低们的,应该是从后面数的吧?也就是4567、CDEF,第一个ADD是加它们两的吧???为什么要加上2才能加到0123、89AB呢??这是怎么算的,为什么要加2呢??不知前面的我说的对不对???谢谢!!!
3 楼
henrya2 [专家分:590] 发布于 2006-07-16 20:11:00
DNUMI DD 01234567H
DNUM2 DD 89ABCDEFH
假设DNUM1地址为200H
200:67
201:45
202:23
203:01
204:EF
205:CD
206:AB
207:89
208:??
209:??
20A:??
20B:??
这种方式叫Littel Endian(little comes first).低位数字存储在低地址,高位数字存储在高地址
MOV AX,WORD PTR DNUM1 -> mov ax,word ptr [200]
ADD AX,WORD PTR DNUM2 -> add ax,word ptr [204]
MOV WORD PTR DNUM3,AX -> mov word ptr [208],ax
MOV AX,WORD PTR DNUM1+2 -> mov ax,word ptr [200+2]
ADC AX,WORD PTR DNUM2+2 -> adc ax,word ptr [204+2]
MOV WORD PTR DNUM3+2,AX -> mov word ptr [208+2],ax
因为在386以前寄存器都是16位的(一个字,两个字节),一次最多操作一个字.(内存之间直接操作是被禁止的).
(已经更正)
4 楼
yn8202 [专家分:80] 发布于 2006-07-18 09:20:00
ADD AX,WORD PTR DNUM2 -> add ax,word ptr [203]
这句的word ptr [203]是不是应该是204吧???低位和低位相加,不就应该是67和EF相加吧???
200和201是一个字,不是应该和204和205相加的吗?如果样你那样说不就是200和201与203和204相加了吗??
不知我说的对不对??
5 楼
henrya2 [专家分:590] 发布于 2006-07-19 13:11:00
好像我范的错误比你还多???*&&^%^
(就当我有病好了)
6 楼
henrya2 [专家分:590] 发布于 2006-07-19 13:22:00
我学汇编,估计两个月都没有。(我对很多东西一点都不熟练)
我来回复