-1

我在尝试在汇编程序中解决这个表达式时遇到了一些问题。

`$`z=(5*a-b/7)/(3/b+a*a) 

我想知道如何将一个字转换为双字(无符号解决方案),
我必须使用 cwb 命令还是使用AX:BX,如果我必须使用那些最后的寄存器,
我如何正确编写命令?

我将在 DosBox 下的 Turbo Debugger 中测试代码。我的完整代码

assume cs:code,ds:data 
data segment
;
a db ?
b db ?
rez dw ?
;
data ends
;
code segment
;
mov ax,data
mov ds,ax
;
;
;#####prima paranteza
;
mov al,a    ;ah=a
mul 5       ;ax=a*5
mov cx,ax   ;cx=ax
mov ah,b    ; il mut pe ah in b  ( pregatire pt conversie fara semn )
mov al,0    ; l-am convertit pe b in word ( pe 2 octeti )
div 7       ; am impartit double word-ul b la 7 , catul a ramas in ah , restul a ramas in al 
sub cx,ax   ; (am tinut cont de faptul ca in ax a ramas rezultatul dupa impartire )  , cx=cx-ax, a*5 - b/7
;
; ####a 2 a paranteza
;
mov ah,3    
mov al,0    ; conversie de la b la w  ( fara semn )
div b       ; ax=3/b
mov bx,ax   ; bx = ax
mov al,a    
mul a       ; ax = a * a 
add ax,bx   ; ax = ax + bx
;
;
; #### calcul final 
mov bx,ax   ; bx = ax ( rezultatul celei de a 2 a paranteze )
mov ax,cx   ; ax = cx ( rezultatul primei paranteze )
4

4 回答 4

1

字转双字?

让我们看看我是否得到你:

字 -> 8 位
双字 -> 16 位

AX、BX、CX 和 DX 是 16 位寄存器,它们由另外两个 8 位寄存器 [ABCD]H 和 [ABCD]L 组成,因此,AX 为:

啊 AL
|0|0|0|0|0|0|0|0| - |0|0|0|0|0|0|0|0|

当您使用 AX 时,您同时使用这两个。因此,如果要将一个字转换为双字,只需清除整个 [ABCD]X 寄存器,然后将您的字移动到 [ABCD]L 寄存器,留下字值 [ABCD]X。

干杯

于 2012-11-06T00:39:06.747 回答
0

好吧,最坏的情况是将双字清零,然后将该字复制到双字的较低部分(前 0-x 位/我的汇编器生锈)。我承认可能有更有效的方法来做到这一点

于 2012-11-05T13:55:41.560 回答
0

首先,变量的范围是多少?它们都是未签名的(还是其中一些已签名)?

第二,你需要什么样的精度;以及这如何影响由于整数除法的舍入而导致的精度损失?

第三,性能有多重要?内存使用有多重要?

第四,有哪些“CPU 类型”约束?是“仅 8086”(不能使用 32 位寄存器)还是“80386 或更高版本”(可以在 16 位代码中使用 32 位寄存器)?你可以使用浮点数和 FPU 吗?

根据以上所有内容,生成的代码可能如下所示:

; Assumes a ranges from 0 to 7
; Assumes b ranges from 1 to 1234
; Assumes 80386 or later
; Note: requires a pre-computed 19728-byte lookup table

    movzx eax,word a
    movzx ebx,word b
    lea eax,[0xFFFFFFF8 + ebx*8+eax]
    mov ax,[myTable + eax*2]

当然,根据上述所有内容,生成的代码也可能完全不同......

于 2012-11-05T15:33:08.230 回答
0

通常它会在 16 位模式下使用 DX:AX 完成。您可以使用 CWD 将 AX 签名扩展为 DX,或者您可以只清除 DX。

于 2012-11-05T15:49:06.907 回答