Задача по ассемблеру
Текст задания
Задание 4.1. Создайте массив из 100 слов и программно заполните его последовательностью квадратов натуральных чисел (1, 4, 9 и т. д.). Выведите полученный массив на экран в виде таблицы 10×10 с фиксированной шириной столбцов:
Текст программы
.model small
.stack 100h
.386 ;Разрешение трансляции команд процессора 386
.data
mas db 100 dup (0) ;исходный массив
.code
start:
mov ax, @data
mov ds, ax
mov ax, 0 ;обнуление ax
mov cx, 100 ;значение счетчика цикла
mov al, 1 ; счётчик для значений массива
mov si, 0 ;индекс начального элемента в cx
go: ;цикл инициализации
mov mas[si], al ;запись в массив
inc al ;увеличение значения следуещего элемента массива на единицу
inc si ;переход к следующему элементу
loop go ;повторить цикл
mov si, 0 ;переход к 1-му элементу
mov cx, 10
show1: ;цикл вывода элементов массива на экран
push cx
mov cx, 10
show2:
mov al, mas[si] ;значение элемента массива помещается в AL
mov ah, 0 ;AH = 0
mul ax ;возведение в квадрат
call print ; вызов функции вывода числа в AX на экран
inc si ;переход к следующему элементу
loop show2
pop cx
mov dl, 0DDh ;переход на следующую строку
call pr
mov dl, 0DAh
call pr
loop show1
mov ax,4C00h ;завершение программы
int 21h
print proc ;процедура для вывода элеманта массива на экран
pusha
;вывод пробелов перед каждым числом
pusha
mov bx, 0
label0:
inc bx
mov dx, 0
mov cx, 10
div cx
cmp ax, 1
jnc label0
neg bx
add bx, 6
mov cx, bx
lab:
mov dl, 0D0h
call pr
loop lab
popa
;вывод символа на экран
mov cx, 0
label1:
mov dx, 0
mov bx, 10 ;Заносим основание системы счисления, равное 10, в регистр BX
div bx ;деление AX на BX
mov bx, 0
push dx
inc cx
cmp ax, 0 ;сравнение AX с нулём
jnz label1 ;если условие выполняется, то переход на метку label1
label2:
pop dx
call pr ;вывод на экран символа
inc bx
loop label2 ;повторение с метки label2, пока значение CX не станет равно нулю
popa
ret
print endp
pr proc ;процедура, выводящая символ на экран
mov ah, 02h
add dl, 30h
int 21h
ret
pr endp
end start
Контрольные вопросы
1. Пусть имеется массив: simple DW 100 DUP(?). Для доступа к отдельным элементам массива используется адресное выражение simple[DI]. Как называется этот способ адресации и как с его помощью будет вычисляться адрес элементов массива?
Ответ: Косвенная адресация. База в DS + смещение в DI.
2. Каким образом осуществляется перебор элементов некоторого массива A с помощью адресного выражения A[DI], если массив состоит из байтов, слов или двойных слов.
Ответ: К адресу базы прибавляется смещение. При переборе элементов, к смещению прибавляется 0Fh, 0FFh или 0FFFFh для байтов, слов и двойных слов соответственно.
3. Для массива simple каким будет результат выполнения команды mov simple, BX?
Ответ: В регистр AX будет помещено значение того элемента массива, который указан в DS.
4. Для некоторого массива A каким будет результат выполнения команды mov DI, A и команды mov DI, offset A?
Ответ: В 1-м случае в DI будет помещено значение элемента массива A, который указан в DS, а во 2-м случае – эго смещение.
5. Какие действия выполняют команды организации цикла?
Ответ: При каждой встрече с оператором loop, ассемблер сравнивает регистр CX с нулём, и если он ему не равен, то значение CX уменьшается на 1 и происходит переход к нужной метке.
6. Пусть в регистре BX находится адрес i-ого элемента байтового массива A, т. е. адрес A[i]. Как записать в BX индекс этого элемента, т. е. i?
Ответ: mov bx, si