整数运算全解析:从基础到高级应用
1. 有符号整数除法
有符号整数除法与无符号除法非常相似,但有一个重要区别:在进行除法之前,被除数必须进行符号扩展。符号扩展是指将一个数的最高位复制到其所在变量或寄存器的所有高位。
1.1 符号扩展的必要性
以下代码展示了不进行符号扩展时的错误结果:
.data
wordVal SWORD -101 ; 009Bh
.code
mov eax,0 ; EAX = 00000000h
mov ax,wordVal ; EAX = 0000009Bh (+155)
mov bx,2 ; EBX is the divisor
idiv bx ; divide EAX by BX (signed operation)
在上述代码中,EAX 中的 009Bh 实际上等于 +155,而不是 -101,因此除法产生的商是 +77,这不是我们想要的结果。
正确的做法是使用 CWD 指令(将字转换为双字)在进行除法之前将 AX 符号扩展到 EAX:
.data
wordVal SWORD -101 ; 009Bh
.code
mov eax,0 ; EAX = 00000000h
mov ax,wordVal ; EAX = 0000009Bh (+155)
cwd ; EA
超级会员免费看
订阅专栏 解锁全文
3505

被折叠的 条评论
为什么被折叠?



