Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

assembler tasm

comewinter Ученик (125), закрыт 11 лет назад
нужен код. вычитываем строчку, и каждое число, которое там находим, меняем на слово, т. е. asf5sd3 -> asffivesdthree (числа 0-9 = от "zero" до "nine")
есть идея считав строчку просто делать 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
Лучший ответ
Миоко Таканава Гений (51590) 11 лет назад
У меня другая идея. Использовать массив с адресами начала названий цифр (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

Остальные ответы
Похожие вопросы