2014-12-24 3 views
0

실제로는 dx 레지스터의 내용을 nasm으로 인쇄하려고합니다. 따라서 콘텐츠는 0x12AB와 같은 16 비트 16 진수입니다.nxm을 사용하여 dx에서 16 진수 인쇄

mov bx, MSG 
call print_string 

MSG: 
    db 'Test',0 

지금 내가하는 기능을 갖고 싶어 :이 방법으로이 기능을 사용할 수 있습니다

print_string: 
    pusha 
    mov ah, 0xe 

print_character: 
    mov al, [bx] 
    inc bx 
    or al, al 
    jz print_done 
    int 0x10 
    jmp print_character 

print_done: 
    popa 
    ret 

:

그러므로 내가 먼저 문자열을 인쇄 할 수있는 기능을 구현했습니다 이것은 16 진수를 문자열로 변환하여 print_string이 그것을 인쇄 할 수 있도록합니다. 나는 그런 식으로 뭔가에 대해 생각했다 :

print_hex: 
    pusha 
    mov bx, HEX_OUT 
    ; HEX_OUT is a kind of template string 
    ; now i want to get the hex of dx into this template in order to be able to print it 
    ; However I'm not sure how to manage this 
    call print_string 
    popa 
    ret 

HEX_OUT: 
    db '0x0000', 0 

불행하게도 나는, BX에 DX에서 각각 HEX_OUT을 진수를 얼마나 잘 모르겠어요. 다른 사람이 나를 도울 수 있습니까?

는이 같은 말을 사용하려는 :

mov dx, 0x12AA 
call print_hex 

감사합니다 당신이 이미 사전에를!

UPDATE :이 같은 분리 및 인쇄 얻을 수있는 언급 한 바와 같이

:

print_hex: 
    pusha 
    mov bx, PREFIX 
    call print_string 

next_character: 
    mov bx, dx 
    and bx, 0xf000 
    shr bx, 4 
    add bh, 0x30 
    cmp bh, 0x39 
    jg add_7 

print_character_hex: 
    mov al, bh 
    mov ah, 0x0e 
    int 0x10 
    shl dx, 4 
    or dx, dx 
    jnz next_character 
    popa 
    ret 

add_7 
    add bh, 0x7 
    jmp print_character_hex 

PREFIX: 
    db '0x', 0 

내 기능과 버퍼를 인쇄하기 위해이 같은 시도 :

print_hex: 
    ;Added this here  
    mov cx, HEX_OUT + 2 

print_character_hex: 
    mov [cx], bh 

"유효하지 않은 유효 주소"로 인해 이것을 조합 할 수는 없지만. 이 작업을 수행하려면 무엇을해야합니까?

+0

숫자를 16 진수로 나누기 위해 지금까지 시도한 것은 무엇입니까? ('print_string' 서브 루틴에 대한 노력을 제외하면 DOS 기능 09h를 사용했을 수도 있습니다.) –

+0

4 비트의 배수로 오른쪽으로 시프트하고 0x0F와 AND로 16 진수를 분리 할 수 ​​있습니다. 그 값을 문자열 버퍼에 넣는 문자에 매핑하십시오. 모든 숫자를 다룰 때까지 반복하십시오. – Michael

+0

처음에는 높은 니블 (절반 바이트)을 분리하기 위해 "rol dx, 4"명령을 사용할 수 있습니다. 그리고 가장 낮은 바이트를 0x0F로 AND 연산을하는 두 번째 레지스터로 옮길 수 있습니다. 이제 0x30을 추가하여 값을 ASCII로 변환 할 수 있고 10에서 15까지의 모든 숫자에 대해 문자를 얻으려면 숫자 7을 추가해야합니다 A부터 F. –

답변

0

좋아, 나는 그것을 관리 할 수 ​​있었다. 도와 줘서 고마워! 다음은 작업 코드입니다.

print_hex: 
    pusha 
    mov si, HEX_OUT + 2 

next_character: 
    mov bx, dx 
    and bx, 0xf000 
    shr bx, 4 
    add bh, 0x30 
    cmp bh, 0x39 
    jg add_7 

add_character_hex: 
    mov al, bh 
    mov [si], bh 
    inc si 
    shl dx, 4 
    or dx, dx 
    jnz next_character 
    mov bx, HEX_OUT 
    call print_string 
    popa 
    ret 

add_7: 
    add bh, 0x7 
    jmp add_character_hex 

HEX_OUT: 
    db '0x0000', 0 
+0

16 비트 워드가 1 이상으로 끝나면 결국 실패합니다. 이것을 'mov dx, 0x1fb6'로 두 번,'mov dx, 0x2000'로 두 번째로 호출 해보십시오. '0x1FB6'과'0x2FB6'을 출력합니다. 이 문제를 해결하려면 ax (또는 다른 미사용 레지스터)를 카운터로 사용하여 루프를 4 번 실행하십시오. –