Перевод десятичных чисел в шестнадцатиричное - Assembler
Формулировка задачи:
Var BD 2,2,3,3,4,4; 223344 десятичное 6-ти значное число в распакованном формате с повышенной точностью (ASCII формат)
; Вар. 17. Зад. 1. Написать подпрограмму для преобразования некоторого массива десятичных
; ASCII байтов. в массив BCD байтов. С помощью этой подпрограммы обработать два массива
; Для передачи параметров использовать стек.
Name Program
; Описание констант
;Описание переменных
Data segment
x1 db 2h
db 1h
db 3h
db 1h
db 4h
db 1h ; числа в ASCII-формате
y1 db 3 dup (?) ; массив в BCD-формате
x2 db 8h ;98
db 9h
db 5h ;95
db 9h
db 7h ;87
db 8h
db 2h ;92
db 9h ; массив десятич. ASCII-байтов
Y2 db 4 dup (?) ; массив десятич. BCD-байтов
Data ends
Stack SEGMENT
DW 16 dup(?)
StkTOp LABEL word
Stack ends
Code SEGMENT
ASSUME CS: Code, DS: Data, ES: Data, SS: Stack
; Здесь описываются подпрограммы
abc proc
push bp
mov bp, sp ; привязка к верхушке стека
mov cx, [bp+4] ; чтение параметров из стека (кол-во чисел)
mov di, [bp+6] ; адрес переменной Y1
mov si, [bp+8] ; адрес переменной Х1
M1: mov al, [si]+1 ; загружаем первое число в ASCII-формате
shl ax, 1 ; сдвигаем на 4 разряда в право
shl ax, 1
shl ax ,1
shl ax, 1
or al, [si] ;востонавливаем число которое запомнили
mov [di], al ; записываем число в BCD-формате
inc si ; переходим на другое число
inc si
inc di ; модифицируем адрес BCD - числа
dec cx ; уменьшаем кол-во чисел
jnz M1 ; если они не кончились то идем на M1
pop BP
ret 6
abc endp
; Основная программа
Start: mov AX, Data
mov DS, AX
mov ES, AX
mov Ax, Stack
mov SS, AX
mov SP, offset StkTop
; загружаем параметры в стек по условию задачи
mov ax, offset x1 ; загружаем адрес первого массива
push ax
mov ax, offset Y1 ; загружаем адрес результата
push ax
mov ax, 3 ; кол-во чисел
push ax
call abc ; вызов подпрограммы
mov ax, offset x2 ; загружаем адрес второго массива
push ax
mov ax, offset Y2 ; загружаем адрес результата
push ax
mov ax, 4 ; кол-во чисел
push ax
call abc ; вызов подпрограммы
code ends
end startРешение задачи: «Перевод десятичных чисел в шестнадцатиричное»
Var BD 2,2,3,3,4,4; 223344 десятичное 6-ти значное число ... xor si, si ;Будет мл.половинкой числа xor di, di ;Будет ст.половинкой числа mov bx, offset Var mov cx, 6 ;Число цифр cld mov bp, 10 @: mov ax, di ;Умножаем di:si на 10 mul bp mov di, ax mov ax, si mul bp add si, ax adc di, dx mov al, [bx] ;Выгребаем цифру числа mov ah, 0 inc bx add si, ax ;Прибаляем цифру к di:si adc di, 0 loop @ ;Цикл 6 раз ;Итого в di:si искомое число в двоичном виде
Объяснение кода листинга программы
Выполняемый код переводит десятичное число в шестнадцатеричное. Переменная BD содержит исходное десятичное число 223344, она используется для проверки и хранения результата. Программа начинается с инициализации регистров SI и DI, которые будут использоваться как счётчики для перебора чисел. Затем происходит установка счётчика CX на 6, так как число 223344 имеет 6 цифр. Регистры BP и BX используются в качестве индексов для доступа к числам в переменной Var. Затем происходит цикл, который выполняется 6 раз. В первой части цикла выполняется умножение DI на 10 (так как счётчик DL равен 10), затем результат сохраняется в регистре AX. Затем происходит инкремент регистра BX, чтобы перейти к следующей цифре исходного числа. Во второй части цикла выполняется добавление значения AX к DI. Значение AX при этом равно 0, таким образом, эта часть цикла скорее всего предназначена для учёта переноса, но в данном случае она не используется, так как все цифры исходного числа меньше 10. Регистры SI и DI в конце цикла содержат результат преобразования исходного числа в двоичный формат. Поскольку результат вычислений не используется, можно предположить, что данная программа предназначена для тестирования или отладки, а не для практического использования.