add dword ptr [bx],[bx+4]
add dword ptr [bx],dword ptr [bx+4] 这样的写法都不行
其实是书本里的一个实验任务,为防止div溢出,给的公式
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
;公式: X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
;int():描述型运算符,取商,比如,int(38/10)=3
;rem():描述型运算符,取余数,比如,rem(38/10)=8
我考虑rem(H/N)*65536+L ,rem(H/N)*65536这个值应该是4位dword,而L为原树的低位,为word型,不能直接低位相加,因为可能产生进位。
80x86 CPU 的除法指令(如:DIV CX、DIV BL),都是有可能溢出的。
被除数较大,或除数较小,都可能使“商”超出预定位数,此时,就会溢出。
特别是当除数为零时,必然会出现:Divide overflow。
CPU 一旦执行出来除法溢出,系统就崩溃了。
所以,不要轻易的使用 DIV 指令,特别是数字不明确的时候。
在执行 DIV 指令之前,应该加以判断,以免发生溢出。
一般来说,当被除数的高位,小于除数时,就不会发生“溢出”。
-----------------------
其实,80x86 提供的 DIV 指令,并非是让你直接使用的。
你应该用它们,编写出来“不会溢出”的除法程序。
方法思路如下:
左图,是 CPU 执行 16 位数除以 8 位数时的操作。下面,就用这最简单的除法指令,实现较大数字除法操作。
在右图中,被除数有四个字节:1A 2B 3C 4DH,共有 32 位数。
除数,是一个字节:BL,仅有 8 位数。
很多学习汇编语言的人,包括高手,看到这里,就木了。
在他们的思维中,做较大数值的乘除法,就要用高档 CPU、高档的指令。
用最简单的 8 位数的除法,能做吗?
实际上,是可行的。
分四步 DIV,就可以得到四个字节的商,32 位数。
只要 BL 不为零,就绝对不会发生溢出。
按此思路,被除数的字节数,可以继续增加,仅受制于内存的大小。
这就是说:被除数,可以认为是无限的。
绝不限于王爽所介绍的 DIVDW 所用的四个字节。
王爽所编写的公式: X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N,也是一塌糊涂。
难以让人理解,也难以让人发挥现象力。
谢谢井小美
我学的这本书在目前这个章节还没学到adc的指令,而且不一定要进位,有可能进位有可能不进位。带进位的加是不是一定会在所得值上加1?
书本上现在默认用的是8086 cpu,eax暂时不能用。
有进位就加1,没进位就不加,双字求和如果不用32位加,只能用带进位加,没有其他方法
追问mov ax,word ptr [bx+4]
add word ptr [bx],ax ;第一步
mov ax,word ptr [bx+6]
adc word ptr [bx+2],ax ;此处的功能是判断第一步有没有进位?,有进位加1,没进位不加?
对的
追问MOV AX,FIRST1
ADD AX,SECONE1
这两句将两数的低位相加 两个低位相加可能进位了,如果 进位就会把标志寄存器的CF(进位标志位)改为1.
下次如果ADC AX,SECOND2
其实是AX,SECOND2,CF三个数相加(ADD仅仅是前两个),所以能实现进位
刚查了下,可能是前一步相加后如果有进位cf=1,没进位cf=0.这样实现进位,我理解的对吗?可是通过debug的r命令都看不到有cf寄存器。
汇编语言中如遇到两个dword型的数值相加,指令怎么写 我写了 add dword...
左图,是 CPU 执行 16 位数除以 8 位数时的操作。下面,就用这最简单的除法指令,实现较大数字除法操作。在右图中,被除数有四个字节:1A 2B 3C 4DH,共有 32 位数。除数,是一个字节:BL,仅有 8 位数。很多学习汇编语言的人,包括高手,看到这里,就木了。在他们的思维中,做较大数值的乘...
用汇编语言编写的两个浮点型数相加的代码
fld dword ptr [ecx+10]fadd dword ptr [edx+60]
汇编语言中,ADD BYTE PTR [BX], BYTE PTR [DI] 这句指令正确吗,如果错...
正确指令:mov ax,BYTE PTR [DI]add BYTE PTR [BX],ax 两个数据不能直接相加!!
汇编指令问题!
ADD DWORD PTR DS:[EAX],EAX ADD 加法指令 DWORD 双字 4个字节 标识取数据的长度,因为是一个指针,所以要给定数据的长度 PTR 就是point 指针 DS:[EAX] 在内存DS:[EAX]指向地址处取双字长的数据。DS:[EAX]前面的DS(这里叫段跨越前缀)代表EAX所指向的数据在数据段,[EAX]表示EAX寄存器的内容...
汇编语言题目:JMP DWORD PTR[BX]是什么寻址方式?
jmp指令的操作数为地址,表示指令指针IP无条件跳转到该地址,并运行该地址处的第一条指令。结合你这个例子,其中BX相当于一个指针变量,而[BX]则是指针变量所指向的内存数据,这里DWORD PTR操作符表明取双字数据,当然占有4字节的存储单元。举个例子:假如BX的值为ffffh,则[BX]指向双字数据10203h用图...
汇编语言题目:在条件转移指令当中:JMP DWORD PTR[BX]是什么寻址...
在汇编语言中,条件转移指令:JMP DWORD PTR[BX]是寄存器寻址方式。
微机原理小问题:sar dword ptr[bx]这条指令为什么不对?
都不对 第一条:没有用-BP的 第二条:两个操作数都是存储器操作数,8086不允许使用这种指令
汇编语言指令:JMP BYTE PTR [BX]错在哪儿
实际执行效果是修改IP的值。由于BYTE PTR使得BX指向的数据为字节类型,而IP为字类型,数据类型不匹配,故该指令不正确。指令的正确写法可以是jmp word PTR [BX],此时将BX指向的字类型数据赋给IP;或者jmp dword ptr [BX],该指令把BX所指向的双字类型数据的高位字赋给CS,低位字赋给IP。
汇编问题INC WORD PTR[BX]这句WORD什么意思啊
INC WORD PTR[BX]的操作数寻址方式是基址寻址,基址寄存器BX所指定的操作数类型不确定,而指令要求必须是明确的。此处“WORD”表示操作数类型是一个字(双字节)。
汇编add byte ptr ds:[eax],al是什么意思?
这两个问题,在机器指令中必须给以明确或隐含的说明,否则计算机就无法工作.在这里,你是要加AL寄存器中的内容加到内存存储单元中去,但计算机不知道要用多大的空间来存储它,所以要加上 byte ptr ,明确告诉计算机我们要用一个字节的空间来存放它![eax]就是把eax中存放的数据作为一个偏移地址EA 综合起来...