2016-11-11 5 views
1

У меня проблема. Я должен сделать программу в сборке 8086, чтобы заполнить массив строкой, а затем распечатать только символы «a, A, e, E, i, I, o, O, u, U».
мне удалось распечатывание каждого символа внутри массива, но когда я начинаю добавляющие условия и скачек, моя программа просто попадет в бесконечный цикл :(Распознавание и печать только гласных из строки

Here's весь код:

org 100h 

    jmp main 

    ;messsages to be shown: 

    msg1 db 'this is an example program.', 10, 13, 'made to show only the vocal letters of a string', 10, 13, 'write some words', 10, 10, 13, '$' 
    msg2 db 10, 10, 13, 'your phrase:', 10, 10, 13, '$' 

    ;variables 

    aux db 0 
    vct dw 0 

    ;program start 

    main: 
    lea dx, msg1 
    mov ah, 09h 
    int 21h 

    mov cx, 20 
    ingresarNumero: 
    mov ah, 08h 
    int 21h 
    cmp al, 08h 
    je borrar 
    cmp al, 0Dh 
    je enter 
    cmp al, 20h 
    je enter 
    mov ah, 0Eh 
    int 10h 
    mov ah, 0 
    mov vct[si], ax 
    inc si 
    loop ingresarNumero 

    ultimaPosicion: 
    mov ah, 08h 
    int 21h 
    cmp al, 08h 
    je borrar 
    cmp al, 0Dh 
    je finIngreso 
    jmp ultimaPosicion 

    borrar: 
    cmp cx, 20 
    je ingresarNumero 
    mov ah, 0Eh 
    int 10h 
    mov al, 0 
    int 10h 
    mov al, 8 
    int 10h 
    pop ax 
    inc cx 
    dec si 
    jmp ingresarNumero 

    enter: 
    cmp cx, 20 
    je ingresarNumero 
    jmp finIngreso 

    finIngreso: 

    lea dx, msg2 
    mov ah, 09h 
    int 21h 

    push cx 
    mov cx, si 
    mov si, 0 
    superloop: 
    mov ax, vct[si] 
    mov ah, 0Eh 
    int 10h 
    inc si 
    loop superloop 


    ret 
+0

Вы пробовали переходить через него с помощью отладчика? –

ответ

1
vct dw 0 
;program start 
main: 

Потому что вы не зарезервировали достаточно памяти для персонажей вы начинаете переписав программу Изменить это определение (используйте байты вместо слов!):

vct db 100 dup (0) 

При хранении/извлечения в/из этого использования памяти AL в смене AX

mov vct[si], AL 
inc si 

, а также

superloop: 
mov AL, vct[si] 
mov ah, 0Eh 
int 10h 

Вы знаете хауpush и pop работы?
И pop ax, и push cx в вашей программе бессмысленны!
Просто удалите оба.
В качестве альтернативы в случае push cx, вы можете исправить код, добавив недостающую pop cx:

push cx 
mov cx, si 
mov si, 0 
superloop: 
mov AL, vct[si] 
mov ah, 0Eh 
int 10h 
inc si 
loop superloop 
pop cx    <<<<Add this 

Ваша программа использует SI регистр без инициализации заранее. Если вам повезет, эмулятор EMU8086 запустит вашу программу с правильным значением в регистре SI, но вы не можете рассчитывать на это.
I sugggest Вы пишете:

mov si, 0 
mov cx, 20 
ingresarNumero: 

Вы выбрали для вывода ASCII ноль в качестве возврата на один символ. Более обычным выбором здесь был бы ASCII 32. Самое приятное, что вы можете написать его как пространство, используя mov al, ' '.

borrar: 
cmp cx, 20 
je ingresarNumero 
mov ah, 0Eh  ;AL=8 at this point 
int 10h 
mov al, ' '  <<<< Better choice 
int 10h 
mov al, 8 
int 10h 
pop ax    <<<< Remove this entirely 
inc cx 
dec si 
jmp ingresarNumero 

enter: 
cmp cx, 20 
je ingresarNumero 
jmp finIngreso 

finIngreso: 

Прыжки в положение непосредственно ниже jmp инструкции считается плохим программированием.В этом коде, если вы не прыгать в ingresarNumero, вы можете просто провалиться в секции finIngreso так:

enter: 
cmp cx, 20 
je ingresarNumero 
finIngreso: 

cmp al, 0Dh 
je enter 
cmp al, 20h  <<<< Space character 
je enter 

Я надеюсь, что вы поймите, что вы решили закончить ввод при получении символа пробела. Это, очевидно, означает, что ваше оперативное сообщение 'напишите слово s' не будет отражать работу вашей программы!

+0

Большое вам спасибо! Я не поклонник 8086, и мне было сложно сделать эту программу. я не знал об этих ошибках, и благодаря вам теперь я могу продолжить! – Paulo

+0

Приятно видеть, что мой ответ помог вам по пути. Пожалуйста, примите это, нажав галочку слева. Это также принесет вам дополнительные очки. (Http://stackoverflow.com/help/someone-answers) – Fifoernik

Смежные вопросы