Загрузка данных
TITLE LAB2_2 KORNEEV VV
.386 ; Включаем набор инструкций 80386 для поддержки 32-битных регистров (EAX, ESI и т.д.)
.model small
.stack 512
.data
den DB 18
qwer DW 4321h
mes DW 12
Mas_1 DB 12 dup (19)
Mas_2 DW 20 dup (?)
stroka DB 'Korneev', '$'
; Переменные с доски (с суффиксом 1 во избежание конфликтов имен):
B1 DB 'a' ; Байт (1 байт)
W1 DW 2 ; Слово (2 байта)
D1 DD 1 ; Двойное слово (4 байта)
Q1 DQ 3 ; Четверное слово (8 байт)
.code
start:
; настраиваем сегмент данных
mov ax, @data
mov ds, ax
; год в di
mov di, 07D6h
; грузим переменные в регистры
mov al, den
mov cx, mes
mov ax, mes
mov es, ax
; закидываем в стек den и mes
xor ah, ah
mov al, den
push ax
mov ax, mes
push ax
; меняем qwer и mes местами
mov ax, qwer
xchg ax, mes
mov qwer, ax
; адрес den -> si
lea si, den
; копируем ds в es через стек
push ds
pop es
pop dx ; сюда падает mes
pop cx ; сюда падает den
; вывод фамилии
mov ah, 09h
lea dx, stroka
int 21h
; =========================================================================
; ДОПОЛНЕНИЕ К КОДУ (команды из задания):
; =========================================================================
; а) MOV B, AX
; Ошибка: несовпадение размеров (B1 — 1 байт, AX — 2 байта).
; Решение: mov B1, al (или mov word ptr B1, ax)
; mov B1, ax
; б) MOV W, AX
; Корректно: W1 (слово) и AX (слово) имеют одинаковый размер (2 байта).
mov W1, ax
; в) MOV AX, W
; Корректно: AX (слово) и W1 (слово) имеют одинаковый размер (2 байта).
mov ax, W1
; г) XCHG ESI, B-1
; Ошибка: несовпадение размеров операндов (ESI — 4 байта, ячейка B1-1 — 1 байт).
; Решение: xchg esi, dword ptr [B1-1]
; xchg esi, B1-1
; д) MOV EAX, BL
; Ошибка: несовпадение размеров операндов (EAX — 4 байта, BL — 1 байт).
; Решение: movzx eax, bl или mov al, bl
; mov eax, bl
; е) MOV B, 80h
; Корректно: 80h помещается в 1 байт переменной B1.
mov B1, 80h
; ж) XCHG AH, AL
; Корректно: обмен значениями двух 8-битных регистров.
xchg ah, al
; з) MOV SI, W+1
; Корректно: чтение 2-байтного слова по смещению (W1+1) в 16-битный регистр SI.
mov si, W1+1
; и) MOV B, W-B
; Корректно: разность смещений (W1 - B1) вычисляется ассемблером как константа
; и помещается в 1-байтовую переменную B1.
mov B1, W1-B1
; к) XCHG D, ECX
; Корректно: D1 (двойное слово, 4 байта) и ECX (32-битный регистр) равны по размеру.
xchg D1, ecx
; л) MOV D, ESI+1
; Ошибка: транслятор не может сложить 32-битный регистр с числом в виде адреса (ESI+1).
; Решение (если нужен результат сложения): lea edx, [esi+1] / mov D1, edx
; Решение (если чтение из памяти по адресу): mov D1, [esi+1]
; mov D1, ESI+1
; м) XCHG B, 125
; Ошибка: команда XCHG не работает с непосредственным операндом (числом).
; Решение: mov B1, 125
; xchg B1, 125
; н) MOV Q, 0
; Ошибка: размер непосредственного операнда 0 неочевиден для 64-битной переменной Q1
; (команда MOV в x86 не поддерживает прямую загрузку 64-битного числа).
; Решение: обнулить через 32-битные части:
; mov dword ptr [Q1], 0
; mov dword ptr [Q1+4], 0
; mov Q1, 0
; о) XCHG B, B+1
; Ошибка: команда XCHG не может работать с двумя операндами из памяти одновременно.
; Решение: переслать через регистр (mov al, B1 / xchg al, [B1+1] / mov B1, al)
; xchg B1, B1+1
; п) MOV EAX, W-B
; Корректно: разность смещений (константа) загружается в 32-битный регистр EAX.
mov eax, W1-B1
; р) MOV W, W+2
; Ошибка: два операнда в памяти (W1 — память, W1+2 — адрес в памяти).
; Решение: через регистр (mov ax, [W1+2] / mov W1, ax)
; mov W1, W1+2
; с) MOV B, byte ptr ECX
; Ошибка: недопустимый операнд — byte ptr не применяется напрямую к 32-битному регистру.
; Решение: mov B1, cl (или mov B1, byte ptr [ecx], если ECX используется как указатель)
; mov B1, byte ptr ecx
; ц) MOV word ptr Q, 12
; Корректно: явное указание размера (word ptr, 2 байта) в младшую часть переменной Q1.
mov word ptr Q1, 12
; ч) MOV Q, word ptr 2
; Ошибка: во-первых, попытка обращения в память по абсолютному адресу 2;
; во-вторых, пересылка «память — память» не поддерживается архитектурой x86.
; Решение: mov ax, ds:[2] / mov word ptr [Q1], ax
; mov Q1, word ptr 2
; ш) MOV dword ptr B, 12345h
; Корректно: явное переопределение размера (dword ptr, 4 байта) по адресу переменной B1.
mov dword ptr B1, 12345h
; =========================================================================
; выход в DOS
mov ax, 4c00h
int 21h
end start