2012-07-18 58 views
1
.MODEL SMALL 
.STACK 64 
.DATA 

MSGA DB 13,10,"Input first number: ","$" 
MSGB DB 13,10,"Input second number:","$" 
MSGC DB 13,10,"The quotient is: ","$" 
MSGD DB 13,10,"The modulo is: ","$" 

NUM1 db ? 
NUM2 db ? 

.CODE 

MAIN PROC NEAR 

MOV AX, @DATA 
MOV DS, AX 

; get first number 
LEA DX, MSGA 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV BL, AL 

; get second number 
LEA DX, MSGB 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV CL, AL 
MOV AL, BL 

; divide 
DIV CL 
MOV NUM1, AL 
ADD NUM1, '0' 
MOV NUM2, AH 
ADD NUM2, '0' 

; output quotient 
LEA DX, MSGC 
MOV AH, 09h 
INT 21h 

MOV DL, NUM1 
MOV AH, 02H 
INT 21h 

; output remainder/modulo 
LEA DX, MSGD 
MOV AH, 09h 
INT 21h 

MOV DL, NUM2 
MOV AH, 02H 
INT 21h 

MOV AH, 4Ch 
INT 21h 

MAIN ENDP 
END MAIN 

我是彙編語言的新手,我遇到了DIV操作的問題。如何在程序集中使用DIV操作

如果將1位數字分成1位數字,則應輸出商數和餘數。我的代碼有什麼問題?

+0

我的代碼運行,但輸出一個不同的價值。我將如何做到這一點?請解釋一下,我是裝配新手。 – 2012-07-18 14:10:23

回答

4

使用DIV指令的8位除法需要AX作爲除數和除數的操作數。

我糾正了代碼的部分和堆棧大小。堆棧大小應至少爲1000,否則由於堆棧存儲不足,程序可能會崩潰。以下是代碼。你在你的程序做了

.MODEL SMALL 
.STACK 2000 
.DATA 

MSGA DB 13,10,"Input first number: ","$" 
MSGB DB 13,10,"Input second number: ","$" 
MSGC DB 13,10,"The quotient is: ","$" 
MSGD DB 13,10,"The modulo is: ","$" 

NUM1 db ? 
NUM2 db ? 

.CODE 

MAIN PROC NEAR 

MOV AX, @DATA 
MOV DS, AX 

; get first number 
LEA DX, MSGA 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV BL, AL 

; get second number 
LEA DX, MSGB 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV CL, AL 

; divide 
MOV AH, 0 ; prepare dividend 
MOV AL, BL 
DIV CL 
MOV NUM1, AL 
ADD NUM1, '0' 
MOV NUM2, AH 
ADD NUM2, '0' 

; output quotient 
LEA DX, MSGC 
MOV AH, 09h 
INT 21h 

MOV DL, NUM1 
MOV AH, 02H 
INT 21h 

; output remainder/modulo 
LEA DX, MSGD 
MOV AH, 09h 
INT 21h 

MOV DL, NUM2 
MOV AH, 02H 
INT 21h 

MOV AH, 4Ch 
INT 21h 

MAIN ENDP 
END MAIN 
+0

謝謝你。現在我會研究你的代碼。 – 2012-07-18 17:15:44

+0

我會努力做出我自己的模函數。謝謝 – 2012-07-18 17:49:02

+0

從[Intel](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/)網站獲取_Basic Architecture_和所有_Instruction Set Reference_文檔。它們必須適用於所有x86/64彙編程序員。 – Jay 2012-07-18 23:14:52

1
.MODEL SMALL 
.STACK 100H 
.DATA     
    CF EQU 0DH 
    LF EQU 0AH 

     ; Data Definition Starts Here 

      msg11 db   '     Enter Divisor (0 - 9) : $' 
      msg12 db cf,lf, '     Enter Dividend (0 - 9) : $' 
      msg13 db cf,lf,  '      The Quotient is : $' 
      msg14 db cf,lf,  '      ! Division is Impossible ! $' 
      e db ? 
      f db ? 

     ; Data Definition Ends Here 

      msgch1 DB CF,LF,CF,LF,CF,LF,   '    ******************************************* : $ ' 
      msgch2 DB CF,LF,   '    * Press [ 1 | 0 ] To [ Continue | Exit ] * $ ' 
      msgch3 DB CF,LF,   '    ******************************************* : $ ' 
.CODE 

    MAIN PROC  
     MOV AX,@DATA     
     MOV DS,AX     

    divp: 
     mov ah,0 
      mov al,3 
      int 10h 

     MOV AX,0600h   
     MOV BH,71H    
     MOV CX,0000H   
     MOV DX,184FH 
     INT 10H 

     ; Program Starts Here 


      MOV AH,9      
      LEA DX,MSG12     
      INT 21H     

      MOV AH,1 
      INT 21H  
      MOV f,AL   
      INT 21H 

      MOV AH,9      
      LEA DX,MSG11     
      INT 21H     

      MOV AH,1 
      INT 21H  
      MOV e,AL   
      INT 21H 

      mov dl,e   
      mov bl,f 

      mov al,31h  

      cmp dl,30h 
      jle div2 

      cmp bl,30h 
      jle div4 

      cmp dl,bl 
      jnle div2 

     div1: 
      sub bl,e 
      add bl,30h 

      cmp bl,30h 
      jle div3 

      add al,31h 
      add al,-30h 

      jmp div1 

     div2: 
      mov ah,9 
      lea dx,msg14 
      int 21h 

      jmp divf   

     div3: 

      mov ah,9 
      lea dx,msg13 
      int 21h 

      mov ah,2 
      mov dl,al 
      int 21h 

      jmp divf 

     div4: 

      mov ah,9 
      lea dx,msg13 
      int 21h 

      mov ah,2 
      mov dl,30h 
      int 21h 

      jmp divf 


     divf: 


     ; Program Ends Here 


     ; Repitition Loop Starts Here 

      MOV AH,2     
      mov dl,0ah    
      INt 21h 

      MOV AH,9     
      LEA DX,msgch1    
      INT 21H 

      MOV AH,9     
      LEA DX,msgch2    
      INT 21H 

      MOV AH,9     
      LEA DX,msgch3    
      INT 21H 

      MOV AH,1 
      INT 21H 
      MOV BL,AL 
      INT 21H 

      CMP BL,31H 

      jl divlp 
      jg divlp 

      jmp divp   

     divlp: 

     ; Repitition Loop Ends Here 

     mov ah,0 
      mov al,3 
      int 10h  

     MOV AH,4CH 
     INT 21H   
     MAIN ENDP  
END MAIN 
1

一切都是正確的,除了一個。除法操作使用了AX寄存器。如果您僅使用AL進行分割,則必須先清除AH寄存器,這是極其必要的。如果AH中存有預先值,AX寄存器將包含該值,AX的最終值將與您期望的不同:)

此外,如果您不使用跳轉,呼叫,推送或流行,它是不需要使用堆棧段,所以你可以刪除它:)

來源:經驗

這裏是在註釋中所做的更改代碼:

.MODEL SMALL 
.DATA 

MSGA DB 13,10,"Input first number: ","$" 
MSGB DB 13,10,"Input second number:","$" 
MSGC DB 13,10,"The quotient is: ","$" 
MSGD DB 13,10,"The modulo is: ","$" 

NUM1 db ? 
NUM2 db ? 

.CODE 

MAIN PROC NEAR 

MOV AX, @DATA 
MOV DS, AX 

; get first number 
LEA DX, MSGA 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV BL, AL 

; get second number 
LEA DX, MSGB 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

;//CHANGES MADE HERE 
MOV AH, 00h ;Div operation requires AX register, if you are using only al, ah must be clear 
;//END CHANGES 

MOV CL, AL 
MOV AL, BL 

; divide 
DIV CL 
MOV NUM1, AL 
ADD NUM1, '0' 
MOV NUM2, AH 
ADD NUM2, '0' 

; output quotient 
LEA DX, MSGC 
MOV AH, 09h 
INT 21h 

MOV DL, NUM1 
MOV AH, 02H 
INT 21h 

; output remainder/modulo 
LEA DX, MSGD 
MOV AH, 09h 
INT 21h 

MOV DL, NUM2 
MOV AH, 02H 
INT 21h 

MOV AH, 4Ch 
INT 21h 

MAIN ENDP 
END MAIN 
相關問題