У меня есть байтовый массив символов, объявленный в .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».
Это связано с моей проблемой?
al
правильное? Я думал, что GDB поддерживает печать только полного регистра, что означает, чтоprint $al
тоже не будет работать, ноprint $rax
иprint $r9
будут. Однако вы можете использоватьprint $r9 & 0xff
, чтобы получить только младший байт. - person ughoavgfhw   schedule 30.04.2012