Перевод десятичных чисел в шестнадцатиричное - 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 в конце цикла содержат результат преобразования исходного числа в двоичный формат. Поскольку результат вычислений не используется, можно предположить, что данная программа предназначена для тестирования или отладки, а не для практического использования.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д