Написать комментарии для программы, пожалуйста) - Assembler

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

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

Листинг программы
  1. .model tiny
  2. .stack 100h
  3. .data
  4. outStr db '0000$'
  5. .code
  6. translByte proc
  7. push ax
  8. push ax
  9. shr al,4
  10. cmp al,9
  11. ja greater10
  12. mov byte ptr [bx],'0'
  13. add [bx],al
  14. jmp next4Bit
  15. greater10:
  16. mov byte ptr [bx],'A'
  17. sub al,10
  18. add [bx],al
  19. next4Bit:
  20. pop ax
  21. and al,0Fh
  22. cmp al,9
  23. ja _greater10
  24. mov byte ptr [bx+1],'0'
  25. add [bx+1],al
  26. jmp exitByteProc
  27. _greater10:
  28. mov byte ptr [bx+1],'A'
  29. sub al,10
  30. add [bx+1],al
  31. exitByteProc:
  32. pop ax
  33. ret
  34. translByte endp
  35. translWord proc
  36. push ax
  37. push ax
  38. shr ax,8
  39. call translByte
  40. pop ax
  41. and ax,00FFh
  42. add bx,2
  43. call translByte
  44. sub bx,2
  45. pop ax
  46. ret
  47. translWord endp
  48. start:
  49. mov ax,@data
  50. mov ds,ax
  51. mov bx,OFFSET outStr
  52. mov ax,60000
  53. call translWord
  54. mov ah,9
  55. mov dx,OFFSET outStr
  56. int 21h
  57. mov ax,4c00h
  58. int 21h
  59. end start

Решение задачи: «Написать комментарии для программы, пожалуйста)»

textual
Листинг программы
  1. .286                            ;разрешение команд для процессора i80286
  2. .model small                    ;определение модели памяти small
  3. .stack 100h                     ;определение размера стека 256 байт
  4. .data                           ;начало описания сегмента данных
  5. outStr db '0000$'               ;выделение переменной 5 байт
  6.  
  7. .code                           ;начало описания сегмента кода
  8.  
  9. translByte proc
  10.         push ax                 ;сохранение регистра ax
  11.         push ax
  12.         shr al,4                ;сдвиг вправо на 4 бита
  13.         cmp al,9                ;сравнение al с числом 9
  14.         ja greater10            ;перейти, если больше
  15.         mov byte ptr [bx],'0'   ;поместить символ '0' в текущую позицию строки
  16.         add [bx],al             ;сложить код '0' в текущей позиции строки со значением в регистре al
  17.         jmp next4Bit            ;перейти к обработке младших четырёх бит
  18. greater10:
  19.         mov byte ptr [bx],'A'   ;поместить символ 'A' в текущую позицию строки
  20.         sub al,10               ;вычесть из регистра al число 10
  21.         add [bx],al             ;сложить код 'A' в текущей позиции строки со значением в регистре al
  22. next4Bit:
  23.         pop ax                  ;восстановить значение ax из стека
  24.         and al,0Fh              ;выделить в al младшие четыре бита
  25.         cmp al,9                ;сравнение al с числом 9
  26.         ja _greater10           ;перейти, если больше
  27.         mov byte ptr [bx+1],'0' ;поместить символ '0' в текущую позицию строки
  28.         add [bx+1],al           ;сложить код '0' в текущей позиции строки со значением в регистре al
  29.         jmp exitByteProc        ;перейти к завершению процедуры
  30. _greater10:
  31.         mov byte ptr [bx+1],'A' ;поместить символ 'A' в следующую позицию строки
  32.         sub al,10               ;вычесть из регистра al число 10
  33.         add [bx+1],al           ;сложить код 'A' в следующей позиции строки со значением в регистре al
  34. exitByteProc:
  35.         pop ax                  ;восстановление содержимого регистра ax
  36.         ret                     ;завершение процедуры
  37. translByte endp
  38.  
  39. translWord proc
  40.         push ax                 ;сохранение регистра ax
  41.         push ax                 ;преобразуем старший байт слова
  42.         shr ax,8                ;сдвиг вправо на 8
  43.         call translByte         ;вызов процедуры преобразования байта
  44.         pop ax                  ;преобразуем младший байт слова
  45.         and ax,00FFh            ;выделение младшего байта из слова
  46.         add bx,2                ;указатель на строку указывает на 3 символ
  47.         call translByte         ;вызов процедуры преобразования байта
  48.         sub bx,2                ;восстановление исходного значения регистра bx
  49.         pop ax                  ;восстановление исходного значения регистра ax
  50.         ret                     ;завершение процедуры
  51. translWord endp
  52.  
  53. start:
  54.         mov ax,@data    ;инициализация сегментного регистра данных
  55.         mov ds,ax
  56.         mov bx,OFFSET outStr    ;формирование параметров процедуры
  57.         mov ax,60000
  58.         call translWord         ;вызов процедуры
  59.         mov ah,9                ;вывод на экран полученной строки
  60.         mov dx,OFFSET outStr
  61.         int 21h
  62.         mov ax,4c00h            ;завершение программы
  63.         int 21h
  64. end start

Объяснение кода листинга программы

  1. Код написан на ассемблере для процессора i80286.
  2. Размер стека 256 байт.
  3. Модель памяти - small.
  4. Сегмент данных начинается с адреса 100h.
  5. Переменная outStr содержит строку '0000$'.
  6. Процедура translByte преобразует один байт в шестнадцатеричную систему счисления.
  7. Процедура translWord преобразует два байта в шестнадцатеричную систему счисления.
  8. Начало программы помечено меткой start.
  9. Программа инициализирует сегментный регистр данных и сегментный регистр стека.
  10. Затем программа вызывает процедуру translWord для преобразования двух байтов в шестнадцатеричную систему счисления.
  11. Результат выводится на экран с помощью функции int 21h.
  12. Программа завершается с кодом 4c00h.

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


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

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

7   голосов , оценка 4 из 5

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

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

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