Кажется, у меня интересная проблема, хотя я, вероятно, делаю что-то явно не так.
Моя проблема в том, что я пытаюсь поместить AAAABBBBCCCC в стек, а затем распечатать их через стандартный вывод. Однако кажется, что в моей среде x86_64 push 0x41414141
подталкивает 4141414100000000
.
Итак, следующий блок кода:
global _start
section .text
_start:
push 0x43434343 ; CCCC
push 0x42424242 ; BBBB
push 0x41414141 ; AAAA
xor rax,rax ; Zero RAX
mov byte al,0x1 ; 1 for sys_write
mov rdi,rax ; 1 for stdout
mov rsi,rsp ; RSP for source
mov byte dl,0xC ; 12
syscall
xor rax,rax ; Zero RAX
mov al, 0x3C ; 60 for sys_edxit
cdq ; 0 for clean exit.
syscall
Выходы AAAABBBB
, из которых я считал всего 8 байт, на самом деле были 12, о которых я просил. Когда перенаправили в выходной файл и посмотрели в шестнадцатеричном формате, я заметил, что он отображает 414141410000000042424242
.
Я полагаю, что инструкция push
подталкивает значение dword
. в стек размером qword
? Правильно ли я так думаю?
Этого можно аккуратно избежать, если учесть лишние байты и изменить длину на 20. Но это вызовет проблемы с такими вещами, как sys_open
.
Итак, мой вопрос: что я делаю не так?
push
, вы правы в том, что операнд будет иметь расширенный знак. --- хммм ... он только что удалил свой комментарий? - person IdiotFromOutOfNowhere   schedule 22.09.2012