-1

アセンブラでこの式を解決しようとすると、いくつか問題が発生します。

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

単語をダブルワードに変換する方法(符号なしソリューション)を知りたいのです
が、cwbコマンドを使用する必要がありますか、それともAX:BX最後のレジスタを使用する必要がある場合は
、コマンドを正しく記述する方法を使用しますか? ?

DosBoxの下のTurboDebuggerでコードをテストします。私の完全なコード

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ビットレジスタであり、他の2つの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を使用する場合は、これら2つを同時に使用しています。したがって、ワードをダブルワードに変換する場合は、[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 に答える