Решение задачи по ассемблеру
Системное программирование
Задание 3
Текст задания
Задание 3.1. В регистре AX задано число от 0 до 65535. Выведите это число на экран.
Задание 3.2. Используя 32-битные регистры процессора, напишите программу, выводящую на экран число 65536.
Задание 1
Текст программы
.model small
.stack 100h
.386 ;Разрешение трансляции команд процессора 386
.code
start:
mov ax, 65530 ;Заносим число 65530 в регистр AX
mov bx, 10 ;Заносим основание системы счисления, равное 10, в регистр BL
mov cx, 0 ;значение CX обнулятется
label1: mov dx, 0 ;устанавливается метка label1, значение DX обнуляется
div bx ;деление AX на BX
push dx ;сохранение значения регистра DX в стеке
add cx, 1 ;добавление к CX единицы
cmp ax, 0 ;сравнение AX с нулём
jnz label1 ;если условие выполняется, то переход на метку label1
label2: pop dx ;метка label2, сохранение DX в стеке
call print ;вывод DL на экран
loop label2 ;повторение с метки label2, пока значение CX не станет равно нулю
mov ax,4C00h ;завершение программы
int 21h
print proc ;процедура для вывода значения DL на экран
push ax
mov ah, 02h
add dl, 30h
int 21h
pop ax
ret
print endp
end start
Задание 2
Текст программы
.model small
.stack 100h
.386
.code
start:
mov eax, 65536 ;Заносим число 65536 в регистр EAX
mov bx, 10 ;Заносим основание системы счисления, равное 10, в регистр BX
mov cx, 0 ;значение CX обнулятется
label1: mov edx, 0 ;устанавливается метка label1, значение EDX обнуляется
div ebx ;деление EAX на EBX
push edx ;сохранение значения регистра EDX в стеке
add cx, 1 ;добавление к CX единицы
cmp eax, 0 ;сравнение EAX с нулём
jnz label1 ;если условие выполняется, то переход на метку label1
label2: pop edx ;метка label2, сохранение EDX в стеке
call print ;вывод DL на экран
loop label2 ;повторение с метки label2, пока значение CX не станет равно нулю
mov eax, 4C00h
int 21h
print proc
push eax
mov ah, 02h
add dl, 30h
int 21h
pop eax
ret
print endp
end start
Контрольные вопросы
1. По какой схеме выполняется операция деления?
Ответ: Байтовая команда делит 16-битовое делимое на 8-битовый делитель. Делимое находится в регистре AX. В результате деления получается два числа: частное помещается в регистр AL, а остаток – в AH.
2. Как формируется машинный код для команд безусловного перехода типа SHORT, NEAR и FAR?
Ответ: Безусловному переходу соответствует команда JMP, она осотовляется по шаблону «jmp метка». Эта команда может осуществлять переход вплоть до 32768 байт. Если команда, на которую делается переход находится в том же сегменте памяти, что и команда jmp – переход называется внутрисегментным или ближним (near jmp). Если при этом адрес перехода находится в пределах от -128 до +127 байтов от команды jmp – такой переход называется коротким (short jmp). При использовании short jmp и near jmp изменяется только значение в регистре IP. Если команда находится в каком-либо другом сегменте программы – такой переход называется межсегментным или дальним (far jmp) – изменяется значение в регистре IP, а также значение CS.
3. Каковы условия перехода для чисел со знаком и для чисел без знака?
Ответ: Чтобы сделать из положительного числа отрицательное, необходимо инвертировать все его биты и затем к младшему разряду прибавить единицу.
4. С помощью команд условного и безусловного перехода выполните программную реализацию алгоритма ветвления для определения наименьшего числа из двух заданных.
R1 — первое число хранится в регистре AX;
R2 — второе число хранится в регистре BX;
R3 — результат заносится в регистр DX;
vr2, cont — метки команд.
Ответ:
cmp ax, bx
jl vr2
mov dx, bx
jmp cont
vr2: mov dx, ax
cont:
5. Какие действия выполняют команды организации цикла?
Ответ: При каждой встрече с оператором loop, ассемблер сравнивает регистр CX с нулём, и если он ему не равен, то значение CX уменьшается на 1 и происходит переход к нужной метке.
6. Какой диапазон образуют знаковые числа, которые можно умножать на 2 путем сдвига в одном байте?
Ответ: (n+1) – разрядный прямой код (n цифровых разрядов и один знаковый) позволяет представлять целые числа в диапазоне
[-(2n-1); 2n-1].
7. Как с помощью команды сдвига проверить содержимое регистра AH на четность?
Ответ: Командой shr ah, 1 выполнить логический сдвиг вправо на 1 и затем узнать значение флага CF. Если он = 1, то число чётное, в противном случае – нечётное.