NASM/YASM стек и write()

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

NASM/YASM стек и write()

Сообщение BratSinot »

Доброго времени суток!

В режиме 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 ☮
ОС: открытая и свободная

Re: NASM/YASM стек и write()

Сообщение Stauffenberg »

BratSinot писал(а):
01.09.2011 22:48
В режиме x86 такой код работает:

Я единственный, кто не понимает как в x86 режиме можно работать с x86_64 регистрами?

BratSinot писал(а):
01.09.2011 22:48

Код: Выделить всё

yasm -f elf64 elf test.asm

так 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

Re: NASM/YASM стек и write()

Сообщение BratSinot »

start_post:
Stauffenberg писал(а):
25.11.2011 01:50
BratSinot писал(а):
01.09.2011 22:48
В режиме x86 такой код работает:

Я единственный, кто не понимает как в x86 режиме можно работать с x86_64 регистрами?

Вы видимо единственный кто не понимает что при изменении первой буквы регистра, можно пропустить что-нибудь.

Stauffenberg писал(а):
25.11.2011 01:50
BratSinot писал(а):
01.09.2011 22:48

Код: Выделить всё

yasm -f elf64 elf test.asm

так elf64 или elf?

goto start_post;

Stauffenberg писал(а):
25.11.2011 01:50
BratSinot писал(а):
01.09.2011 22:48
На amd64 такой код:

У меня работет.

Пост просто изобилует полезной информацией о процессоре, ОС, ядре, версии и т.д.
Спасибо сказали: