2012-11-05 37 views
-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) 
+0

順便說一句,我會指定的CPU架構,儘管這看起來像x86彙編 –

+0

什麼是您的規範說的?你想在哪個寄存器對中表達結果?無論如何,答案只是爲了清除上半部分。 (例如,xor dx,dx) –

+0

如果您有Turbo Debugger,那麼您也有Turbo C.在C中編寫表達式,然後使用調試器查看生成的機器代碼。下一步是然後**不**轉換該代碼,但只是調用它。 –

回答

1

單詞到雙字?

讓我們來看看,如果我得到你:

字 - > 8位
雙字 - > 16位

AX,BX,CX和DX是16位寄存器,它們通過其他兩個形成8位寄存器[ABCD] H和[ABCD] L,所以,AX將是:

  AH                                           AL
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

當您使用AX時,您正在同時使用這兩個。因此,如果要將單詞轉換爲雙字,只需清除整個[ABCD] X寄存器,然後將單詞移至[ABCD] L寄存器,並將[ABCD] X保留爲字值。

乾杯

+0

謝謝:),並感謝你們幫助我。 –

0

好了,最壞的情況將是零出雙字,然後字複製到下部(第一個0-X位/我的彙編生鏽)的雙字。可能有更高效的方法來做到這一點,我承認

+0

在給定的體系結構中沒有雙字,因此它是實現特定的,哪個寄存器被認爲是高位字。 –

+0

@ Aki Suihkonen:唯一的規格是我必須爲該表達提供一個工作解決方案。 @Joe Plante:我正在理解你剛纔所說的內容,並將其轉換爲ASM代碼,謝謝。 –

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] 

當然取決於所有生成的代碼上面可能是完全不同的太...

0

常它將在DX:AX 16位模式下完成。您可以使用CWD將AX擴展到DX,或者您可以清除DX。