2016-05-12 16 views
0

アセンブリコードに問題があります。このコードをデバッグするたびに、ディビジョンオーバーフローは常にエラーです。 AXの値が2桁のみの場合、コードはスムーズに実行されます。アセンブリ言語 - ディビジョンオーバーフロー(4桁)

4桁の値で除算を行うには、どのような変更が必要ですか?ありがとう。あなたが行うと

ASSUME DS:DATA, CS:CODE 

    DATA SEGMENT 

    X  DW   0 

    Y  DW   ? 

    s  DB   "The aswer is", 0 

    Z  DW   4 

    DATA ENDS  
    CODE SEGMENT 

    MAIN PROC 

    MOV DS:[Y],23 
    MOV AX,[Y] 
    ADD AX,4556 
    MOV [X],AX 
    PUSH[X] 
    CALL WRITE 
    POP[X] 

    MOV AH,4CH 
    INT 21H 

    MAIN ENDP 

    WRITE PROC 

    PUSH BP 
    MOV BP,SP 

    MOV AX,0B800H 
    MOV ES,AX 
    MOV ES,AX 
    MOV DI,5*160 

    MOV AX,[BP+4] 
    MOV BL,10 
    DIV BL 
    ADD AL,'0' 
    STOSB 

    XCHG AH,AL 
    ADD AL,'0' 
    STOSB 
    MOV AL, 00001111B 
    STOSB 

    POP BP 
    RET 
    WRITE ENDP 

    CODE ENDS 
    END  MAIN 
+0

alとahを同時に実行するには、 'ax、 '00''(または' 3030h')を追加できます。次に、それらを一度に格納するために 'stosw'することができます。そして、最初に 'AL'に値を入れるのではなく' movバイトptr [di]、00001111B'を実行することができます。 –

答えて

3

DIV r/m8(例えばDIV BL)商はALに保存されますので、商が255以上である場合には、分割オーバーフローを取得します。

あなたは、65536に商を扱うことができる(は含まない)ことDIV r/m16を使用する場合:

XOR DX, DX ; DIV r/m16 divides the 32-bit value DX:AX by the divisor, so we need to clear DX 
MOV BX, 10 
DIV BX 
; The quotient is now in AX, and the remainder in DX 

は、さらに大きな商を扱うDIV r/m32DIV r/m64を使用できるようにします。インテルの命令セットリファレンスでそれらを調べるための練習として残しておきます。