При изучении языка ассемблера по книге есть листинг, показывающий некоторые основные операции:
segment .data
a dq 176
b dq 4097
segment .text
global _start
_start:
mov rax, [a] ; Move a into rax.
add rax, [b] ; add b o rax.
xor rax, rax
ret
После сборки с помощью команды "$yasm -f elf64 -g dwarf2 -l listing.lst listing.asm"
и линковки с помощью "$ld -o listing listing.o"
я запустил программу в gdb. Там всякий раз, когда я пытался напечатать значение переменной, gdb показывал это сообщение об ошибке:
(gdb) p a
'a' has unknown type; cast it to its declared type
То же самое для другой переменной «b». Однако кастинг «a» или «b» для int работал:
(gdb) p (int)a
$11 = 176
(gdb) p (int)b
$12 = 4097
Но разве это не должно работать без кастинга? Зачем мне кастинг? Какую ошибку я сделал в исходном файле?
dq
, скорее всего, НЕint
на вашей целевой платформе (я никогда не уверен, на какой целевой платформеint
равен 64b). Таким образом, вы, вероятно, печатаете только 32-битную часть значения путем приведения. (и я также не уверен, какой тип распознает gdb, работает лиp (int64_t)a
, или вам нужно использовать базовые типы C, такие какp (long long)a
? Или даже некоторые asm распознаются, какp (qword)a
?) - person Ped7g   schedule 10.09.2018mov rax,[a]
считывает 8 байтов, поэтому должно бытьmov eax,[a]
, если вы хотите использовать толькоdd
для определения данных (илиmovsx rax,dword [a]
, если вы хотите расширить знаковое значение 32-битного значения памяти до 64-битногоrax
). Также я не вижу, какdq
противdd
что-то исправит, это просто изменяет объем памяти, определенный после меткиa
. Предоставление меткеa
какой-либо информации о типе в отладочной информации выходит за рамки того, что я обычно делаю в ассемблере (вы заставляете меня как бы понять, как 8-битная эра заставила меня так сильно отслеживать все в голове, что я даже не думал о том, что отладчик знает о типе). - person Ped7g   schedule 10.09.2018a
может оказаться на вашем пути (если вы обращаетесь к этой памяти другими инструкциями, для например, если вы векторизуете какой-то код, обращаясь к нескольким элементам одновременно). - person Ped7g   schedule 10.09.2018int32_t a = 1;
определяет 32-битное целое число, но в ассемблере что-то вродеa: dd 1
определяет метку указывает на следующий первый байт сгенерированного машинного кода (часть строкиa:
), а затем определяет четыре байта1, 0, 0, 0
(часть строкиdd 1
), они подобны разъединенным объектам, вы даже можете использовать две строки. - person Ped7g   schedule 10.09.2018