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) 

/AX

mov vct[si], AL 
inc si 

とも

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

の代わりに、このメモリ使用ALから/に取得格納するあなたはどのようpushpopの仕事を知っていますか?
プログラム内のpop axpush 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レジスタの正しい値でプログラムを起動しますが、それを期待することはできません。
私はあなたが書いたsugggest:

mov si, 0 
mov cx, 20 
ingresarNumero: 

あなたは、バックスペース文字として出力ASCIIゼロに選びました。もっと普通の選択はASCII 32でした。素敵なことは、実際にはmov al, ' 'を使ってスペースとして書くことができることです。直接jmp命令の下の位置へのジャンプ

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: 

悪いプログラミング考えられます。このコードでは、あなたが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

関連する問題