Перевод десятичных чисел в шестнадцатиричное - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Имеется такая строка:
Var BD 2,2,3,3,4,4; 223344 десятичное 6-ти значное число в распакованном формате с повышенной точностью (ASCII формат)
Как это число 223344 перевести в шестнадцатиричное число? Я нашел такой код, который переводит из однозначного и двузначного десятичного числа в шестнадцатизначное:
; Вар. 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

Решение задачи: «Перевод десятичных чисел в шестнадцатиричное»

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5
Похожие ответы