Изглежда, че имам интересен проблем, въпреки че вероятно правя нещо явно нередно.
Проблемът ми е, че се опитвам да избутам AAAABBBBCCCCC в стека, след което да ги отпечатам чрез stdout. Въпреки това изглежда, че в моята 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-те, които поисках. Когато се прехвърли към изходен файл и се погледна в hexedit, забелязах, че показва 414141410000000042424242
.
Предполагам, че инструкцията push
избутва dword
стойност. върху стек с размер qword
? Правилно ли мисля това?
Това може лесно да се избегне, като се вземат предвид допълнителните байтове и се промени моята дължина на 20. Но това би причинило проблеми с неща като sys_open
.
Та въпросът ми е какво правя грешно?
push
вие сте прав, тъй като операндът ще бъде с разширен знак. --- хммм... току-що премахна коментара си? - person IdiotFromOutOfNowhere   schedule 22.09.2012