Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 236
от 11.09.2005, 23:00

Администратор:Калашников О.А.
В рассылке:Подписчиков: 259, Экспертов: 21
В номере:Вопросов: 13, Ответов: 25


Вопрос № 25907: Question: В программе MAINPRO определены переменные QTY как DB, VALUE как DW, PRICE как DW. Подпрограмма SUBPRO должна разделить VALUE на QTY и записать частное в PRICE. 1. Каким образом программа MAINPRO указывает ассемблеру, что тр...
Вопрос № 25910: Что представляют из себя *.lib файлы? Как можно получить их из *.dll файлов? Можно ли как нибудь обойтись без них (*.lib)? ...
Вопрос № 25912: Question: Два модуля в приложении: Объектные модули создаются, т.е. получаются два объекных модуля mod1.obj, mod2.obj а линковаться нехотят. Вот, что выводит компоновщик: Turbo Assembler Version 4.1 Copyright (c) 198...
Вопрос № 25914: Добрый день Эксперты и приятного аппетита!!!!!!!! Вопросик такой-вот..... Есть такая програмка в винде DEBUG.EXE так вот значит возможно ли изменить её формат а имменно с ЕХЕ на СОМ чтобы она работала под досом? может с помощью дисассембл...
Вопрос № 25917: Вот, что мне нужно: Имеются данные: DATAX DW 0148h DW 2316h DATAY DW 0237h DW 4052h Нужно двойное слово, начинающееся с адреса DATAX, т.е. 01482316h умножить на слово DATAY, причем используя только 16-ые регистры процессо...
Вопрос № 25919: Вроде все правилно, а выходит ошибка при компоновке: Error: Fixup overflow at CSEG:0106, target = SUBPRO in module MOD1.ASM ...
Вопрос № 25924: Убрал из второго модуля org 100h Да и с первого тоже пробовал. Все таже ошибка: Error: Fixup overflow at CSEG:0106, target = SUBPRO in module MOD1.ASM ..
Вопрос № 25935: Вопрос: Модель TINY поставил. Объектные модули создаются, а компановщик снова выдает три ошибки: Error: Fixup overflow at CSEG:0001, target = VALUE in module MOD2.ASM Error: Fixup overflow at CSEG:0005, target = QTY in modul...
Вопрос № 25945: При загрузке DOS EXE программы в дебагер Tasm5.0 (под DOS6.22) Видим что неверно установлено значение указателя DS и программа не работает. После исправления значения в регистре все работает. Где Ошибка...
Вопрос № 25949: Следовал всем инструкциям учебника,пытался ассемблировать prog01.asm,а ML.EXE Выдаёт fatal error A1000: cannot open file:prog01.ASMAT также пробовал таsмом не получается. help.......
Вопрос № 25950: Следовал всем инструкциямучебника,пытался ассемблировать prog01.asm,а ML.EXE Выдаёт fatal error A1000: cannot open file:prog01.ASMAT help...........
Вопрос № 25951: Задам вопрос теоритически: Имеются два модуля м1 и м2. В модуле м1 определено три переменных: "db, dw, dw" Как их использовать в модуле м2? В модуле м1 указаны следующие директивы: PUBLIC "db, dw, dw"...
Вопрос № 25955: Я задовал вопрос: Команда JMP начинается начинается на 0624h. Мне нужно определить адрес прохода, если 16-ый объектный код для операнда кманды JMP: 27h 6Bh C6h Мне ответили переходы 27h и 6Bh - положительные, а ...

Вопрос № 25.907
Question:

В программе MAINPRO определены переменные QTY как DB, VALUE как DW, PRICE как DW.
Подпрограмма SUBPRO должна разделить VALUE на QTY и записать частное в PRICE.
1. Каким образом программа MAINPRO указывает ассемблеру, что три переменные

должны быть доступны другим программам?
2. Каким образом программа SUBPRO указывает ассемблеру, что три переменные

определены в другом модуле?

1. PUBLIC QTY, VALUE, PRICE.
2. EXTERN QTY:BYTE, VALUE:WORD, PRICE:WORD.
Верно?

; модуль 1
MAINPRO PROC
EXTRN SUBPRO:FAR
PUBLIC QTY, VALUE, PRICE
QTY DB ?
VALUE DW ?
PRICE DW ?
CALL SUBPRO
ENDP MAINPRO

; модуль 2
SUBPRO PROC
;PRICE=VALUE/QTY
ENDP SUBPRO
Отправлен: 06.09.2005, 09:27
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Вася Пупкин!
PUBLIC пиши желательно ниже определения переменной.

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 06.09.2005, 09:41

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

Да, именно так.
Местоположение PUBLIC абсолютно не важно, я его предпочитаю писать в начале модуля, чтобы сразу же было видно, какие идентификаторы экспортируются.
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 06.09.2005, 13:29


Вопрос № 25.910
Что представляют из себя *.lib файлы?
Как можно получить их из *.dll файлов?
Можно ли как нибудь обойтись без них (*.lib)?
Отправлен: 06.09.2005, 10:37
Вопрос задал: Ahab (статус: 2-ой класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: Евгений Иванов
Здравствуйте, Ahab!
Для этого существует программа IMPLIB.

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

Удачи!
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 06.09.2005, 11:25

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Ahab!

На пальцах :)
1. lib от слова library, т.е. библиотека, другими словами, объединение часто используемых подпрограм и данных, описанных как PUBLIC, т.е. доступных для внешнего вызова. Эти подпрограммы и данные структурно объединены в объектные модули (примерно как файлы OBJ).
Процесс создания программы состоит из двух шагов: компиляции(ассемблирования) исходного текста, в результате получается объектный модуль *.OBJ и связывания (линковки) необходимых объектных модулей с объктными модулями из библиотек, если на них указывают внешние ссылки. Все это объединяется в одном файле.
dll от слов dynamic loaded library. Это тоже библиотека, тут тоже лежат часто используемые подпрограммы, но они работают по другому. Они подгружаются динамически, по мере необходимости (могут сидеть в памяти постоянно).
Этим достигается уменьшение объема основной программы, возможность использования кода многими программами.
2. Может и есть способ, но не вижу смысла (это мое ИМХО). У них разное назначение
3. Если запрограммировать в ДОС-е несложное, то можно обойтись, если надо и можно использовать что-то ранее разработанное, то никак (зачем изобретать велосипед, тем более что порой он бывает довольно сложен)
Под Винду по любому без них не обойтись, там любой вызов подключается через библиотеку импорта. Ну а языки высокого уровня формируют исполняемый модуль только через lib-ы

---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 06.09.2005, 12:05
Оценка за ответ: 5

Отвечает: Sager
Здравствуйте, Ahab!
Не согласен с экспертом Лысков Игорь Витальевич, обойтись без *.lib файлов
можно, вот тебе простой пример - вирусы. Чтобы это все реализовать находишь
Image Base kernel32.dll в памяти, для этого нужно получить какой-нибудь адрес
в памяти kernel32.dll, например в начале программы написать следующее:
mov ebp,[esp]
т.к. наша программа запускается функцией CreateProcess, то в стеке лежит
адрес возврата в кернел32, затем отнимаем по 10000h и смотрим, первые два
байта - это "PE" - если да, то нашли базу. Дальше находим таблицу экспорта и
путем еще кое-каких преобразований(долго описывать, формат PE для этого еще
надо знать хорошо(тебе)) находим GetProcAddress. А потом с помощью этой
функции находим LoadLibrary и спокойно загружаем другие длл и можем спокойно
находить их адреса и юзать АПИ'шные функции.
После компиляции в exe-файле будут вызовы функций из длл, функции не копируются в exe-файл,при запуске exe-файла, загружается и длл, а потом просто exe из нее и вызывает функции.
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 06.09.2005, 16:23
Оценка за ответ: 5
Комментарий оценки:
Интересно... В целом я вот что хотел спросить - во всех мануалах что у меня есть просто как отче наш говорится что для компиляции нужен *.inc файл (и описывается что он из себя представляет, как его можно сделать самостоятельно) и аналогичный *.lib файл который "поставляется с любыми средствами разработки для Win32, или можно воссоздать из соответствующих системных длл" и всё... Можно принять как аксиому и не задумываться, но хотелось бы всё же понять что такое *.lib файл, а не просто запомнить что это библиотека функций и т.п. вот я и спросил - зачем *.либ и что это вообще, почему не сделали в асме cразу что нибудь вроде " includeDLL C:Windows*.dll "


Вопрос № 25.912
Question:

Два модуля в приложении:
Объектные модули создаются, т.е. получаются
два объекных модуля mod1.obj, mod2.obj
а линковаться нехотят.
Вот, что выводит компоновщик:

Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: mod1.ASM
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 440k
Assembling file: mod2.asm
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 445k

Files assembled: 2 Fatal errors: 0 Errors: 0 Warnings: 0
Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
Error: Undefined symbol SUBPRO in module MOD1.ASM
Error: Fixup overflow at CSEG:0101, target = VALUE in module MOD2.ASM
Error: Fixup overflow at CSEG:0105, target = QTY in module MOD2.ASM
Error: Fixup overflow at CSEG:010A, target = PRICE in module MOD2.ASM

Приложение:

Отправлен: 06.09.2005, 11:21
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Вася Пупкин!
проставь GLOBAL SUBPRO во втором модуле.
два раза не нужно PUBLIC в первом модуле..


---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 06.09.2005, 11:33

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

В модуле 2 не написал PUBLIC SUBPRO
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 06.09.2005, 13:32
Оценка за ответ: 5
Комментарий оценки:
Вы правы!


Вопрос № 25.914
Добрый день Эксперты и приятного аппетита!!!!!!!!
Вопросик такой-вот.....
Есть такая програмка в винде DEBUG.EXE так вот значит возможно ли изменить её формат а имменно с ЕХЕ на СОМ чтобы она работала под досом?
может с помощью дисассемблера???
Помогите!!!
Заранее спасибо!!!!!!!!!
Отправлен: 06.09.2005, 11:33
Вопрос задал: PRiSon (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, PRiSon!

Проблема не в EXE/COM, а в том, что тебе надо найти ДОС на дискете, там все есть.
Дело в том, что DEBUG проверяет версию ОСи.
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 06.09.2005, 12:17
Оценка за ответ: 4
Комментарий оценки:
Спасибо я уже скачал DEBUG.COM


Вопрос № 25.917
Вот, что мне нужно:
Имеются данные:
DATAX DW 0148h
DW 2316h
DATAY DW 0237h
DW 4052h

Нужно двойное слово, начинающееся с адреса DATAX, т.е. 01482316h умножить на слово DATAY, причем используя только 16-ые регистры процессора.
Вообще представления не имею, как это сделать? :-(
Отправлен: 06.09.2005, 12:09
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

Умножение - это просто.
Смотри: X = 2^16*A + B; Y = 2^16*C + D
Тогда Z = X * Y = (2^16*A + B) * (2^16*C + D) = 2^32*A*C + 2^16*(A*D + B*C) + B*D

Т.е. для представления результата тебе нужен 64-х разрядный регистр. Его можно смоделировать с помощью 4-х 16-тиразрядных: DX:CX:BX:AX, причем в DX будут старшие 16 разрядов, а в AX - младшие.

У тебя будет 4 32-х разрядных частичных произведения: A*C, A*D, B*C и B*D.

Заводишь 4 переменных для этого.

В приложении смотри код.

Ты уверен, что тебе нужно умножать именно такие числа? Вообще-то, в памяти обычно числа "перевернуты", т.ч. у тебя в стандартной интерпретации написаны числа 23160148h и 40520237h.

Разберись с этим, а я напишу для случая, как ты описал, т.е. старшее слово по младшему адресу.

Приложение:

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени

Ответ отправил: Ayl (статус: Профессор)
Отправлен: 06.09.2005, 14:00


Вопрос № 25.919
Вроде все правилно, а выходит ошибка при компоновке:

Error: Fixup overflow at CSEG:0106, target = SUBPRO in module MOD1.ASM

Приложение:

Отправлен: 06.09.2005, 12:15
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Вася Пупкин!
не пишите два раза org 256
только в одном модуле
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 06.09.2005, 12:22

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

1. Поставь модель: .MODEL TINY
2. Убери из второго модуля ORG 100h - это там явно лишнее.
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 06.09.2005, 14:03
Оценка за ответ: 5


Вопрос № 25.924
Убрал из второго модуля org 100h
Да и с первого тоже пробовал.
Все таже ошибка:
Error: Fixup overflow at CSEG:0106, target = SUBPRO in module MOD1.ASM

Приложение:

Отправлен: 06.09.2005, 13:38
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

Модель поставь TINY. Компилятор не может правильно определить тип вызываемой подпрограммы.
Модель укажи в обоих модулях. Либо указывай явный тип подпрограммы: NEAR или FAR.
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 06.09.2005, 14:05
Оценка за ответ: 5
Комментарий оценки:
Все как сказали сделаю!


Вопрос № 25.935
Вопрос:

Модель TINY поставил.
Объектные модули создаются, а компановщик снова выдает три ошибки:

Error: Fixup overflow at CSEG:0001, target = VALUE in module MOD2.ASM
Error: Fixup overflow at CSEG:0005, target = QTY in module MOD2.ASM
Error: Fixup overflow at CSEG:000A, target = PRICE in module MOD2.ASM

Приложение:

Отправлен: 06.09.2005, 15:47
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

Определяй сегменты как CSEG segment PARA PUBLIC 'CODE'
Похоже, что по умолчанию они не могут объединяться...
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 06.09.2005, 18:06

Отвечает: Стас
Здравствуйте, Вася Пупкин!

Никогда не любил segment's... :)

А так сойдет?

Приложение:

Ответ отправил: Стас (статус: Практикант)
Отправлен: 07.09.2005, 00:46


Вопрос № 25.945
При загрузке DOS EXE программы в дебагер Tasm5.0 (под DOS6.22) Видим что неверно установлено значение указателя DS и программа не работает.
После исправления значения в регистре все работает. Где Ошибка

Приложение:

Отправлен: 06.09.2005, 18:23
Вопрос задал: CondorMVG (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Вiктор
Здравствуйте, Маслов Вячеслав Георгиевич!
REG_STATUS - вы это объявляли? я у вас в коде объявления не нашёл.
попробуйте в самом начале проги занести в DS адрес сегмента данных:
MOV AX, DATASEG (или как там сегмент данных называется?)
MOV DS, AX

---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 06.09.2005, 19:17

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Маслов Вячеслав Георгиевич!

Очевидно, что в результате выполнения LDS, DX, FILE_NAME
Команда LDS предполагает, что по указанному адресу лежит длинный указатель:
первое слово загружается в указанный регистр, а второе в DS.
А что у нас? FILE_NAME - строковая переменная :(
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 06.09.2005, 19:26

Отвечает: Ayl
Здравствуйте, Маслов Вячеслав Георгиевич!

Ошибка в неинициализации регистра DS. При старте EXE-программы сегментные регистры устанавливаются следующим образом:
CS - из соответствующего поля заголовка
DS - на сегмент PSP
SS - из соответствующего поля заголовка
ES - на сегмент PSP

Таким образом, в начале программы нужно переопределить сегментный регистр:
mov ax, @DATA
mov ds, ax

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 07.09.2005, 16:37


Вопрос № 25.949
Следовал всем инструкциям учебника,пытался ассемблировать prog01.asm,а
ML.EXE Выдаёт fatal error A1000: cannot open file:prog01.ASMAT
также пробовал таsмом не получается.
help....
Отправлен: 06.09.2005, 19:11
Вопрос задал: DIMMMA (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Вiктор
Здравствуйте, DIMMMA!
вопрос уже задавался. Смотри архив рассылки:
http://rusfaq.ru/?Step=info&Action=Question&ID=25823
http://rusfaq.ru/?Step=info&Action=Question&ID=25820
http://rusfaq.ru/?Step=info&Action=Question&ID=25950


---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 06.09.2005, 19:31

Отвечает: Sager
Здравствуйте, DIMMMA!
потому что ты пишешь prog.asm /AT слитно, а надо раздельно(пробел после prog.asm).
cannot open file - не могу открыть файл prog.asm/AT(нету такого файла, а если поставишь пробел, то все будет ок) и путь к файлу не забывай указывать, если он находится на диске С, в каталоге programs, То пиши так C:Programsprog.asm.
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 07.09.2005, 06:35

Отвечает: Ayl
Здравствуйте, DIMMMA!

Пробел надо ставить между именем программы и опцией /AT
А с TASM'ом что не получается?
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 07.09.2005, 16:39


Вопрос № 25.950
Следовал всем инструкциямучебника,пытался ассемблировать prog01.asm,а
ML.EXE Выдаёт fatal error A1000: cannot open file:prog01.ASMAT
help........
Отправлен: 06.09.2005, 19:14
Вопрос задал: DIMMMA (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Калашников О.А.
Здравствуйте, DIMMMA!
Вы какой учебник смотрели?
Ассемблирование так:
ml.exe pro01.asm /AT
Скопируйте эту строку и вставьте в командную строку БЕЗ изменений!
В учебнике (если он бумажный) читайте приложения...
---------
Всё отлично!!!
Ответ отправил: Калашников О.А. (статус: *Админ)
Отправлен: 06.09.2005, 19:24

Отвечает: Вiктор
Здравствуйте, DIMMMA!
вопрос уже задавался. Смотри архив рассылки:
http://rusfaq.ru/?Step=info&Action=Question&ID=25823
http://rusfaq.ru/?Step=info&Action=Question&ID=25820

---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 06.09.2005, 19:30


Вопрос № 25.951

Задам вопрос теоритически:
Имеются два модуля м1 и м2.
В модуле м1 определено три переменных: "db, dw, dw"
Как их использовать в модуле м2?

В модуле м1 указаны следующие директивы:
PUBLIC "db, dw, dw"
EXTRN "имя процедуры модуля м2, которая использует переменные модуля м1 и

вызывается в процедуре модуля м1"

В модуле м2 указаны следующие директивы:
EXTRN "db, dw, dw"

Теория верна?
Вродебы верна!
При использовании переменных, процедурой модуля м2 из модуля м1,
выходит ошибка при компановке: Системное переполнения регистра CS.
Ошибка: Системное переполнение CS:offset переменная, которую использовал.
В обоих модулях указана модель TINY
TINY — код, данные и стек размещаются в одном и том же сегменте размером до 64

Кб.
Отправлен: 06.09.2005, 19:39
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

А где во втором модуле определение PUBLIC "имя процедуры"?
Кроме этого, при определении сегмента не забывай указывать аттрибут PUBLIC, чтобы линкер смег их объеденить.
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 07.09.2005, 16:41


Вопрос № 25.955
Я задовал вопрос:
Команда JMP начинается начинается на 0624h. Мне нужно определить адрес прохода,
если 16-ый объектный код для операнда кманды JMP:

27h
6Bh
C6h

Мне ответили
переходы 27h и 6Bh - положительные, а C6h - отрицательный.

27h: 0626 + 27 = 064D
6Bh: 0626 + 6B = 0691
C6h: 0626 + FFC6 = 05FC

Потому, что С6 превышает 128?
Отправлен: 06.09.2005, 20:00
Вопрос задал: Вася Пупкин (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Вася Пупкин!

Присоединяюсь к замечанию в мини-форуме Евгения Иванова :)

По сути могу добавить, что адрес перехода (а не прохода !) вычисляется как сумма значения операнда и адреса СЛЕДУЮЩЕЙ команды за JMP. Т.е. ко всем значениям надо добавить 2 (длина команды короткого jmp-а)
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 07.09.2005, 09:50

Отвечает: Ayl
Здравствуйте, Вася Пупкин!

Прохода или перехода? Прохода - не определишь, а с переходом можно.
Пусть команда JMP начинается по адресу XXXX. И переход короткий (т.е. в пределах от -128 до +127 байт).
Тогда, если значение второго байта команды JMP равно YY, то адрес точки перехода будет равен:
XXXX + 2 + ZZZZ, где ZZZZ = 00YY, если YY больше 0, и FFYY, если YY меньше 0.

У тебя 27h и 6Bh больше 0, а C6h - меньше, потому что старший бит равен 1.

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 07.09.2005, 16:49
Оценка за ответ: 5
Комментарий оценки:
Все понятно, но я постоянно путаюсь. :-(


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное