|
Ассемблер в примерах - Инициализация переменных
- Вопрос:
- У меня дана задача (4*b+ 1 - c)/(a/2+ b*c). Я не знаю как мне выполнить ввод чисел в каждую из этих переменных. Я объявил их двухбайтовыми
a DW ?
b DW ?
c DW ?
А как можно ввести в них значения, при каждом запуске программы, с клавиатуры?
- Ответ:
-
Решение задачи в приложении.
Необходимо получить исполняемый файл формата СОМ
.model tiny
; необходимо получить файл формата СОМ
; модель tiny = крошечная - это модель памяти только формата СОМ
; вычисления по формуле (4*b + 1 - c)/(a/2 + b*c)
; деление целочисленное, т.е. остаток от деления отбрасывается
.code
org 100h
start:
mov ax, 3
int 10h ; инициализируем текстовый режим
; нужно в ХР, чтобы информация отображалась
mov ax, b
mov bx, 4
mul bx ; умножаем содержимое ax на bx, результат в ax+dx
; будем полагать, что результат "поместится" в ax
inc ax ; добавим к результату 1
sub ax, c ; теперь в ax 4*b + 1- c
mov rez, ax ; сохраним
; вычислим знаменатель
mov ax, b
mov bx, c
imul bx ; умножение чисел со знаком
mov cx, a
shr cx, 1 ; сдвиг направо равносильно делению на 2
add ax, cx
; делим dx:ax на bx
xor dx, dx ; обнулим dx
mov bx, ax ; делитель в bx
mov ax, rez
idiv bx ; деление чисел со знаком
mov rez, ax
; Вызов подпрограммы отображения содержимого AX - результата вычислений
CALL WriteWordDEC_signed
; вывод информации о том, что нужно нажать клавишу
lea dx, PressKey
mov ah,9
int 21h
; вызов функции ожидания нажатия клавиши
xor ax, ax
int 16h
; прерывание, которое выполняет выход из СОМ-файла
int 20h
a dw 4
b dw 5
c dw -1
rez dw ?
writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
; производится деление на 10 и запоминаются остатки в стеке
; а потом выводятся в обратном порядке
push ax
push bx
push dx
push cx
mov bx, 10
xor cx, cx
@@1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz @@1
@@2:
pop ax
; учитывается, что число и символ числа различаются на значение, равное коду нуля
add al, '0'
int 29h
LOOP @@2
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp
WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
; если число отрицательное, то выводится знак минус, число превращается в положительное
; и для вывода используется подпрограмма writeWordDEC
or ax, ax
jns @@_no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax ; изменение знака на +
@@_no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp
PressKey db 13,10,'Press any key ...$'
end start
| |