Седов Иван Алексеевич
Рязанский политехнический колледж
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 ; Достать из стека
REThalt:
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