我遇到了问题。我必须在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
答案 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
寄存器中的正确值启动您的程序,但您不能指望它。
我建议你写一下:
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 '将不会反映您的程序的操作!