- •Машинно-зависимые языки программирования указатели на страницы ответов
- •1. Определения данных в программах на Ассемблере.
- •2. Целочисленные арифметические операции.
- •3. Арифметические операции в форматах bcd и ascii.
- •Xor ax, ax ; очистка ax
- •5. Сравнить программы exe и com.
- •6. Загрузка exe и com программ.
- •7. Формат exe-программы.
- •8. Использование сопроцессора (fpu).
- •9. Обработка массивов.
- •10. Обработка строк.
- •11. Машинное представление команд.
- •12. Структура процессора x86.
- •13. Формирование адреса, сегменты.
- •14. Формат программ на языке Ассемблера.
- •15. Команды условных и безусловных переходов.
- •16. Связь asm с Си и Pascal.
5. Сравнить программы exe и com.
EXE
1. Длина EXE-файла НЕ ограничена размером одного сегмента.
2. Есть сегмент стека, и может быть сегмент данных, если необходимо.
3. Все процедуры, включая главную, могут иметь как атрибут NEAR, так и атрибут FAR.
4. EXE-файл имеет заголовок размером в 512 байт.
5. Нужно специально готовить стек для возврата в DOS.
Код
.model LARGE
.stack
; Данные в стеке
.data
; Данные и резервируемая память
.code
main proc far
; Код главной функции
main endp
; Процедуры
end main
COM
1. Длина COM-файла ограничена размером одного сегмента (64 КБайт).
2. Нет сегмента стека и сегмента данных. Все данные определяются в сегменте кода.
3.Все процедуры, включая главную, должны иметь атрибут NEAR.
4. Модель COM-файлов: .model TINY.
5. Нужно устанавливать ORG 100h — значение начального смещения, поскольку DOS резервирует 256 байт для префикса программного сегмента (PSP).
Код
.MODEL TINY
.CODE
org 100h
start:
mov ah, 09h
lea dx, Msg
int 21h
ret
Msg db 'Hello, world', 13, 10, '$'
end start
(tasm <name>.asm, tlink /t <name>.obj)
6. Загрузка exe и com программ.
[1] слайды 240-259.
[2] стр. 313-316.
EXE-программа
COM-программа
7. Формат exe-программы.
[1] слайды 245-259.
[2] стр. 314-317.
CODESG SEGMENT PARA 'CODE'
BEGIN PROC FAR
ASSUME CS: CODESG, SS: STACKSG, DS: DATASG, ES: DATASG
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DATASG
MOV DS, AX
MOV ES, AX
; Дальнеший код
RET
BEGIN ENDP
; Процедуры
CODESG ENDS
STACKSG SEGMENT PARA STACK 'STACK'
; Стек
DB 12 DUP ('STACKSEG')
STACKSG ENDS
DATASG SEGMENT PARA 'DATA'
; Данные
DATASG ENDS
END BEGIN
8. Использование сопроцессора (fpu).
[1] слайды 225-239.
[2] стр. 266-304.
Все вычисления выполняются в 80-битном расширенном вещественном формате.
Загрузка данных в стек
FLD (FLOAT)
FBLD (BCD)
FILD (INT)
Копирование данных из стека
FST (FLOAT)
FIST (INT)
Извлечение данных из стека
FSTP (FLOAT)
FBSTP (BCD)
FISTP (INT)
Сложение
FADD (FLOAT)
FIADD (INT)
Вычитание
FSUB (FLOAT)
FISUB (INT)
Обратное вычитание
FSUBR (FLOAT)
FISUBR (INT)
Умножение
FMUL (FLOAT)
FIMUL (INT)
Деление
FDIV (FLOAT)
FIDIV (INT)
Реверсное деление
FDIVR (FLOAT)
FIDIVR (INT)
Остальное
FABS (модуль)
FSQRT (корень)
FCHS (смена знака)
9. Обработка массивов.
[1] слайды 218-224.
[2] стр. 206-212.
Сумма элементов одномерного массива в NUM2
XOR BX, BX
XOR AX, AX
FIN:
MOV AL, MYARR[BX]
ADD NUM2, AX
INC BX
CMP BX, 10
JB FIN
RET
Сумма элементов двумерного массива в NUM2
XOR BX, BX
XOR AX, AX
LOUT:
XOR SI, SI
LIN:
MOV AL, MYARR[BX][SI]
ADD NUM2, AX
INC SI
CMP SI, 10
JB LIN
INC BX
CMP BX, 10
JB LOUT
RET
10. Обработка строк.
[1] слайды 211-217.
[2] стр. 223-232.
DS:SI, ES:DI, DF flag (STD, CLD)
MOVSB ([SI] >>> [DI])
CMPSB ([SI] ~ [DI])
SCASB ([AL] ~ [DI]) | SCASW ([AX] ~ [DI])
LODSB ([SI] >>> [AL]) | LODSW ([SI] >>> [AX])
STOSB ([AL] >>> [DI]) | STOSW ([AX] >>> [DI])
REP (в CX счётчик)
Пример
LEA DI, NUM1 + 3 ; NUM1 DB '00000$'
CLD
MOV AL, '3'
STOSB
MOV AL, '4'
STOSB