Модератор: Модераторы разделов
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 01.09.2011 22:48
Доброго времени суток!
В режиме x86 такой код работает:
Код:
global _start
_start:
mov al, '0'
mov [esp], al
dec esp
mov al, '1'
mov [esp], al
dec esp
mov al, 10
mov [esp], al
mov eax, 4
mov ebx, 1
mov ecx, esp
mov edx, 3
int 0x80
mov eax, 1
mov ebx, 0
int 0x80
Т.е. он выведет "\n10". Собираю так:
Код: Выделить всё
yasm -f elf test.asm
ld -m elf_i386 test.o -o test.run
На amd64 такой код:
Код:
global _start
_start:
mov al, '0'
mov [rsp], al
dec rsp
mov al, '1'
mov [rsp], al
dec rsp
mov al, 10
mov [rsp], al
mov rax, 4
mov rbx, 1
mov rcx, rsp
mov rdx, 3
int 0x80
mov rax, 1
mov rbx, 0
int 0x80
Не работает. А вот если ESP заменить скажем на память выделеную в секции .bss, то все работает. Собираю так:
Код: Выделить всё
yasm -f elf64 test.asm
ld test.o -o test.run
Я уже все перепробовал и даже GDB облазил всевозможные значения, он просто игнорит ESP, он даже 3 левых символа не выведет, даже если там 10000 поставить, просто пусто.
С чем это может быть связано?
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная
Сообщение
Stauffenberg » 25.11.2011 01:50
BratSinot писал(а): ↑ 01.09.2011 22:48
В режиме x86 такой код работает:
Я единственный, кто не понимает как в x86 режиме можно работать с x86_64 регистрами?
так elf64 или elf?
BratSinot писал(а): ↑ 01.09.2011 22:48
На amd64 такой код:
У меня работет.
Labor omnia vincit
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 26.11.2011 21:38
start_post:
Stauffenberg писал(а): ↑ 25.11.2011 01:50
BratSinot писал(а): ↑ 01.09.2011 22:48
В режиме x86 такой код работает:
Я единственный, кто не понимает как в x86 режиме можно работать с x86_64 регистрами?
Вы видимо единственный кто не понимает что при изменении первой буквы регистра, можно пропустить что-нибудь.
goto start_post;
Пост просто изобилует полезной информацией о процессоре, ОС, ядре, версии и т.д.