2014-10-31 6 views
-2

두 개의 미리 지정된 값을 함께 더하고 결과를 생성하고 싶습니다. 현재 내 코드에서 수행하는 작업은 16과 6을 함께 사용하여 22를 출력하는 것입니다. 그러나 2를 인쇄 중입니다 ...이 문제를 해결하는 방법을 잘 모르겠습니다 ...두 자리 숫자를 추가하여 두 자리 숫자로 만들기

여기에 있습니다. 당신이 정말로 단지 (제목에서 알 수 있듯이) 두 자리 진수 번호를 얻고 싶다면

data segment       ; data segment. Keyword db means define byte. You can also define word (dw) 
     numA db 16     ;Define first variable 
     numB db 06     ;Define second variable 
     StrMsg db 'The answer is $' ;return message to the user 
     leng db 1     ;length of the charachters - this value will be overwritten 
data ends 

             ; stack segment 
stack1 segment stack  
     db 100 dup(?)     ; This is the stack of 100 bytes 
stack1 ends 


code segment 
     assume cs:code, ds:data, ss:stack1 

start: 
             ;Perform initialization 
     mov ax, data     ;Put the starting address of the data segment into the ax register (must do this first) 
     mov ds, ax      ;Put the starting address of the data segment into the ds register (where it belongs) 

     mov ax, stack1     ;Put the starting address of the stack into the ax register (must do this first) 
     mov ss, ax      ;Put the starting address of the stack segment into the ss register (where it belongs) 

mov al, numA  ;move numA to ax 
    add al, numB  ;ax contains numa + numb 
    mov dl, al   ;move result to dl for display      

    lea dx, StrMsg  ;load message to display the result to the user 
    mov ah, 9h   ;display string subroutine 
    int 21h    ;interrupt for MS-DOS routine 

    add dl, 30h   ;Add 30h for ASCII table offset 
    mov ah, 2h   ;Store interrupt code in ah to display results in dl 
    int 21h    ;display character in dl as translated by ascii code 

mov ah, 4ch      ;Set up code to specify return to dos 
     int 21h       ;Interpt number 21 (Return control to dos prompt) 

code ends 

end  start 
+0

1 문자 만 인쇄하므로 놀랄 필요가 없습니다. 두 자리 숫자를 처리하려면 수십 개와 수십자를 서로 인쇄해야 할 수 있습니다. 초등학교 수학에 따라, 그것은 몫이고 나머지는 10으로 나눈 것입니다. – Jester

+0

사용하는 어셈블러에 대한 태그를 추가하십시오 ([tasm] 또는 [masm]). – rkhb

답변

0

, 당신이 사용할 수있는 AAM :

data segment       ; data segment. Keyword db means define byte. You can also define word (dw) 
     numA db 16     ;Define first variable 
     numB db 06     ;Define second variable 
     StrMsg db 'The answer is $' ;return message to the user 
     leng db 1     ;length of the charachters - this value will be overwritten 
data ends 

             ; stack segment 
stack1 segment stack 
     db 100 dup(?)     ; This is the stack of 100 bytes 
stack1 ends 


code segment 
     assume cs:code, ds:data, ss:stack1 

start: 
         ;Perform initialization 
    mov ax, data  ;Put the starting address of the data segment into the ax register (must do this first) 
    mov ds, ax   ;Put the starting address of the data segment into the ds register (where it belongs) 

    mov ax, stack1  ;Put the starting address of the stack into the ax register (must do this first) 
    mov ss, ax   ;Put the starting address of the stack segment into the ss register (where it belongs) 

    lea dx, StrMsg  ;load message to display the result to the user 
    mov ah, 9h   ;display string subroutine 
    int 21h    ;interrupt for MS-DOS routine 

    mov al, numA  ;move numA to al 
    add al, numB  ;al contains numa + numb 

    lea di, StrMsg  ; Place for target string (The old value of StrMsg isn't used anymore) 
    aam     ; AL => AH (first dec. digit) AL (second dec. digit) (unpacked BCD) 
    or ax, 3030h     ; Convert both digits to ASCII 
    mov BYTE PTR [di], ah  ; Store first digit 
    mov BYTE PTR [di+1], al  ; Store second digit 
    mov BYTE PTR [di+2], '$'  ; Store termination character for 'int 21h fn 09h' 

    lea dx, StrMsg  ;load message to display the result to the user 
    mov ah, 9h   ;display string subroutine 
    int 21h    ;interrupt for MS-DOS routine 

    mov ah, 4ch   ;Set up code to specify return to dos 
    int 21h    ;Interpt number 21 (Return control to dos prompt) 

code ends 

end  start 

당신은 또한 원하는 경우 코드는 3 자리 10 진수를 얻으면 두 부분으로 숫자를 분리 할 수 ​​있습니다. 먼저 100으로 나누면 첫 번째 숫자가 결과로 나타납니다. 그런 다음 10 나머지를 분할하고 세 번째 자리가 나머지에있는 동안 당신은 두 번째 자리를 얻을 : 당신이 선행 0에 의해 방해하는 경우

data segment       ; data segment. Keyword db means define byte. You can also define word (dw) 
     numA db 16     ;Define first variable 
     numB db 06     ;Define second variable 
     StrMsg db 'The answer is $' ;return message to the user 
     leng db 1     ;length of the charachters - this value will be overwritten 
data ends 

             ; stack segment 
stack1 segment stack 
     db 100 dup(?)     ; This is the stack of 100 bytes 
stack1 ends 


code segment 
     assume cs:code, ds:data, ss:stack1 

start: 
         ;Perform initialization 
    mov ax, data  ;Put the starting address of the data segment into the ax register (must do this first) 
    mov ds, ax   ;Put the starting address of the data segment into the ds register (where it belongs) 

    mov ax, stack1  ;Put the starting address of the stack into the ax register (must do this first) 
    mov ss, ax   ;Put the starting address of the stack segment into the ss register (where it belongs) 

    lea dx, StrMsg  ;load message to display the result to the user 
    mov ah, 9h   ;display string subroutine 
    int 21h    ;interrupt for MS-DOS routine 

    mov al, numA  ;move numA to ax 
    add al, numB  ;ax contains numa + numb 
    mov dl, al   ;move result to dl for display 

    lea di, StrMsg  ; Place for target string (The old value of StrMsg isn't used anymore) 
    call al2dec 

    lea dx, StrMsg  ;load message to display the result to the user 
    mov ah, 9h   ;display string subroutine 
    int 21h    ;interrupt for MS-DOS routine 

    mov ah, 4ch   ;Set up code to specify return to dos 
    int 21h    ;Interpt number 21 (Return control to dos prompt) 

al2dec PROC    ; Args: AL register to convert, DS:DI pointer to target string 
    mov bl, 100 
    xor ah, ah   ; Clear AH for division 
    div bl    ; AL = AX/BL remainder AH 
    or al, 30h   ; Convert result to ASCII 
    mov BYTE PTR [di], al  ; Store as first digit 

    shr ax, 8   ; Shift remainder into AL, clear AH 
    mov bl, 10 
    div bl    ; AL = AX/BL remainder AH 
    or al, 30h   ; Convert result to ASCII 
    mov BYTE PTR [di+1], al  ; Store as second digit 

    or ah, 30h   ; Convert remainder to ASCII 
    mov BYTE PTR [di+2], ah  ; Store as third digit 

    mov BYTE PTR [di+3], '$'  ; Store at last termination character for 'int 21h fn 09h' 
    ret 
al2dec ENDP    ; DS:DI contains string with decimal digits 

code ends 

end  start 

, 당신은 반복적으로 나누어 반대 순서로 숫자를 분리 할 수 ​​있습니다 10. 더 큰 숫자를 변환하려는 경우 가장 많이 사용되는 방법입니다.

al2dec PROC       ; Args: AL register to convert, DS:DI pointer to target string 
    mov bl, 10      ; Base 10 -> divisor 
    xor cx, cx      ; CX=0 (number of digits) 

    al2dec_loop_1:     ; 1st loop 
    xor ah, ah      ; Clear AH for division (don't forget it!) 
    div bl       ; AL = AX/BL Remainder AH 
    push ax       ; Push remainder for LIFO in Loop_2 
    add cl, 1      ; Equivalent to 'inc cl' 
    test al, al      ; AL = 0? 
    jnz al2dec_loop_1    ; No: once more 
    al2dec_loop_2:     ; 2nd loop 
    pop ax       ; Get back pushed digits 
    or ah, 00110000b    ; Conversion to ASCII 
    mov BYTE PTR [di], ah     ; Store only AH to [DS:DI] (DI is a pointer to a string) 
    add di, 1 
    loop al2dec_loop_2    ; Until there are no digits left 

    mov BYTE PTR [di], '$'     ; Store termination character for 'int 21h fn 09h' 
    ret        ; Ret: DS:DI contains decimal '$'-terminated ASCII-String 
al2dec ENDP 
관련 문제