실제로는 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
을
"유효하지 않은 유효 주소"로 인해 이것을 조합 할 수는 없지만. 이 작업을 수행하려면 무엇을해야합니까?
숫자를 16 진수로 나누기 위해 지금까지 시도한 것은 무엇입니까? ('print_string' 서브 루틴에 대한 노력을 제외하면 DOS 기능 09h를 사용했을 수도 있습니다.) –
4 비트의 배수로 오른쪽으로 시프트하고 0x0F와 AND로 16 진수를 분리 할 수 있습니다. 그 값을 문자열 버퍼에 넣는 문자에 매핑하십시오. 모든 숫자를 다룰 때까지 반복하십시오. – Michael
처음에는 높은 니블 (절반 바이트)을 분리하기 위해 "rol dx, 4"명령을 사용할 수 있습니다. 그리고 가장 낮은 바이트를 0x0F로 AND 연산을하는 두 번째 레지스터로 옮길 수 있습니다. 이제 0x30을 추가하여 값을 ASCII로 변환 할 수 있고 10에서 15까지의 모든 숫자에 대해 문자를 얻으려면 숫자 7을 추가해야합니다 A부터 F. –