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

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

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
  RET
remdiv10:
; 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