assembly - 这是在 Mul 中使用 cbw 的正确方法吗?
问题描述
我从 8bit 和 8bit 寄存器中得到乘法。但是,当你有一个 16 位和一个 8 位时,我们如何在乘法之前进行转换:
问题:需要提供260*19的代码片段,并打印结果。我做了:
mov Ax,260
mov Al,19
cbw;
Mul Ax
PutInt Ax
解决方案
mov Ax,260 mov Al,19
AL
寄存器是寄存器的最低半部分AX
。
AX
/-----------------\
MSB xxxx xxxx xxxx xxxx LSB
\-------/ \-------/
AH AL
因此,第二条指令mov al, 19
错误地覆盖了您的第一个数字。
Mul Ax
字节大小的mul
指令将AL
寄存器乘以指定的字节大小的操作数。
字长mul
指令将AX
寄存器乘以指定的字长操作数。
使用mul ax
then 会计算AX * AX
,这不是你想要的。你想乘以不同的数字。
AX
与另一个寄存器一起使用可以BX
解决这两个问题。
如何处理这cbw
取决于我们如何看待代码。
如果您将数字用作立即数 (260, 19),那么即使对于小数字 19,也只需使用字大小的寄存器:
mov bx, 260 mov ax, 19 mul bx ; Product AX * BX is in DX:AX but here DX=0 PutInt ax
甚至让汇编器做乘法:
mov ax, 260 * 19 PutInt ax
如果数字来自内存(不同大小的变量),那么您需要扩展较小的数字。
无符号数,
mul
用于无符号乘法mov bx, wNum ; [0,65535] mov al, bNum ; [0,255] mov ah, 0 mul bx ; Product AX * BX is in DX:AX PutInt ax
我建议不要
cbw
在这种情况下使用!使用cbw
会削弱 128 以上的所有数字。有符号数,
imul
用于有符号乘法mov bx, wNum ; [-32768,32767] mov al, bNum ; [-128,127] cbw imul bx ; Product AX * BX is in DX:AX PutInt ax
cbw
是从 扩展有符号字节的正确选择AL
。
推荐阅读
- python - 如果搜索'beautiful soup',不存在的值怎么表示为“”?
- php - 如何将 laravel 查询转换为 sql 查询?
- ios - 当日期从 31 变为 01 时,如何使 UIDatePicker 自动更改月份?
- typescript - Playwright UnhandledPromiseRejectionWarning: TypeError: this.page.click is not a function
- python - Flask 应用程序:添加条件以检查 html 模板文件中的环境
- javascript - Firebase 身份验证后将用户重定向到特定 URL
- jmeter - (远程JMeter5.4.1):java.rmi.ConnectException:连接拒绝主机:127.0.0.1
- plot - 如何在 TradingView PineScript 中为特定日期时间添加箭头
- java - 使用 DELETE 语句截断不正确的 DOUBLE 值
- lstm - 编码器解码器 LSTM