Восьмой и девятый абзацы
ms: ;создание чисел из разрядов числа т.к. считывание с клавиатуры происходит поразрядно
xor dx,dx
mul x
xor dx,dx
mov dl,middle1[bx]
add ax,dx
inc bx
inc ch
cmp ch,03h
jle ms
mov y, bx
mov bx, z
mov middle2[bx], ax
xor ax,ax
inc bx
inc bx
mov z, bx
mov bx, y
inc cl
xor ch, ch
cmp cl, 09h
jle ms
Данный кусок программы предназначен для создания из массива middle1, содержащего 40 однобайтных чисел, массива middle2, состоящего из 10 двухбайтных чисел!!!! блеа
В основу данного фрагмента программы положен принцип умножения четырехбитного двоичного числа (от 0 до 15) на 16 (в шестнадцатеричном виде 16=10h= «х» переменная, объявленная в начале).
Дело в том, что у нас есть четыре числа со значениями от 0 до 15 или от 0000 до 1111; из них мы должны получить одно двухбайтовое число. Например у нас есть числа 1, A, 9, C, которые мы объединяем в число 1A9Ch (h на конце значит в шестнадцатеричном виде).
Особенность умножения на 16, покажу на примере:
14= 0000 1110 (14=000Dh)
14*16=1110 0000 (14*16= 00D0h)
Таким образом видим, что при умножении на 16 разряды смещаются в лево, оставляя после себя нули.
Еще раз о том, как работает данный фрагмент программы!
Например, нам надо превратить четыре бита 1 A 9 С, в двухбайтное число 1А9С.
Алгоритм:
Создаем число 0000 0000 0000 0000 = 0000h
Прибавляем к нему 1 0000 0000 0000 0001 = 0001h
Смещаем, умножая на 16 0000 0000 0001 0000 = 0010h
Прибавляем A 0000 0000 0001 1010 = 001Ah
Cмещаем, умножая на 16 0000 0001 1010 0000 = 01А0h
Прибавляем 9 0000 0001 1010 1001 = 01А9h
Смещаем, умножая на 16 0001 1010 1001 0000 = 1А90h
Прибавляем С 0001 1010 1001 1101 = 1А9Сh
ну чтож …. перейдем к программе
ms: ;создание чисел из разрядов числа т.к. считывание с клавиатуры происходит поразрядно
xor dx,dx ;dx = 0
mul x ; mul это операция умножения с одной особенностью, результат идет
; в регистр АХ. То есть АХ=АХ * Х.
; В ввиду того, что х=16, выполняется смещение
xor dx,dx ;dx = 0 (НАХРЕНА еще раз? не знаю)
mov dl,middle1[bx] ;Записываем в регистр dl число (одно из четырех)
add ax,dx ; Прибавляем в конец число. Например из 0000h получаем 0001h
inc bx ; увеличиваем bx на 1
inc ch ; увеличиваем сh на 1
cmp ch,03h ; сравниваем ch c числом 3
jle ms ; повторяем процедуру «ms» ровно четыре раза (пока ch <= 3)
mov y, bx
mov bx, z
mov middle2[bx], ax
xor ax,ax
inc bx
inc bx
mov z, bx
mov bx, y
inc cl
xor ch, ch
cmp cl, 09h
jle ms
masm ;режим работы TASM
model small
stack 256 ;выделение памяти для стэка
.data ;начало сегмента данных
input db 40 dup(0)
middle1 db 40 dup(0)
output db 4 dup(0)
middle2 dw 10 dup(0)
output3 db 4 dup(0)
x dw 010h
y dw 1 dup (0)
z dw 1 dup (0)
.code ;начало сегмента кода
main: ;начало процедуры main
mov ax, @data ;аносим адрес сегмента данных в регистр AX
mov ds, ax ; AX в Ds
xor ax,ax ;очистка регистров
xor bx,bx
xor dx,dx
xor cx,cx
m0:
mov ah, 01h
int 21h
mov input[bx],al
inc bx
inc dl
cmp dl, 03h
jle m0
call LF0D ;вызов процедуры "перевод строки - возврат каретки"
inc dh
xor dl,dl
cmp dh, 09h
jle m0
xor bx,bx
xor dx,dx
man: ;преобразование ASCII кода в числа в 16ричный формат
mov dl, input[bx] ;запись в dl ASCII-кода из массива input
cmp dl, 60h
jle man0
sub dl, 57h ;если разряд равен a..f, то вычесть из него 57h
jmp man2
man0: cmp dl, 40h ;сравнение разряда с 40h
jle man1
sub dl, 37h ;если разряд равен A..F, то вычесть из него 37h
jmp man2
man1: sub dl, 30h ;если разряд равен 0..9, то вычесть из него 30h
man2:
mov middle1[bx], dl
inc bx
inc cl
cmp cl, 27h
jle man
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
ms: ;создание чисел из разрядов числаб т.к. считывание с клавиатуры происходит поразрядно
xor dx,dx
mul x
xor dx,dx
mov dl,middle1[bx]
add ax,dx
inc bx
inc ch
cmp ch,03h
jle ms
mov y, bx
mov bx, z
mov middle2[bx], ax
xor ax,ax
inc bx
inc bx
mov z, bx
mov bx, y
inc cl
xor ch, ch
cmp cl, 09h
jle ms
xor dx,dx
xor bx,bx
xor cx,cx
msum:
add ax,middle2[bx] ;сложение элементов массива в цикле
adc dx,0h
inc bx
inc bx
cmp bx,013h
jle msum
mov bx,0Ah ;деление (нахождение ср арифм)
div bx
xor dx,dx
mov bx,03h
mss:
mov dx,ax ;разбивка результата по разрядам с занесением в память
and dx, 0fh
mov output[bx],dl
xor dx,dx
div x
dec bx
inc ch
cmp ch,03h
jle mss
xor bx,bx
mna: ;преобразование цифр в ASCII код для вывода на экран
mov al,output[bx]
cmp al, 9h ;сравнение младшего разряда с 09h
jle num1
add al,37h ;если разряд равен A..f, то тприбавить к нему 37h
jmp ext1
num1: add al,30h ;если разряд равен 0..9, то прибавить к нему 30h
ext1:
mov output3[bx],al
inc bx
cmp bx,03h
jle mna
call LF0D
xor bx,bx
xor dx,dx
mov ah,02h ;определение функции прерывания int 21h
mout2: ;вывод данных на экран
mov dl,output3[bx]
int 21h
inc bx
inc dh
cmp dh, 03h ;сравнение младшего разряда с 03h
jle mout2
exit:
mov ax, 4c00h ;стандартный выход
int 21h ;генерация прерывания с номером 21h
LF0D proc ;процедура "перевод строки - возврат каретки"
mov ah, 02h
mov dl, 0Ah
int 21h
mov dl, 0Dh
int 21h
ret
LF0D endp
end main ;конец программы с точкой входа main
