Перемещение значения с косвенной адресацией в AL работает, но перемещение его в 8-битный регистр rXb не работает в yasm

У меня есть байтовый массив символов, объявленный в .data

chars db 'spipopd'

и я установил rdi, чтобы указать на базовый индекс этого массива

mov rdi, chars

В какой-то момент я хочу поместить символ из массива в 8-битный регистр. Первый оператор ниже дает допустимое значение, но второй заставляет r9b содержать void после ввода команды gdb print $r9b.

mov al, [rdi]   ; produces valid value in gdb
mov r9b, [rdi]  ; r9b = void, according to gdb

Тот же эффект имеет любой регистр от r8b до r15b. Насколько я понимаю, и al, и r9b 8-битные, так почему один работает, а другой нет? Я догадываюсь, что, хотя оба они 8-битного размера, у них есть некоторые тонкие различия, которые ускользают от меня.

В документации Intel указано:

«Префиксы REX используются для генерации 64-битных размеров операндов или опорных регистров R8-R15».

Это связано с моей проблемой?


person InvalidBrainException    schedule 30.04.2012    source источник
comment
Нет. Префикс REX является частью кода операции и не влияет на выполнение инструкции.   -  person Gunther Piez    schedule 30.04.2012
comment
Как вы определили, что значение в al правильное? Я думал, что GDB поддерживает печать только полного регистра, что означает, что print $al тоже не будет работать, но print $rax и print $r9 будут. Однако вы можете использовать print $r9 & 0xff, чтобы получить только младший байт.   -  person ughoavgfhw    schedule 30.04.2012
comment
Может быть, вы запускаете код в 32-битном сегменте кода и у вас нет доступа к R8-R15? Эти регистры, по-видимому, доступны только из сегментов 64-битного кода.   -  person BitBank    schedule 08.05.2012


Ответы (1)


"void" на самом деле не является значением, которое может иметь регистр, поэтому похоже, что gdb просто не распознает r9b как имя регистра.

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

Взломав в основном случайную программу и попробовав ее сам, я получаю такой вывод:

(gdb) print $r9b
$1 = void
(gdb) print $r9l
$2 = 16

Очевидно, GDB распознает только нотацию $r9l.

person olsner    schedule 22.07.2012