【发布时间】:2011-11-01 01:51:48
【问题描述】:
我不确定cbw 命令的实际作用。我有一段代码:
mov ax,0FF0h
cbw
idiv ah
cbw后ax值如何变化?
【问题讨论】:
-
在 Intel 或 AMD 的 ISA 参考手册的任何副本中查找它:felixcloutier.com/x86/CBW:CWDE:CDQE.html。另请参阅 When and why do we sign extend and use cdq with mul/div? 和 What does cltq do in assembly? 以获取 cbw / cwde / cwd / etc. 等价的 movsx 表,适用于 Intel 和 AT&T 语法。
-
在符号扩展到 AX 之后除以
AH非常奇怪。对于非负 AL,它将出错(因为 AH=0),或者对于负 AL,它将除以-1。 (在 AL=80h 时再次使用#DE出错,因为 -128 / -1 = +128 会溢出 8 位 AL。)这就像获取 AL 绝对值的最糟糕最低效的尝试。 -
@PeterCordes
cbw,cwde,cdqe这三个都使用相同的操作码。那么处理器如何选择al->ax、ax->eax、eax->rax?cwd、cdq、cqo三元组相同。 -
@SouravKannanthaB:前缀,与其他 16/32/64 位操作码完全一样。您甚至可以在我的第一条评论What does cltq do in assembly? 中链接的答案中看到完整的机器代码,包括所有这些指令的前缀。前缀详情见Is there a default operand size in the x86-64 (AMD64) architecture?
标签: assembly x86 division sign-extension