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