2016-11-11 97 views
1

我遇到問題。我必須在8086程序集中編寫一個程序,用字符串填充數組,然後僅打印字符「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 

代替檢索到/從該內存使用AL

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

你知道如何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, ' '實際上將它寫成一個空格。

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

相關問題