2012-07-18 3 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

내 코드 실행되지만 출력 : 경험 여기

의견 변경에 코드입니다 : 나 팝, 당신이

는 소스가 :) 삭제할 수 있도록 스택 세그먼트를 사용 할 필요가 다른 가치. 나는 그것을 어떻게 할 것인가? 설명해주십시오, 저는 새로운 어셈블리입니다. 덕분에 –

답변

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

. 이제 코드를 공부하겠습니다. –

+0

나는 이것으로 내 자신의 모듈러스 기능을 만들 것이다. 감사합니다 –

+0

[Intel] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/) 웹 사이트에서 _Basic Architecture_ 및 모든 _Instruction Set Reference_ 문서를 가져옵니다. 그들은 모든 x86/64 어셈블리 프로그래머를 위해 있어야합니다. – Jay

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 
관련 문제