2016-07-05 8 views
0

어셈블리 x8086에서 두 개의 16 진수를 합산하려고합니다. 십진법을 합하는 방법을 안다. 누군가 그걸하는 법을 보여줄 수 있습니까? 여기 내 코드입니다 : 마가렛 꽃에 의해 제안어셈블리에서 두 개의 16 진수를 더하는 방법

ADD CL, BL ; CL and BL have the one digit numbers 
    MOV AL, CL 
    MOV AH, 0 
    AAA  
    ADD AX, 3030H 

    MOV BX, AX  
    mov dl, bh  
    call mostrarchar 
    mov dl, bl  
    call mostrarchar 
    int 20H 

Nomeprog ENDP 

mostrarchar proc near 
mov AH, 02h 
int 21h 
ret 
mostrarchar endp 
+0

레지스터 비트를 유지합니다. 기본 2. 16 진수는 직접 기본 10을 변환하는 기본 16이며, 전혀 변환하지 않습니다. 어셈블러는이를 바이너리로 변환해야합니다. 16 진수를 사용하는 것과 마찬가지로 귀하를 위해 변환합니다. 당신은 당신이 어떻게 다른 사람을하는지를 안다. –

+0

실제로 코드를 작성 했습니까? –

+0

BCD 또는 Binary에 숫자가있는 경우 어떻게 16 진수로 표시합니까? –

답변

2

, 당신은 숫자가 작거나 같은 9 (이 숫자입니다)하는 것입니다 때를 감지하기 위해 PROC mostrarchar 필요 수는 9 (그것의보다 큰 경우 편지, 10..15 = 'A'.. 'F'), 예 :

mov dl, 8  
    call mostrarchar ;DISPLAY '8'. 

    mov dl, 15 
    call mostrarchar ;DISPLAY 'F'. 

mostrarchar proc 
    cmp dl, 9 
    jbe digit ;IF (DL <= 9) 
;IT'S A LETTER (10..15 = 'A'..'F'). 
    add dl, 37h ;DL+55.  
    jmp display ;SKIP "DIGIT:". 
digit: 
    add dl, 30h ;DL+48. 
display: 
    mov ah, 02h 
    int 21h 
    ret 
mostrarchar endp 

이전 코드는 한 자릿수 만 작동합니다. 더 큰 숫자의 경우 숫자가 0이 될 때까지 숫자를 기본 (경우에 따라 16 진수)으로 여러 번 나누어야합니다. 각 나머지는 한 자릿수입니다. 을 호출하면 각 16 진수가 표시됩니다 (예 :

).
mov ax, 15729 
    call mostrarnum ;DISPLAY '3D71'. 

mostrarnum proc 
;CONVERT NUMBER TO HEX. 
    mov bp, 16  ;BASE. 
    mov cx, 0  ;REMAINDERS COUNTER. 
divisions:     
    mov dx, 0 
    div bp   ;DX:AX ÷ 16. 
    push dx   ;PUSH REMAINDER. 
    inc cx   ;COUNT REMAINDER. 
    cmp ax, 0  
    jne divisions ;IF (AX != 0) 

;DISPLAY HEX DIGITS EXTRACTED FROM NUM. 
remainders:  
    pop dx 
    call mostrarchar ;DISPLAY HEX CHAR. 
    loop remainders ;CX-1. IF (CX > 0) REPEAT. 
    ret 
mostrarnum endp 

Proc mostrarnum은 연속적인 숫자로 숫자를 추출하여 숫자를 16 진수로 변환합니다. 이 자릿수는 push과 함께 스택에 저장됩니다. 마지막으로 숫자가 스택에서 검색되어 표시됩니다. 이는 부서가 역순으로 자릿수를 생성하기 때문에 필요합니다. 다시 역순으로 스택의 자릿수를 밀어서 나올 때 정상 순서로 나타납니다.

숫자의 추가는 기본 (2 진수, 10 진수, 16 진수 등)에 상관하지 않으며, 숫자는 dwelch가 말했듯이 단지 비트 일뿐입니다. 인간이면서 그 비트가 16 진수인지 여부를 결정하는 것은 당신입니다. 또는 소수 등 예 :

mov al, 9   ;DECIMAL. 
mov ch, 0Ah  ;10 
add ch, al  ;0Ah + 9 = 13h (19) 

mov dl, 01110011b ;BINARY (115, 73h) 
add ch, dl  ;13h + 115 = 134 (86h) 

당신은 소수 ("134"), 헥스 ("86") 또는 다른하여 최종 결과를 표시 할 수있다.

덧붙여서, 당신은 8로 나누는 것은 8 진수를 줄 것이고, 14로 나누는 것은 기본을 제공 할 것입니다. 예를 들어, 어떤 기초로 변환하기 위해 동일한 기술 (주어진베이스에 의한 연속적인 분할)을 사용할 수 있습니다. 14.

관련 문제