- •Начнем же разбор сей «ужасной программы»
- •Первая строчка
- •Вторая строчка – я не разбирался
- •Поговорим о стеке
- •Второй абзац
- •Третий абзац
- •Четвертый абзац
- •Пятый абзац
- •Шестой и седьмой абзацы
- •Восьмой и девятый абзацы
- •10) Десятый и одиннадцатый абзацы или нахождение среднего арифметического я расписывать не буду, у меня по варианту другое требуется, кому надо, тот и сам все поймет.
- •11) Двенадцатый абзац
- •13) Четырнадцатый абзац и до конца
Восьмой и девятый абзацы
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 ;перемещаем в ‘у’ значение регистра bx (НАХУА)
mov bx, z ;перемещаем в регистр bx значение переменной ‘z’ (изначально
; равной нулю) (НАХУА)
mov middle2[bx], ax ;записываем получившееся в регистре АХ наше 4-х значное 2-х
;битное число, получившееся в результате прибавления и смещения,
; например 1А9Сh, в массив middle2.
xor ax,ax ; очищаем регистр АХ, для создания в памяти следующего числа
inc bx ; увеличиваем bx на 1. Регистр bx хранит номер числа в массиве
; middle2, т.е. меняется от 0 до 19, т.к. всего 10 чисел по 2 байта
inc bx ; увеличиваем bx на единицу так как 10 чисел по 2 байта
mov z, bx ; перемещаем значение из регистра bx в переменную Z (НАХУА)
mov bx, y ; перемещаем значение переменное у в регистр bx (НАХУА)
inc cl ; увеличиваем cl на 1, этот регистр меняется от 0 до 9 и хранит число
; циклов. Всего 10 повторов, т.к. 10 слов.
xor ch, ch ; ch = 0, регистр ch хранит номер 4
cmp cl, 09h ; следим за числом повторов, путем сравнения cl (от 0 до 9) с чисом 9
jle ms ; если меньше, либо равно, то возращаемся к метке ms (и так 10 раз,
; для каждого из слов)
; (НАХУА) – считаю, что можно обойтись без этого и сделать проще
