Как мы используем переход в сборке, используя эти инструкции? - PullRequest
0 голосов
/ 18 октября 2018

Я понимаю, что прыжок в сборке в основном происходит из одного места в другое.

Скажем, у нас есть

804828f: 74 05            je XXXXXXX
8048291: e8 1e 00 00 00 call 80482b4 

Согласно книге, все, что я действительно делаю, это добавление 0x05до 8048291, что дает 8048291, но я смущен тем, что просит команда здесь.Согласно книге, операнд je is je равен / 0

Тогда у нас сложный вопрос, который мне действительно трудно обернуть.

8048357: 72 e7                        jb XXXXXXXX
8048359: c6 05 10 a0 04 08 01 movb $0x1,0x804a010

Согласноэто, поскольку e7 является 1-битным представлением -25, jb переходит на адрес 8048340.

То.,,Не имеет никакого смысла для меня.,,СОВСЕМ.С одной стороны, если что-то подписано и 1 байт не должен быть максимальным значением просто 2?Во-вторых, если что-то -25, то почему источник 8048340?Как мы пошли с 59 до 40, если не было вовлечено 19?

Что я думаю, ответ:

Я думал об этом на секунду,но чтобы получить 19 из гекса 25, я должен разделить 16 на 25, взять остаток от 9, а затем добавить 9 к 10, что означает 1 в этом случае?

Честно говоря, я заблудился из-за подписанного однобайтового значения.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Ветвление в сборке является гибким, в том смысле, что вы можете расположить блоки кода в любом порядке.Вы также можете объединить ветви, прыгнув на тот же блок.Для архивации это инструкции должны иметь возможность прыгать как вперед, так и назад.В следующем примере показано использование прыжка назад.

073000:  bf 08 00 00 00          mov    edi, 0x8
073005:  31 c0                   xor    eax, eax
073007 <loop>:
073007:  01 f8                   add    eax, edi
073009:  83 ef 01                sub    edi, 0x1
07300c:  75 f9                   jne    073007 <loop>
07300e:

Для перехода вперед на число после кода операции положительно;для перехода назад число после кода операции является отрицательным.В двоичном мире знак числа определяется его старшим битом.В примере hex f9 является двоичным 11111001 и означает -7 (как конвертировать, смотрите ниже).Поскольку hex (07300e) - 7 - это hex (073007), он перейдет к 073007, если ZF не установлен (это означает, что edi не равно нулю после вычитания в приведенном выше примере).

Мне кажется, что высмущены шестнадцатеричными числами.Я буду использовать несколько примеров, чтобы показать, как преобразовать их в десятичные числа.Google, и вы можете найти более подробную информацию.

Unsigned numbers:
0x1234 =  1*16^3 +  2*16^2 + 3*16^1 +  4 = 4660 
0x3420 =  3*16^3 +  4*16^2 + 2*16^1 +  0 = 13344 
0x0A0B =  0*16^3 + 10*16^2 + 0*16^1 + 11 = 2571   (A is 10; B is 11)
0x8000 =  8*16^3 +  0*16^2 + 0*16^1 +  0 = 37268
0xFF7A = 15*16^3 + 15*16^2 + 7*16^1 + 10 = 65402  (F is 15)

Signed numbers:
0x1234 =   ; positive because 1 is smaller than 8
0x3420 =   ; positive because 3 is smaller than 8 
0x0A0B =   ; positive because 0 is smaller than 8
0x8000 =   ; negative because 8 is NOT smaller than 8
0xFF7A =   ; negative because F (15) is NOT smaller than 8

Signed numbers:
0x1234 = 4460  ; positive numbers are calculated like unsigned number
0x3420 = 13344 ; positive numbers are calculated like unsigned number
0x0A0B = 2571  ; positive numbers are calculated like unsigned number
0x8000 = 32768 - 65536 = -32768 ; a simple way to calculate negative number
0xFF7A = 65402 - 65536 = -134 ; a simple way to calculate negative number

Когда первая цифра> = 8, старший бит равен 1, поэтому число является отрицательным.

65536 равно 2 ^ 16.

0 голосов
/ 18 октября 2018

0x05 + 0x8048291 равно 0x8048296.Вы, кажется, добавили ноль, а не 5. Это условный переход через 5-байтный call, и он берется, если установлен ZF.(http://felixcloutier.com/x86/Jcc.html).

x86 смещения веток относительно конца инструкции ветвления, то есть начала следующей инструкции.

Адреса в шестнадцатеричном, а не десятичном виде, даже если они не имеютНе начинайте с 0x в выводе дизассемблирования. Обратите внимание, что 804828f включает в себя f в виде цифры. Смещения составляют 1 байт, а не 1 бит, и, таким образом, имеют диапазон от -128 до +127. Существует другая кодировкадля прыжков rel32, если rel8 находится вне диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...