mul我遇到這個問題,要求我在不使用任何or指令的情況下將 BX 乘以 42 div,大概是通過使用shlor shr。也要求分5行來做。
你是怎么做到這種事的?
我沒有嘗試任何東西,但上面的要求是在 1 行中將 BX 乘以 32,所以我只使用SHL BX, 5.
uj5u.com熱心網友回復:
因子42(十進制)等于00101010(二進制),在此表示法中 1 的順序為 1、3、5,因此結果將為
2 1 * N 2 3 * N 2 5 * N = 42 * N。
該代碼假定 CPU Intel 186 或更高,并且加載了 N 因子BX;產品也被退回BX。
不幸的是,它需要 6 條指令,我沒能省下一行。
SHL BX,1 ; BX=2*N
MOV AX,BX ; AX=2*N
SHL BX,2 ; BX=8*N
ADD AX,BX ; AX=2*N 8*N
SHL BX,2 ; BX=32*N
ADD BX,AX ; BX=2*N 8*N 32*N = 42*N
uj5u.com熱心網友回復:
具有6行并可以在 emu8086 上運行的三個解決方案,因為該仿真器確實允許按立即計數進行移位,這與真正的 8086 CPU 所允許的相反!
輸入 BX = N
shl bx, 1 ; BX = N * 2
mov ax, bx ; AX = N * 2
shl bx, 2 ; BX = N * 8
add bx, ax ; BX = N * 10
shl bx, 2 ; BX = N * 40
add bx, ax ; BX = N * 42
mov ax, bx ; AX = N
shl bx, 2 ; BX = N * 4
add ax, bx ; AX = N * 5
shl bx, 2 ; BX = N * 16
add bx, ax ; BX = N * 21
shl bx, 1 ; BX = N * 42
但上述要求是在 1 行中將 BX 乘以 32
mov ax, bx ; AX = N
shl bx, 5 ; BX = N * 32
shl ax, 1 ; AX = N * 2
add bx, ax ; BX = N * 34
shl ax, 2 ; AX = N * 8
add bx, ax ; BX = N * 42
相關匯編 8086 不使用 MUL 乘以 41
uj5u.com熱心網友回復:
只有 4 行的開箱即用解決方案是
xor ax,ax
mov cx,42
a: add ax,bx
loop a
否則,常用方法包括使用常量 42 = 0b101010 的二進制表示形式進行移位和加法,以及 Booth 的編碼(將 1 的序列(例如 0b11110 轉換為一次移位和一次減法 0b100000 * A - 0b10 * A)。此外,可以分解出常量42 = 2*3*7,這將導致 7A*6,這可以作為 (A<<3 - A)*6 完成,但是這也需要 6 條指令。
人們可能會利用AAD具有未定義行為的指令,該指令可用于將一個 8 位值乘以另一個編碼為立即數的 8 位值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/533858.html
