У меня другая идея. Использовать массив с адресами начала названий цифр (refs).
Сначала сформировать в буфере строку, заменив цифры на названия, а затем вывести её в консоль сразу всю.
.model small
.stack 100h
.data
msg db 'Введите строчку: $'
refs dw d0, d1, d2, d3, d4, d5, d6, d7, d8, d9
enteris db 13,10,'$'
d0 db 'zero',0
d1 db 'one',0
d2 db 'two',0
d3 db 'three',0
d4 db 'four',0
d5 db 'five',0
d6 db 'six',0
d7 db 'seven',0
d8 db 'eight',0
d9 db 'nine',0
string db 255, ?, 255 dup (?)
buffer db 1271 dup ('$')
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
mov ah,9
lea dx,msg
int 21h
mov ah,10
lea dx,string
int 21h
mov ah,9
lea dx,enteris
int 21h
lea si,string+2
lea di,buffer
Repeat:
lodsb
cmp al,0Dh
je OutString
cmp al,'0'
jb CopyChar
cmp al,'9'
jbe CopyNumber
CopyChar:
stosb
jmp Repeat
CopyNumber:
sub al,'0'
mov bl,al
xor bh,bh
shl bx,1; bx:=bx*2
mov bx,refs[bx]
CopySymb:
mov al,[bx]
or al,al
jz Repeat
stosb
inc bx
jmp CopySymb
OutString:
lea dx,buffer
mov ah,9
int 21h
Exit:
mov ah,8
int 21h
mov ah,4Ch
int 21h
end start
есть идея считав строчку просто делать cmp с каждым елементом, если это не число вывести его на экран, а если число выводить название числа как сообщение
что-то вроде cmp ax, 3ah je writeln9 (label), а в writeln9: mov ah, 9 mov dx, offset num9 int 21h (num9 db "nine$")
но все-же не очень знаю как бы лучше всё реализовать в код. или может лучше вообще как-то по другому писать... ?
.model small
.stack 100h
.data
msg db "Введите строчку: $"
string db 255, ?,256 dup ('$')
enter db 13,10,'$' ; 10,13
.code
start:
mov ax, @data
mov ds, ax
mov ah, 9
mov dx, offset msg
int 21h
mov ah, 0Ah
mov dx, offset string
int 21h
mov ah, 9
mov dx, offset enteris
int 21h
Exit:
mov ah, 4Ch ;4Ch - isejimo i MS-DOS f-ja
int 21h
END start