Печать персонажа из реестра - PullRequest
1 голос
/ 27 апреля 2011

Я использую ассемблер NASM.

Значение, возвращаемое в регистр eax, должно быть символом, когда я пытаюсь вывести целочисленное представление, его значение выглядит как адрес памяти. Я ожидал десятичное представление буквы. Например, если символ 'a' был перемещен в eax, я должен увидеть печать 97 (десятичное представление 'a'). Но это не тот случай.

section .data
             int_format db "%d", 0
;-----------------------------------------------------------

mov eax, dword[ebx + edx]
push eax
push dword int_format
call _printf   ;prints a strange number
add esp, 8

xor eax, eax
mov eax, dword[ebx + edx]
push eax
call _putchar ;prints the correct character!
add esp, 4

Так что здесь дает? в конечном итоге я хочу сравнить символ, поэтому важно, чтобы eax получил правильное десятичное представление символа.

1 Ответ

1 голос
/ 27 апреля 2011
mov eax, dword[ebx + edx]

Вы загружаете dword (32 бита) с адреса, указанного в ebx + edx. Если вам нужен один символ, вам нужно загрузить байт. Для этого вы можете использовать инструкцию movzx:

movzx eax, byte[ebx + edx]

Это загрузит один байт в младший байт eax (т.е. al) и обнулит остальную часть регистра.

Другим вариантом было бы замаскировать лишние байты после загрузки dword, например ::10000

and eax, 0ffh

или

movxz eax, al

Что касается putchar, он работает, потому что он интерпретирует переданное значение как char, то есть игнорирует три старших байта, присутствующих в регистре, и учитывает только младший байт.

...