· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.UNIX —› [at&] вопрос по jump`ам. jne и je в частности.

Посл.отвђт Сообщенiе


Дата: Июн 30, 2004 10:05:57

Приветствую господа!
У меня простой вопрос по jump`ам. по jne и je в частности.
Для примера маленькая программка:

xor %eax,%eax
mov $0x666,%eax
cmpl $0x666,%eax
jne aaa
nop
... еще 8 штук.
nop
aaa:
xor %eax,%eax
inc %eax
int $0x80

08048074 <_start>:
8048074: 31 c0 xor %eax,%eax
8048076: b8 66 06 00 00 mov $0x666,%eax
804807b: 3d 66 06 00 00 cmp $0x666,%eax
8048080: 74 0a je 804808c <aaa>
8048082: 90 nop
...skipped..
804808b: 90 nop

0804808c <aaa>:
804808c: 31 c0 xor %eax,%eax
804808e: 40 inc %eax
804808f: cd 80 int $0x80
8048091: 8d 76 00 lea 0x0(%esi),%esi

т.е. тут сразу видно что 74 0a можно понять как - перейти если
верно на 10 байт. С этим все понятно. Так-же все понятно спрыжками
в районе 256 байт. А вот дальше...

Пишем туже самую программку, но nop`ов вставляем не 10, ну а 256 например.
И вот что получаем:

08048074 <_start>:
8048074: 31 c0 xor %eax,%eax
8048076: b8 66 06 00 00 mov $0x666,%eax
804807b: 3d 66 06 00 00 cmp $0x666,%eax
8048080: 0f 84 04 01 00 00 je 804818a <aaa>

0804818a <aaa>:
804818a: 31 c0 xor %eax,%eax
804818c: 40 inc %eax
804818d: cd 80 int $0x80
804818f: 90 nop

И вот тут хоть убейте не могу понять где в 0f 84 04 01 00 00
указан адрес 804818a. Да, кстати, если попробовать сделать
переход не по je, а по jne то все совсем становится непонятным,
т.к. переход будет выглядеть:
8048080: 0f 85 04 01 00 00 jne 804818a <aaa>

Народ, объясните мне глупому, откуда он берет из этих строк
адрес куда ему нужно переходить.

Заранее спасибо.

p.s. ОС - FreeBSD 4.10; Ассемблер - as 2.12.1; Линковщик - ld 2.12.1; дисассемблер - objdump 2.12.1


Дата: Июн 30, 2004 10:46:47

looser
В 0f 84 04 01 00 00 первые 2 байта - опкод, остальные 4 - смещение цели относительно начала следующей за jmp иснтрукции (dword ).


Дата: Июн 30, 2004 10:50:59

looser
После команды _условного_ перехода следует дистанция до целевого адреса, а не сам целевой адрес. Команда _безусловного_ перехода имеет два вида - с дистанцией и с целевым адресом, компилятор умеет выбирать необходимый вид.


Дата: Июн 30, 2004 12:46:18

А, помоему становится ясно :)
0f 84 04 01 00 00
^^^^^ ^^^^^
опкод 104h -> 260 байт.
т.е. прыгнуть через 260 байт. Я правильно понял?


Дата: Июн 30, 2004 12:48:23

looser
да.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037