Другие языки программирования и технологии

assembler tasm - надо сосчитать сколько елементов было введено

помогите пожалуйста.

.model small
.stack 100h
.data
mseee db "Writeln: $"
msgeee db "Character count: $"
sk0 db "zero$"
sk1 db "one$"
sk2 db "two$"
sk3 db "three$"
sk4 db "four$"
sk5 db "five$"
sk6 db "six$"
sk7 db "seven$"
sk8 db "eight$"
sk9 db "nine$"
string db 100 dup (10,13,"$")
enteris db 13,10,'$'

.code
Start:
mov ax, @data
mov ds, ax

mov ah, 09h
mov dx, offset mseee
int 21h

mov ah, 0Ah
mov dx, offset string
int 21h

mov ah, 09h
mov dx, offset enteris
int 21h

mov ax, offset string
mov si, ax
add si, 2

Search:
mov al, [si]
inc si
cmp al, 30h
je Zero
cmp al, 31h
je One
cmp al, 32h
je Two
cmp al, 33h
je Three
cmp al, 34h
je Four
cmp al, 35h
je Five
cmp al, 36h
je Six
cmp al, 37h
je Seven
cmp al, 38h
je Eight
cmp al, 39h
je Nine

Check:
cmp al, "$"
je Output
mov ah,02h
mov dl, al
int 21h
jmp Search

Zero:
mov ah,09h
mov dx, offset sk0
int 21h
jmp Search

One:
mov ah,09h
mov dx, offset sk1
int 21h
jmp Search

Two:
mov ah,09h
mov dx, offset sk2
int 21h
jmp Search

Three:
mov ah,09h
mov dx, offset sk3
int 21h
jmp Search

Four:
mov ah,09h
mov dx, offset sk4
int 21h
jmp Search

Five:
mov ah,09h
mov dx, offset sk5
int 21h
jmp Search

Six:
mov ah,09h
mov dx, offset sk6
int 21h
jmp Search

Seven:
mov ah,09h
mov dx, offset sk7
int 21h
jmp Search

Eight:
mov ah,09h
mov dx, offset sk8
int 21h
jmp Search

Nine:
mov ah,09h
mov dx, offset sk9
int 21h
jmp Search

Output:

mov ax, 4C00h
int 21h

END start
Как продолжение этого ответа

Теперь идея немного другая. Используется массив строк с фиксированной длиной (массив названий цифр, каждое название длиной 6 байт, символ-заполнитель "доллар"). Замена цифр их названиями также происходит в промежуточном буфере с последующим выводом его содержимого в консоль.

Длина введённой строки здесь определяется так.
Сначала ищется конец введённой строки (байт со значением 0Dh), затем из адреса этого байта вычитается адрес начала и получается длина строки.
Символьное представление длины записывается сразу после текста "Character count: ", а потом вся сформированная строка выводится в консоль.

.model small
.stack 100h

.data
mseee db "Writeln: $"
msgeee db "Character count: "
strlen db "$$$$"
Names db "zero$$","one$$$","two$$$","three$","four$$"
    db "five$$","six$$$","seven$","eight$","nine$"
enteris db 13,10,'$'
inbuff db 100
len db ?
string db 100 dup (?)
buffer db 496 dup ('$')

.code
Start:
    mov ax, @data
    mov ds, ax
    mov es, ax

    mov ah, 09h
    mov dx, offset mseee
    int 21h

    mov ah, 0Ah
    mov dx, offset inbuff
    int 21h

    mov ah, 09h
    mov dx, offset enteris
    int 21h

;Определение длины, поиском адреса маркера окончания введённой строки 0Dh
    mov cx,-1
    lea di,string
    mov al,0Dh
    repne scasb
    dec di
    sub di,offset string; из адреса маркера вычесть адрес начала = длина
    mov ax,di
    xor cx,cx
    mov dl,10
DivLen:
    div dl
    push ax
    inc cx
    xor ah,ah
    or al,al
    jnz DivLen
    lea di,strlen
LenChar:
    pop ax
    xchg ah,al
    or al,30h
    stosb
    loop LenChar

    lea dx,msgeee
    mov ah,9
    int 21h
    mov dx, offset enteris
    int 21h

    mov si, offset string
    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,6
    mul bl
    mov bx,ax
CopySymb:
    mov al,Names[bx]
    cmp al,'$'
    jz Repeat
    stosb
    inc bx
    jmp CopySymb

OutString:
    lea dx,buffer
    mov ah,9
    int 21h

    xor ah,ah
    int 16h
    mov ax, 4C00h
    int 21h

    end start

ЕХ
Елена Харитонова
51 590
Лучший ответ
не спрашивай здесь про асм мало спецов лучше на форуме какомто