Седов Иван Алексеевич
Рязанский политехнический колледж
ASSEMBLER 8-bit SIMULATOR
Занятие #5: создание процедур
число в строку, строка в число


https://e1m7.github.io/work/
Сегодня мы сделаем две процедуры: 1) перевод числа в строку, 2) перевод строки в число. Обе они нужны и входят в стандартный набор процедур для библиотеки ассемблер-программиста.
Процедура перевод числа в строку делает перевод числа из регистра (обычно А) в строку, которая задается изначально в сегменте данных. У нас есть А=125, надо получить
str1: DB "125"
DB 0Замечание: очень хорошо, что максимальное число, которое может поместиться в регистр = 255, это значит, что наша строка будет не больше 3-ех символов.
JMP start
str1: DB " "
DB 0
start:
MOV A, 125
MOV C, str1
CALL number_to_string
MOV C, str1
CALL print_string
HLT
number_to_string:
; input
; A = number (125)
; C = string (" ")
; output
; C = "number" ("125")
PUSH B
PUSH D PUSH 0 ; Положим в стек 0
MOV D, C ; D=сохранить адрес строки
.loop53:
CMP A, 0 ; Сравнение: A=0?
JE .create54 ; (да) перейти на .create54
MOV B, A ; (нет) B=A (сохраним в B 125)
MOV C, A ; C=A (настроим C перед remdiv10)
CALL remdiv10 ; Вызов remdiv10 (вернет остаток/10)
ADD A, '0' ; A=A+'0'=5+48=53
PUSH A ; Положим первую цифру в стек (53)
MOV A, B ; A=B (восстановим регистр А=125)
DIV 10 ; A=A/10=12 (разделим А/10)
JMP .loop53
.create54:
POP A ; A=значение из стека (1=0x31=49)
CMP A, 0 ; Сравнение: A=0?
JE .end52 ; (да) переход .end52
MOV [D], A ; (нет) по адресу в D положить A
INC D ; D=D+1
JMP .create54
.end52:
POP D
POP B
RET
print_string:
; input
; C = string, 0
PUSH A
PUSH B
PUSH D
MOV B, 0
MOV D, 232
.loop51:
MOV A, [C]
MOV [D], A
INC C
INC D
CMP B, [C]
JNZ .loop51
POP D
POP B
POP A
RETremdiv10:
; input
; C = number
; output
; A = rem number/10
PUSH C
MOV A, C
DIV 10
MUL 10
SUB C, A
MOV A, C
POP C
RET Задача №3
Написать процедуру перевода строки в число, в строке находится число формата "205", надо получить в регистре А число 205.

Подумайте о том, как...
1) взять число 123 и по одному символу из него (хоть с начала, хоть с конца) собрать в другом месте 123;
2) выйти из ситуации, если вам дали 0;
3) выйти из ситуации, если вам дали число больше чем 255?



JMP start
str1: DB "123"
DB 0
val1: DB 0
start:
MOV C, str1
CALL string_to_number
CALL print_number
HLT
string_to_number:
; input
; C = string
; output
; A = number
PUSH B
PUSH C
XOR A, A ; A=0 (обнуление ответа)
.loop71:
MOV B, [C] ; B=[C] (1=0x31=49)
CMP B, 0 ; Проверка: B=0
JE .exit77 ; Выход, если нулевой байтВыставить 10 -ную систему в эмуляторе
CMP B, 48 ; Проверка: B=48
JB .exit77 ; Выход, если число меньше 0
CMP B, 57 ; Проверка: B=57
JA .exit77 ; Выход, если число больше 9
SUB B, '0' ; Код в B превращаем в цифру
MUL 10 ; A=A*10
ADD A, B ; A=A+B
INC C ; C=C+1
JMP .loop71
.exit77:
POP C
POP B
RET
print_number:
; input
; A = number
; output
; number => display
PUSH C
CMP A, 0
JE .print660
PUSH 0
.loop60:
CMP A, 0
JE .print61
MOV C, A
CALL remdiv10
ADD A, '0'
PUSH A
MOV A, C
DIV 10
JMP .loop60
.print61:
MOV C, 232
.loop62:
POP A
CMP A, 0
JE .end66
MOV [C], A
INC C
JMP .loop62
.print660:
MOV [232], 48
.end66:
POP C
RET
remdiv10:
; input
; C = number
; output
; A = остаток от деления number/10
PUSH C
MOV A, C
DIV 10
MUL 10
SUB C, A
MOV A, C
POP C
RETЗамечание
В нашем распоряжении есть процедуры:
- print_string
print_number
print_char
- remainder_division
remdiv10
- halt
- string_to_number
- number_to_string
assembler8_05
By Ivan Sedov
assembler8_05
- 353