1

我有问题。我必须在 8086 汇编中编写一个程序来用字符串填充数组,然后只打印出字符“a、A、e、E、i、I、o、O、u、U”。
我已经成功打印出数组中的每个字符,但是当我开始添加条件和跳转时,我的程序就进入了一个无限循环:(

这是整个代码:

    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
4

1 回答 1

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 axpush cx

push cxpop 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,但你不能指望它。
我建议你写:

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

我确实希望您意识到您选择在收到空格字符后完成输入。这显然意味着你的提示信息'write some word s '不会反映你程序的操作!

于 2016-11-12T11:50:13.973 回答