Хранить только первый байт в регистре x86 Assembly - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь сохранить только первый байт в регистре после передачи в него данных, например, если у меня есть следующий код ASM

global _start
section .data
string db "Hello", 0x00 ; string = Hello
section .text
_start:
mov eax, string ; move "Hello" into eax (just to store it for now)

здесь я застрял, я хочу ТОЛЬКО сохранить "H" в eax, поэтому, например, если я переместил "H" в EAX, а затем переместил eax в edx, так что EDX = "H", я мог бы сделать:

mov ebx, 1
mov ecx, edx ; This is so I can store "H" in ecx
mov edx, 12 ; 12 is longer than the string, however, I am just using this to test, as it should only output "H", rather than anything else, the reason for this is later I want to use "H" in a  cmp statement
int 0x80 ; execute the system call

Теперь я также пробовал использовать al, ex: mov [edx], al после перемещения строки в eax, но это все равно выводит полную строку, если для этого может быть предоставлен рабочий пример, это будет очень признательно

1 Ответ

2 голосов
/ 28 мая 2020

Чтобы переместить первый байт строки в al (который является младшим байтом в eax), используйте

mov al, [string]

Если вы хотите переместить байт в младший байт eax и обнулить остальную часть eax , вы можете сделать

movzx eax, byte [string]

Но вам не обязательно использовать EAX для этого. Вы можете загрузить байт в любой регистр, какой захотите. В частности, EAX, вероятно, является плохим выбором, поскольку int 80h ожидает там номер системного вызова. Из вставленного кода не сразу видно, что вы потом пытаетесь сделать с этим символом "H" ...


Если вы собираетесь вывести строку на консоль с помощью системного вызова write (# 4) с файловым дескриптором stdout (1), что звучит вполне естественно, тогда, как сказал Фуз, вам не нужно загружать содержимое строки ни в какие регистры; системный вызов ожидает адрес строки, а не ее содержимое. Насколько мне известно, в Linux.


не выводится односимвольный вывод * В общем, вы, кажется, запутались между адресом строки и содержимым строки.

...