Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Инициализация переменных

Вопрос:
У меня дана задача (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

   Вперёд
   Содержание