Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2012, 12:33   #1
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию Разбор объектного файла

Здравствуйте.

Разбираю объектный файл, полученный tasm'ом. В принципе все понятно и очевидно за исключением одного момента: перехода на метку.

Имеется команда
Код:
jle label1
Метка label1 в TD находится по адресу 107, а команда jle по адресу 10E. 10E - 107 = 7. Т.к. переход назад добавляем F. Отсюда получается код команды 7E F7, которую мы видим в объектном файле.

Имеется команда
Код:
jmp label2
Метка label2 в TD находится по адресу 115, а команда jle по адресу 110. 115 - 110 = 5. Т.к. переход вперед добавляем 0. Отсюда получается код команды EB 05, а в объектном файле находится команда EB 03.

Вопрос: где косяк в рассуждениях?

Заранее спасибо.
Osanve вне форума Ответить с цитированием
Старый 07.06.2012, 13:31   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

смещение указывается от текущего EIP, т.е. после выборки комады (2 байта). Отсюда две ошибки:

1) в первом случае переход на -9, а не на -7 байт назад. -9 это и есть FFFFFFF7 в дополнительном коде. Никаких F там не "добавляется".

2) вместо 5 будет 3 (2 байта ушло на саму команду).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.06.2012, 15:43   #3
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Благодарю. Теперь все встало на свои места.

Хотя нет, не все. Немного не понял почему в первом случае будет переход на -9?

И еще один вопрос. В каких случаях компилятором в код ставится команда nop (код 90)?

Сори, ступил. У нас EIP указывает на следующую команду. Теперь с адресацией все на своих местах.

Остался вопрос про nop. На сколько я понимаю, данная команда нужна для выравнивания процессорных тактов. Но вот когда она используется немного не могу понять, т.к. на моем тестовом примере она поставилась после команды jmp, и после этого адреса стали не кратны двум.

Рано обрадовался.

Строчка кода:
Код:
new_num db 00000001b
Соответствующая строчка из объектного файла:
Код:
A0 9C 05 00 C4 03 54 01 43
Вот как я это расшифровал:
Код:
A0 - идентификатор
9C - байт непонятного назначения
05 00 - длина записи
C4 03 54 - три байта непонятного назначения
01 - вроде значение переменной
43 - контрольная сумма
При выполнении команды
Код:
lea di, new_num
в объектный файл записывается
Код:
BF 17 01
где 17 01 - адрес переменной. По этому адресу находится код, если верить TD, 01 03, который соответствует команде
Код:
add [bp+di], ax
Что я упустил?

Последний раз редактировалось Stilet; 07.06.2012 в 20:58.
Osanve вне форума Ответить с цитированием
Старый 07.06.2012, 19:13   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

адрес не 1701, а скорее 0117 (сначала младший байт, потом старший)

и зачем пытаться дизассемблировать данные как команды?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.06.2012, 20:12   #5
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
адрес не 1701, а скорее 0117 (сначала младший байт, потом старший)
Это понятно. Я просто скопировал код из объектника.

Цитата:
Сообщение от veniside Посмотреть сообщение
и зачем пытаться дизассемблировать данные как команды?
Это честно не я, это TD

Собственно вопрос заключается в структуре записи данных в объектном файле, потому что 4 байта
Код:
C4 03 54 01
а также байт
Код:
9C
я не очень понял.

Также открыт вопрос по поводу того, когда компилятор вставляет команду nop?
Osanve вне форума Ответить с цитированием
Старый 07.06.2012, 20:53   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

советую взять иду (ida), она понимает объектные файлы

по-поводу нопов, да, для выравнивания, почему выровнялось на нечетные - хз, надо смотреть на кусок кода.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.06.2012, 22:25   #7
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Собственно вот код, объектник которого я сейчас изучаю:
Код:
code segment
    assume cs:code
    org 100h
    main proc
        mov dl, 01000000b       ; B2 40
        lea di, new_num         ; BF 17 01
        mov cl, [di]            ; 8A 0D
    label1:
        mov al, cl              ; 8A C1
        stosb                   ; AA
        shl cl, 1               ; D0 E1
        cmp dl, cl              ; 3A D1
        jle label1              ; 7E F7
        jmp label2              ; EB 03
        nop                     ; 90
        mov al, 0               ; B0 00
    label2:
        int 20h                 ; CD 20
    main endp

    new_num db 00000001b

code ends
end main
Вот скрин с дебаггера:


Слышал, что IDA можно официально бесплатно достать не свежей версии, но сейчас почему-то не могу найти. Может есть что-то более доступное?
Osanve вне форума Ответить с цитированием
Старый 07.06.2012, 22:34   #8
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

P.S. nop в коде добавил уже после компиляции, чтобы не забыть откуда в объектнике взялся код 90
Osanve вне форума Ответить с цитированием
Старый 08.06.2012, 08:53   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> вот код

а кто автор этого кода? там есть команды, которые никогда не выполняются, на этом фоне левый ноп смотрится ещё не так плохо )

иду можно тут взять официально бесплатную (правда, не знаю, поймет она obj или нет):

http://www.hex-rays.com/products/ida...freeware.shtml
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.06.2012, 10:35   #10
Osanve
Пользователь
 
Аватар для Osanve
 
Регистрация: 11.12.2010
Сообщений: 50
По умолчанию

Благодарю за ссыль.

IDA выдал совершенно иной объектник:
Код:
B2 40 BF 17 01 8A 0D 8A  C1 AA D0 E1 3A D1 7E F7
EB 03 90 B0 00 CD 20 01
где 01 - заданная переменная. Я так понимаю, что это как раз тот байт, который я указал в строчке объектного файла. Теперь вопрос: что означают все остальные байты?

Автор кода я. Да, там есть команда, которая никогда не выполняется:
Код:
mov al, 0
Была написана для проверки одной теории.
Osanve вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор сложного xml файла aspire89 Общие вопросы Delphi 7 27.09.2013 00:07
Разбор обьектного файла Rroma Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 02.06.2012 20:02
Тетрады и генерация объектного кода Lazio Фриланс 1 23.12.2010 18:20
Разбор текстового файла в PGN формате Magnum2 Общие вопросы Delphi 0 03.10.2010 00:17
Разбор файла OBJ_TEST russian-stalker Общие вопросы Delphi 11 25.08.2008 11:37