Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Nachnem_zhe_razbor_sey.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.69 Mб
Скачать
  1. Восьмой и девятый абзацы

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С.

Алгоритм:

  1. Создаем число 0000 0000 0000 0000 = 0000h

  2. Прибавляем к нему 1 0000 0000 0000 0001 = 0001h

  3. Смещаем, умножая на 16 0000 0000 0001 0000 = 0010h

  4. Прибавляем A 0000 0000 0001 1010 = 001Ah

  5. Cмещаем, умножая на 16 0000 0001 1010 0000 = 01А0h

  6. Прибавляем 9 0000 0001 1010 1001 = 01А9h

  7. Смещаем, умножая на 16 0001 1010 1001 0000 = 1А90h

  8. Прибавляем С 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

17

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]