Помощь - Поиск - Пользователи - Календарь
Полная версия: Определение стека в Com-файлах
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
Terror13
Здравствуйте. Хочу задать вопрос: Если определение стека в СОМ-файлах отсутствует. Как ведет себя СОМ-файл с учетом этого обстоятельства?

Потогите мне Найти ответы на эти вопросы:

Определите ассемблерный шестнадцатеричный объектный код для:
а) DB 26h;
б) DW 2645h;
в) DD 25733Ah;
г) DQ 25733Ah.

Закодируйте следующие команды с непосредственными операндами:
а) загрузить 320 в регистр АХ;
б) сравнить поле FLDB с нулем;
в) прибавить 40h к содержимому регистра ВХ;
г) вычесть 40h из регистра СХ;
д) сдвинуть содержимое поля FLDB на один бит влево;
е) сдвинуть содержимое регистра СН на один бит вправо.

Команда JMP начинается на 0624h. Определите адрес перехода, если шестнадцатеричный объектный код для операнда команды JMP: С6.

Предположим, что регистры AX и BX содержат знаковые данные, а CX и DX – беззнаковые. Определите команды CMP (где необходимо) и команды безусловного перехода для следующих проверок:
а) значение в DX больше, чем в CX?
б) значение в BX больше, чем в AX?
в) CX содержит нуль?
г) было ли переполнение?
д) значение в BX равно или меньше, чем в AX?
е) значение в DX равно или меньше, чем в CX?

Буду просто ужастно рад.И от всей души благодарен.
blush.gif biggrin.gif
xds
Цитата
Если определение стека в СОМ-файлах отсутствует. Как ведет себя СОМ-файл с учетом этого обстоятельства?

Файлы формата COM всегда загружаются в блок размером 64 Кб, причём устанавливаются CS = DS = ES = SS = <первый параграф блока>. Перед запуском программы ОС устанавливает указатель стека SP равным 0, в стек опускается слово 0000h, а затем управление передаётся на адрес <первый параграф блока>:100h. Т. о., при запуске программа получает SP = 0FFFEh (SP = CS), 0 в вершине стека, а сам стек размещается в конце 64 Кб блока. Нулевое слово помещается в вершину стека для обеспечения возможности выхода из программы командой retn. По ней будет осуществлён переход на адрес CS:0000h, т. е. на начало PSP, первые два байта которого - 0CDh 20h, т. е. команда int 20h - завершение программы.
zloy_pes
1:
а) DB 26h; - 26
б) DW 2645h; - 45 26
в) DD 25733Ah; - 3A 73 25 00
г) DQ 25733Ah. - 3A 73 25 00 00 00 00 00

2:
а) загрузить 320 в регистр АХ; - mov ax,320
б) сравнить поле FLDB с нулем; - cmp FLDB,0
в) прибавить 40h к содержимому регистра ВХ; - add bx,40h
г) вычесть 40h из регистра СХ; - sub cx,40h
д) сдвинуть содержимое поля FLDB на один бит влево; - shl FLDB,1
е) сдвинуть содержимое регистра СН на один бит вправо. - shr ch,1

3:
а) значение в DX больше, чем в CX?
cmp dx,cx
ja <метка>
б) значение в BX больше, чем в AX?
cmp bx,ax
jg <метка>
в) CX содержит нуль?
cmp cx,0
je <метка>
г) было ли переполнение?
jo <метка>
д) значение в BX равно или меньше, чем в AX?
cmp bx,ax
jle <метка>
е) значение в DX равно или меньше, чем в CX?
cmp dx,cx
jbe <метка>
Вроде так smile.gif
Terror13
xds большое спасибо за помощь !hi.gif
zloy_pes я от всей души тебе благодарен. applause.gif !zdarov.gif

Помогите сделать еще вот эту задачку.
Команда JMP начинается на 0624h. Определите адрес перехода, если шестнадцатеричный объектный код для операнда команды JMP: С6.
xds
Цитата
Команда JMP начинается на 0624h. Определите адрес перехода, если шестнадцатеричный объектный код для операнда команды JMP: С6.

Видимо, имеется в виду "короткий" JMP (с относительной адресацией)? Тогда переход будет осуществлён на адрес 5ECh.

Адрес перехода считается так: <адрес перехода> = <адрес команды JMP> + 2 + <операнд как целое в дополнительном коде>. В нашем случае: 0С6h = -3Ah в доп. коде, <адрес перехода> = 624h + 2 - 3Ah = 5ECh.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.