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

Ассемблер в примерах - Работа с символами и массивами

Вопрос:
нужно сделать 3 задачки: 1 - Если введены символы с 0-9 вывести соощение "ето цифра!"
2 - Ввести символ, занулить в его коде 0,3,5,7 биты и вывести символ который получился
3 - Найти сумму положительных элементов массива. Элементы байты, кол-во 7


Ответ:
В приложении решение Вашей задачи
.model tiny
.code
org 100h
start:
   mov ax, 3
   int 10h

   lea dx, msg_new_symbol
   mov ah, 9
   int 21h
   
   mov ah, 1
   int 21h   ; функция DOS для ввода символа с ожиданием ввода
   cmp al, '0'
   jb @@1
   cmp al, '9'
   ja @@1
     lea dx, msg_yes
     mov ah, 9
     int 21h
@@1:   
  lea dx, new_line
  mov ah, 9
  int 21h
  
  lea dx, msg_new_symbol
  mov ah, 9
  int 21h
  mov ah, 1
  int 21h
  lea dx, new_line
  mov ah, 9
  int 21h
  and al, mask
  int 29h  ; вывод символа в AL
  
  lea dx, new_line
  int 21h
  int 21h
  
  xor bx, bx ; это будет сумма
  lea si, mass
  cld        ; будем использовать строковую инструкцию LODSB - очень удобно
  mov cx, 7  ; число элементов массива
@@2:
  lodsb      ; новый элемент массива в AL
  cbw
  CALL writeDEC
  or ax, ax
  js @@3     ; переход, если установлен знаковый бит
    cbw      ; преобразование байта в слово
    add bx, ax
@@3:
 LOOP @@2     
  
  lea dx, msg_summ
  mov ah, 9
  int 21h
  mov ax, bx
  CALL writeDEC
  lea dx, new_line
  mov ah, 9
  int 21h  
  
  lea dx, PressKey
  mov ah,9
  int 21h

  xor ax, ax
  int 16h

  int 20h
msg_new_symbol db 'Введите символ: $'  
msg_yes  db ' - это цифра!',13,10,'$'  
msg_summ db 13,10,'Сумма положительных элементов массива равна $'
new_line db 13,10,'$'
mask     db 01010110b

mass     db 1, -2, 3, 4, 12, -10, 3

writeDEC proc  ;процедура вывода десятичного представления числа со знаком
;  Ожидется слово для вывода в AX
  push ax
  push bx
  push cx
  push dx
  push di  ; сигнал отрицательного знака
 xor cx, cx
 mov bx, 10
 xor di, di ; 0 = положительное
 or ax, ax
 jns @@next_digit ; переход, если не отрицательное
  inc di
  neg ax
@@next_digit:
 xor dx, dx
 div bx
 push dx
 inc cx
 or ax, ax
 jnz @@next_digit
 
 mov dx, count_of_digits
 sub dx, cx
 or di, di
 jz @@_zer
     dec dx
   @@_zer: 
     push cx
     mov  cx, dx
     mov al, ' '
   @@next_space:
     int 29h
   loop @@next_space    
   pop  cx  
 or di, di
 jz @@next_char
   mov al, '-'
   int 29h
@@next_char:
 pop ax
 add al, '0'
 int 29h
 loop @@next_char  
  pop  di  
  pop  dx
  pop  cx
  pop  bx
  pop  ax
  ret
writeDEC endp  
count_of_digits  dw 8 ; обязательное число знаков - недостающие выведутся пробелами

PressKey db 'Press any key ...$'
end start

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