Сборка Ввод до 8 символов в строку и вывод строки реверса - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть вопрос домашнего задания, чтобы получить от пользователя до 8 символов в строке в новой строке и напечатать его на обратной стороне

Я написал код, который должен брать каждый бит из строки и помещать его всложите и затем верните его обратно в строку, чтобы оно было в обратном порядке, и напечатайте его в новой строке.Но когда я запускаю файл, он просто застревает на вводе и не дает мне что-то сделать

Я новичок в сборке, мы используем tasm1 ~ 1.4.

вот мой код:

    STA SEGMENT STACK
        DB 100H DUP (0)
    STA ENDS

    DATA SEGMENT
        MSG1 DB 'ENTER STRING (Maximum is 8) : $'
        MSG2 DB 'REVERS IS : $'
        ISTR DB 10 DUP(0)
    DATA ENDS

    CODE SEGMENT
        ASSUME CS:CODE,DS:DATA,SS:STA
    MAIN:
        MOV AX, DATA
        MOV DS, AX
        LEA DX, MSG1
        MOV AH, 09H
        INT 21H
        MOV DX, 0
    ;INPUT
        MOV DX, OFFSET ISTR
        MOV AH, 0AH
        INT 21H
        MOV SI, DX
        MOV CL, [SI+1]
        ADD SI, 2
        MOV DX, 0
        MOV BL, CL
    TOSTACK:
        MOV DX, [SI]
        PUSH DX
        INC SI
        LOOP TOSTACK
        MOV DL, 10
        MOV AH, 02H
        INT 21H
        LEA DX, MSG2
        MOV AH, 09H
        INT 21H
        MOV DX, 0
        MOV CL, BL
        MOV SI, 2
    FROMSTACK:
        POP DX
        MOV AH, 02H
        INT 21H
        INC SI
        LOOP FROMSTACK

        MOV AX, 4C00H
        INT 21H

    CODE ENDS
        END MAIN

1 Ответ

0 голосов
/ 24 декабря 2018

Но когда я запускаю файл, он просто застревает на входе ...

Это потому, что при использовании функции ввода DOS 0Ah, вам нужно заранее указать DOS размер вашего файла.входной буфер.С определением типа ISTR DB 10 DUP(0) вы фактически запросили отсутствие буфера вообще!
Правильное определение в вашей программе:

ISTR DB 9, 0, 9 DUP(0)

1-й байт определяет размер входного буфера.Поместите его в DesiredNumberOfCharacters + 1 .
2-й байт указывает, сколько символов уже содержится в буфере.Поместите это в ноль .

Вы можете найти гораздо больше информации об этой функции DOS в другом моем посте Как работает буферизованный ввод .

Как только ваш ввод сработает, вам нужно исправить несколько проблемв TOSTACK части вашей программы:

  • Инструкция LOOP зависит от всего регистра CX, но вы только заполнили CL, который является младшим байтомCX.Просто добавьте mov ch, 0.
    Это, очевидно, означает, что вам также нужно скопировать в BX вместо BL при подготовке к FROMSTACK части.
  • Поскольку пользовательЕсли бы вы не выбрали какой-либо символ, ваша программа должна быть подготовлена ​​к этому случаю.Достаточно будет всего jcxz EXIT.
  • Каждый символ из входного буфера хранится в байте .Таким образом, ваш код не должен читать слова .

.

    mov     si, offset ISTR + 1
    mov     cl, [si]     ; Characters read 0, 1, 2, ... 8
    mov     ch, 0
    jcxz    EXIT
    mov     bx, cx       ; Save count
TOSTACK:
    inc     si
    mov     dl, [si]     ; This is a byte
    push    dx           ; Don't care about high byte in DH
    loop    TOSTACK

    ...

    mov     cx, bx       ; Restore count ( is GT 0 )
FROMSTACK:
    pop     dx           ; Still don't care about DH
    mov     ah, 02h
    int     21h
    loop    FROMSTACK
EXIT:
    mov     ax, 4C00h
    int     21h

Избавление от slow LOOPлегко:

    mov     si, offset ISTR + 1
    mov     cl, [si]     ; Characters read 0, 1, 2, ... 8
    mov     ch, 0
    jcxz    EXIT
    mov     bx, cx       ; Save count
TOSTACK:
    inc     si
    mov     dl, [si]     ; This is a byte
    push    dx           ; Don't care about high byte in DH
    dec     cx
    jnz     TOSTACK

    ...

FROMSTACK:
    pop     dx           ; Still don't care about DH
    mov     ah, 02h
    int     21h
    dec     bx
    jnz     FROMSTACK
EXIT:
    mov     ax, 4C00h
    int     21h
...