|
Ассемблер в примерах - Работа с символами и массивами
- Вопрос:
- нужно сделать 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
| |