2014-10-31 7 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 

Если вы хотите получите трехзначный десятичный номер, вы можете выделить цифры двумя делениями. Сначала разделите на 100, и вы получите первую цифру в качестве результата. Затем разделите остаток на 10 и вы получите вторую цифру, а третья цифра в остатке:

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 
Смежные вопросы