![]() |
|
![]() ![]() ![]() |
|
Logree |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
простая програмка
вопросы в коде. -------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
а DS у тебя чему равно, как полагаешь?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Logree |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
это здесь набирал ассум забыл а впроге она есть дс на дсег указывает
-------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Logree, идите учить основы языка. ASSUME ничего не присваивает. А DS у вас указывает на PSP.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Logree |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
нУ Ё МАЁ ЗАБЫЛ ж)
и всётаки, так всё работает, но почему +4 а не +6
Это сообщение отредактировал(а) Logree - 6.12.2008, 05:34 -------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
|||
|
||||
Mikl_ |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Logree, во-первых вместо lea ax,mess /push ax можно сразу писать push offset mess
во вторых, привыкай писать так, чтобы процедуры сами выравнивали за собой стек после получения параметра то есть вместо
Это сообщение отредактировал(а) Mikl_ - 8.12.2008, 05:18 |
||||
|
|||||
Mikl_ |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Logree, Перед обращением к процедуре основная программа записала параметры в стек. Параметры записываются в стек слева направо: сначала первый параметр, затем второй и т.д. Команды основной программы, реализующие обращение к процедуре и состояние стека после входа в процедуру:
Но это был всего лишь частный случай, а если нам придет в голову использовать внутри процедуры команды PUSH и POP? Воспользуемся регистром BP, засылаем в него адрес вершины стека (содержимое регистра SP), а затем используем выражение вида [BP+i] для доступа к параметрам процедуры. Мы можем испортить содержимое регистра BP, а он может использоваться в основной программе. Поэтому сначала сохраним значение этого регистра в стеке, а затем пересылаем в регистр BP значение регистра SP. Входные и выходные действия процедуры
Первый вариант.После выполнения команды RET в стеке остаются использованные процедурой параметры и основная программа должна очистить стек. Но было бы лучше, если очистку стека будет делать сама процедура, так как обращений к процедуре может быть много и в основной программе команду ADD SP,2*k придется повторять многократно. Существует правило: если что-то может сделать и основная программа и процедура, то лучше, если это будет делать процедура.
Второй вариант.Процедура сама очищает стек от параметров и передает управление по адресу возврата
По команде RET смещение из стека удаляется адрес возврата, затем стек очищается на указанное операндом число байтов и для перехода по адресу возврата выполняются следующие действия: 1) Значение из стека в IP 2) [значение из стека в CS] 3) SP=SP+смещение (действие по восстановлению значения CS из стека выполняется лишь при дальнем возврате). Команда RET — это на самом деле команда RET 0, то есть возврат без очистки стека. Операнд команды RET указывает на сколько байтов, а не слов надо очищать стек. Для очистки стека от k параметров, каждый из которых имел размер слова, был указан операнд 2*k. В операнде не должен учитываться адрес возврата — команда RET считывает его до очистки стека. Это сообщение отредактировал(а) Mikl_ - 8.12.2008, 06:56 |
||||||||||
|
|||||||||||
Logree |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
спасибоЖ)
-------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
|||
|
||||
Logree |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
поговорим ещё немного вот пример:
гдавная программа
file.asm
prt_str.asm
смысл прост вызывающая прграмма и две другие (название соответствует содержанию) 1. выдаёт множество ошибок как например незакрытый сегмент и что-то про mov [bx+si+1],0h в file.asm покажите на все ошибки 2. если у меня far значит каждый параметр занесённый в стек будет 4 байта те 1. [bp+36] 2.[bp+16] да и загружать сначала придётся первае 2 байта а потом остальные ? Это сообщение отредактировал(а) Logree - 21.12.2008, 21:07 -------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
||||||
|
|||||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Logree,
1) если объявляешь процедуру как far, тогда заканчиваться она должна обязательно на retf и вызов ее должен быть call far 2) вместо push ax/ ... /push bp можно написать pusha соответственно вместо pop bp/ ... /pop ax есть команда popa 3) если пытаешься получить аргумент из стека то обращатья к нему лучше через bp -- mov ax,[bp] подразумевается mov ax,ss:[bp] если аргумент в стеке а адресация через bx, si, di тогда префикс указывается явно mov ax,ss:[bx+si] 4) все свои действия контролируй через отладчик -- мало ли кто чего тебе насоветует -- в отладчике все ошибки видно |
|||
|
||||
Logree |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
это для всех процов?
так сначала и было сделано но потм оказалось что придётся добавлять .386 мне было влом(ну просто не хотелось) тем более я только учусь.. лучше видить что и как
не понял к чему это... и где ошибки? т е в чём причина?
-------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
||||||||
|
|||||||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Logree,
1) справедливо и для AMD, и для Intel, потому что у этих команд разная кодировка: retn = 0C3h retn число = 0C2 число retf = 0CBh retf число = 0CA число call near = 0E8XXXX call far = 0FFXXXX или 9AXXXX зависит от контекста 2) для поддержки pusha и popa достаточно в заголовке поставить .286 если поставить .386 тогда pusha размещает в стеке содержимое регистров в следующей последовательности: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI. а push eax это не одно и тоже что push ax. Для их различия иногда пишут PUSHAD и PUSHAW 3) если написано невнятно -- найди аналогичное место в учебнике и перечитай 4) С синтаксическими ошибками разбирайся сам -- больше будет пользы! |
|||
|
||||
Logree |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
А разве tasm один раз по программе проходит?
со всеми ошибками разобрался методом логических размышлений...
он же автоматически ret на retf заменяет теперь всё нормально одна проблемма:
почему так mov [bx+si],al ему нравиться а так нет? пробывал mov ss:[bx+si+1],0h что-то не помогло в чём дело? при линковке пишет
я так понимаю нет точки входа в программу... и возможно из-за того что я написа вот так
или я что со стеко намудрил? ps я правда рад бы посмотреть её под отладчиком да где б экзэшник взять ![]() Это сообщение отредактировал(а) Logree - 24.12.2008, 01:43 -------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
||||||||
|
|||||||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Logree,
1) mov [bx+si+1],0h *Warning* file.asm(43) Argument needs type override Ну во-первых, Warning это предупреждение о возможной ошибке, а не об ошибке -- Error Смысл предупреждения -- неоднозначное трактование записи команды mov [bx+si+1],0h может быть mov byte ptr [bx+si+1],0h а может быть mov word ptr [bx+si+1],0h -- кодировки у этих команд разные -- компилятор подставил, то что считал нужным, но на всякий случай предупредил тебя -- вдруг он это сделал неправильно -- когда ты пишешь mov [bx+si],al однозначно видно, что ты передаешь байт, если написано mov [bx+si+1],1000h по величине числа тоже видно, что передается слово, а вот с числами в диаппазоне от -128 до +127 возникнет неоднозначность, что имеет ввиду программист слово или байт? Избежать это помогает определение типа аргумента -- argument type override -- диррективы word ptr и byte ptr 2) Fatal: No program entry point вместо первой метки begin: и end begin напиши start: и end start -- возможно из-за этого. И строка ASSUME CS:CSEG,DS:DSEG,SS:SSEG можно и без неё обойтись -- пишешь .code вместо CSEG SEGMENT ... CSEG ENDS, .data вместо DSEG SEGMENT ... DSEG ENDS, .stack вместо SSEG SEGMENT ... SSEG ENDS как вас учат -- это какая-то архаичная форма записи, по крайней мере уже 20 лет назад так не писали... Лучше возьми исходный текст работающей программы и постепенно видоизменяй его под свой исходник -- внес небольшие изменения -- компилируешь, не компилируется -- разбираешься почему, компилируется -- вносишь изменения дальше 3) я правда рад бы посмотреть её под отладчиком да где б экзэшник взять Пока не избавишься от синтаксических ошибок экзешник не получится -- отладчик это следующий этап после компиляции |
|||
|
||||
Logree |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 22.11.2006 Где: Самара Репутация: 1 Всего: 2 |
я рассматривал этот вариант но проверить руки не дошли... ![]()
ему пофиг что я та м пишу start, entry, begin, не видит он точки входа в чём ещё может быт дело? ПОЧЕМУ-ТО МЕНЯ ВОРОТИТ ОТ ВСЕХ ЭТИХ .code .STACK И Т Д буду под винду писать буду юзать .code а пока лучше постаринке...
я в курсе это как бы шутка была... ха ха ![]() Это сообщение отредактировал(а) Logree - 24.12.2008, 18:05 -------------------- Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |