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

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

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

Здравствуйте! Имеется такая строка:
Листинг программы
  1. Var BD 2,2,3,3,4,4; 223344 десятичное 6-ти значное число в распакованном формате с повышенной точностью (ASCII формат)
Как это число 223344 перевести в шестнадцатиричное число? Я нашел такой код, который переводит из однозначного и двузначного десятичного числа в шестнадцатизначное:
Листинг программы
  1. ; Вар. 17. Зад. 1. Написать подпрограмму для преобразования некоторого массива десятичных
  2. ; ASCII байтов. в массив BCD байтов. С помощью этой подпрограммы обработать два массива
  3. ; Для передачи параметров использовать стек.
  4. Name Program
  5. ; Описание констант
  6. ;Описание переменных
  7. Data segment
  8. x1 db 2h
  9. db 1h
  10. db 3h
  11. db 1h
  12. db 4h
  13. db 1h ; числа в ASCII-формате
  14. y1 db 3 dup (?) ; массив в BCD-формате
  15. x2 db 8h ;98
  16. db 9h
  17. db 5h ;95
  18. db 9h
  19. db 7h ;87
  20. db 8h
  21. db 2h ;92
  22. db 9h ; массив десятич. ASCII-байтов
  23. Y2 db 4 dup (?) ; массив десятич. BCD-байтов
  24. Data ends
  25. Stack SEGMENT
  26. DW 16 dup(?)
  27. StkTOp LABEL word
  28. Stack ends
  29. Code SEGMENT
  30. ASSUME CS: Code, DS: Data, ES: Data, SS: Stack
  31. ; Здесь описываются подпрограммы
  32. abc proc
  33. push bp
  34. mov bp, sp ; привязка к верхушке стека
  35. mov cx, [bp+4] ; чтение параметров из стека (кол-во чисел)
  36. mov di, [bp+6] ; адрес переменной Y1
  37. mov si, [bp+8] ; адрес переменной Х1
  38.  
  39. M1: mov al, [si]+1 ; загружаем первое число в ASCII-формате
  40. shl ax, 1 ; сдвигаем на 4 разряда в право
  41. shl ax, 1
  42. shl ax ,1
  43. shl ax, 1
  44. or al, [si] ;востонавливаем число которое запомнили
  45. mov [di], al ; записываем число в BCD-формате
  46. inc si ; переходим на другое число
  47. inc si
  48. inc di ; модифицируем адрес BCD - числа
  49. dec cx ; уменьшаем кол-во чисел
  50. jnz M1 ; если они не кончились то идем на M1
  51. pop BP
  52. ret 6
  53. abc endp
  54. ; Основная программа
  55. Start: mov AX, Data
  56. mov DS, AX
  57. mov ES, AX
  58. mov Ax, Stack
  59. mov SS, AX
  60. mov SP, offset StkTop
  61. ; загружаем параметры в стек по условию задачи
  62. mov ax, offset x1 ; загружаем адрес первого массива
  63. push ax
  64. mov ax, offset Y1 ; загружаем адрес результата
  65. push ax
  66. mov ax, 3 ; кол-во чисел
  67. push ax
  68. call abc ; вызов подпрограммы
  69.  
  70. mov ax, offset x2 ; загружаем адрес второго массива
  71. push ax
  72. mov ax, offset Y2 ; загружаем адрес результата
  73. push ax
  74. mov ax, 4 ; кол-во чисел
  75. push ax
  76. call abc ; вызов подпрограммы
  77. code ends
  78. end start

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

textual
Листинг программы
  1. Var BD 2,2,3,3,4,4; 223344 десятичное 6-ти значное число
  2.  
  3. ...
  4.  
  5.     xor si, si          ;Будет мл.половинкой числа
  6.     xor di, di          ;Будет ст.половинкой числа
  7.     mov bx, offset Var
  8.     mov cx, 6           ;Число цифр
  9.     cld
  10.     mov bp, 10
  11.  
  12. @:  mov ax, di          ;Умножаем di:si на 10
  13.     mul bp
  14.     mov di, ax
  15.     mov ax, si
  16.     mul bp
  17.     add si, ax
  18.     adc di, dx
  19.  
  20.     mov al, [bx]        ;Выгребаем цифру числа
  21.     mov ah, 0
  22.     inc bx
  23.  
  24.     add si, ax          ;Прибаляем цифру к di:si
  25.     adc di, 0
  26.  
  27.     loop    @           ;Цикл 6 раз
  28.  
  29.     ;Итого в 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы