Седов Иван Алексеевич

Рязанский политехнический колледж

ASSEMBLER 8-bit SIMULATOR

Занятие #3: создание процедур

вывод строки, вывод символа на экран

https://e1m7.github.io/work/

Для программирования на ассемблере программист должен создать для себя 15-20 процедур, выполняющих стандартные действия (ввод/вывод данных, открытие/закрытие файлов и проч.) Эти процедуры хранятся в отдельном модуле и подключаются через заголовочные файлы в основную программу. Для нашего эмулятора такие процедуры будут существенно проще и подключать их мы будем руками (копировать в нижнюю часть кода).

 

Процедура вывода строки должна выводить на экран строку. Разберем оформление процедуры по всем правилам (ее код разобран на первом занятии). Но сначала мини-пример.

 

Тестовая процедура сложения двух чисел требует, чтобы регистры C и D были настроены на два числа, а ответ вернется в регистре A.

  ; Настройка регистров
  MOV C, 1
  MOV D, 2
  CALL add_two_numbers
  
 add_two_numbers:
 ; input
 ; C = number1
 ; D = number2
 ; output
 ; A = number1 + number2
   PUSH B
   
   MOV A, C  ; A = C = number1
   MOV B, D  ; B = D = number2
   ADD A, B  ; A = A + B
   
   POP B
   RET
print_string:
; input
; C = string, 0
  PUSH A       ; Сохранить в стек
  PUSH B       ; Сохранить в стек
  PUSH D       ; Сохранить в стек
  MOV B, 0     ; B = 0 (нулевой байт)
  MOV D, 232   ; D = 232 (1-ый байт вывода)
.loop31:	
  MOV A, [C]   ; A = символ строки
  MOV [D], A   ; Байт вывода = символ из А
  INC C        ; C = C + 1
  INC D        ; D = D + 1
  CMP B, [C]   ; Проверка: B = 0
  JNZ .loop31  ; (да) переход на .loop31
  ; (нет) выполнение кода дальше
  POP D        ; Достать из стека
  POP B        ; Достать из стека
  POP A        ; Достать из стека
  RET
halt:
  HLT
  JMP start
 
; SEGMENT DATA
message: 
  DB "Hello World!"
  DB 0
         
; SEGMENT CODE
start:

  MOV C, message
  CALL print_string
  
  CALL halt

Основная программа

Под-программа (конец)

Процедура вывода на экран символа должна выводить на экран один символ. Фактически эта процедура частный случай вывода строки, но ее можно написать для тренировки.

Попробуйте написать ее самостоятельно...

  JMP start
start:
  MOV C, 'Q'
  CALL print_char
  CALL halt

print_char:
; input
; C = char
  MOV [232], C
  RET

halt:
  HLT

Замечание

В нашем распоряжении есть процедуры:

 

  • print_string
  • print_char
  • halt

assembler8_03

By Ivan Sedov

assembler8_03

  • 434