Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 15003|Ответ: 0

[Разборка] Подробное объяснение использования команды сборки JMP

[Скопировать ссылку]
Опубликовано 03.11.2014 23:32:49 | | |
Когда я наткнулся на следующий код, изучая ассемблер, я просто подумал, что программа не может закончиться нормально. Однако после одношагового отслеживания отладки выяснилось, что программа может завершаться нормально, и произошло странное явление: когда программа начала выполняться с code:0005 в code:0014, она продолжала прыгать в code:0008 с командой jmp. Однако при продолжении выполнения шага вперёд программа сразу переходит в code:0 вместо code:0018 (то есть сегмент S1 с обозначением). Сначала я не понимал, что происходит, но после множества одноступенчатых наблюдений всё равно чувствовал себя странно. После тщательного изучения использования инструкций JMP в учебнике [1], а затем анализа программы в сочетании с машинным кодом, я получил новое понимание инструкций JMP.

Машинные инструкции сборки кода по смещению адреса (IP)  

Предположим CS:код (единица: h)

Сегмент кода

        mov ax, 4c00h 0000 B8004C   

        int 21h 0003 CD21

start:  mov ax,0            0005         B80000

    S: NoP 0008 90

        NOP 0009 90

        mov di, смещение s 000A BF0800

        mov si, смещение S2 000D BE2000        

        mov ax,cs:[si] CS:0020=F6EB

        mov cs:[di],ax CS:0008=9090

    s0: jmp short s 0016 EBF0

    s1: MOV AX, 0 0018 B80000

        int 21h 001B CD21

        MOV AX, 001D B80000

    s2: JMP короткометражный сезон 1 0020 EBF6

        nop 0022 90

Код заканчивается

Конец Начало

1. Следующие два момента необходимо ясно понять
1. Процесс выполнения инструкций ЦПУ следующий:
<1>. Прочитайте инструкцию из блока памяти, на которую указывает CS:IP, и поместите её в буфер инструкций.
<2>. IP=IP+Длина инструкции, которая в данный момент читается в буфере, то есть IP указывает на следующую инструкцию.
<3>. Выполните текущую команду в буфере. Переходите к шагу <1>
2. Значение короткой команды jmp для передачи внутреннего сегмента
<1>. IP — это смещение, то есть адрес в идентификаторе IP = адрес первого байта после команды jmp.
<2>. Функция этой команды заключается в изменении значения IP, и после выполнения команды IP = IP + смещение на 8 бит
< 3> и 8 бит имеют диапазон смещения -128~127, а смещение выражается в виде дополнения [2].
2. Анализ кода
1. Шаг 1: Программа начинает выполнение с входного начала (code:0005), когда выполняется оператор code:0013~0014, машинный код оператора jmp short S1 на метке S2 копируется в code:0008, а IP — 0016. В данный момент, если нет короткой инструкции jmp s, программа выполняется в s2:jmp short s1, считывается jmp short s1 в буфер инструкций и IP=0022; а передача из s2 в s1 — это внутрисегментная передача, формат машинного кода — EB disp, а disp = обозначение s1 s2=(00018-0022) complement=F6, поэтому машинный код команды jmp short s1 должен быть EBF6. Таким образом, EBF6 копируется в единицу код:0008~code:0009.
2. Шаг 2: Прочитайте инструкцию jmp short s (EBF0) в буфер инструкций,
IP=IP+0002=0018; дополнительный код обозначения s-обозначение s0=(0008-0018) = F0, а передача от s0 к s — это внутрисегментная передача, а формат машинного кода — EB disp (то есть EBF0)
3. Шаг 3: Команда jmp short s(EBF0) — это команда для изменения IP после выполнения команды EBF0, IP=IP+(обозначение s-обозначение s0)=0008, указывающая на блок код:0008.
4. Шаг 4: Прочитайте содержимое кода единицы:0008. Поскольку команда jmp short s1 (EBF6) на s2 копируется в блок код:0008~code:0009, после чтения содержимого устройства IP=IP+0002=000A
5. Шаг 5: Инструкция jmp short s1 (EBF6) — это команда для изменения IP после выполнения команды EBF6, IP=IP+(обозначение s1-обозначение s2)=0000, указывающая на блок код:0000.
6. Шаг 6: Программа переходит в code:0000 для выполнения, то есть обычный конец завершается.
3. Послесловие
Правильно проанализировать этот код: нужно понять процесс выполнения инструкций CPU и jmp short? (рассчитано с помощью модификации IP). Кроме того, комплементарный код результата вычисления смещения также является ключом. После анализа этого, казалось бы, аномального кода я получил более глубокое понимание инструкций JMP в ассемблере.





Предыдущий:Мероприятие «Sim Couple» ко Дню одиночек
Следующий:Как подробно использовать абстрактный текст на Java
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com