我被困在“输入字符串:”并且没有进行任何输入 8086 编程

Posted

技术标签:

【中文标题】我被困在“输入字符串:”并且没有进行任何输入 8086 编程【英文标题】:I got stuck at "Enter a string:" and doesn't take any input-8086 programming 【发布时间】:2019-08-17 20:45:18 【问题描述】:

在程序中找出没有。字符串中的元音。我被困在“输入一个字符串:”??为什么?即使编译器说一切都好。

程序来计算编号。字符串中的元音。

;;;;;;;PROGRAM TO CHECK NO. OF VOWELS IN A STRING;;;;;
.model small
.stack 100h
.data
vowels db 'AEIOUaeiou$'
msg1 db 'Enter a string:$'
msg2 db 'The string is:$'
msg3 db 'No of vowels are:$'
string db 50 dup('$')
count db ?
.code
main proc
mov ax, @data
mov ds, ax
mov es, ax
lea dx,msg1
mov ah,09h             ;for displaying enter a string
int 21h
lea di,string
cld
xor bl,bl
input:mov ah,01         ; stuck here, at taking input, why??
cmp al, 13
je endinput
stosb
inc bl
jmp input
endinput:cld
xor bh,bh
lea si,string
vowelornot: mov cx,11
lodsb
lea di,vowels
repne scasb
cmp cx, 00
je stepdown
inc bh
stepdown: dec bl
jnz vowelornot
mov ah,06                ;;;THIS FOR CLEARING SCREEN I GUESS
mov al,0                  ;;;
int 10h
lea dx,msg2
mov ah,09
int 21h
mov dl, 13                  ;;; NEW LINE
mov ah, 2
int 21h
mov dl, 10
mov ah, 2
int 21h
lea dx,string
mov ah, 09
int 21h
mov dl,13                   ;;;NEW LINE
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
lea dx, msg3
mov ah,09
int 21h
mov dl,13                  ;;;NEW LINE
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
mov count, bh
mov dh, count                   ;;; DH = VOWEL COUNT
mov ah,09
int 21h
mov ah, 4ch                            ;;; EXIT
int 21h
main endp
end

【问题讨论】:

缺少一个 int 21h 来调用 ah=1 函数。 谢谢,嗯。但是,我仍然无法计算元音,问题出在哪里,您能纠正我吗? 终于让这个工作了.....我不知道这里有很多东西不得不改变这些...... ```` add bh, 48 ;;;将数字转为ASCII;;;; mov dl, bh mov ah, 2 ;;;不,我得到了元音的真实计数。是的;;;; int 21h `````` 我无法将这篇文章设为“已回答”? @HansPassant, 【参考方案1】:

多个错误

input:mov ah,01         ; stuck here, at taking input, why??
cmp al, 13

这里您的代码缺少int 21h 指令!

input:
 mov ah,01
 int 21h
 cmp al, 13

 xor bl,bl
input:

 stosb
 inc bl
 jmp input

您正在使用BL 来计算输入字符串中的字符数但是您编写的示例需要远远超过此 byte-sized 寄存器可以提供的最大值 255你。这必须失败!

此外,您设置的缓冲区限制为 50 个字节。你不可能在那里存储这么长的输入。


lea si,string
vowelornot: mov cx,11
lodsb
lea di,vowels
repne scasb
cmp cx, 00
je stepdown
inc bh
stepdown: dec bl
jnz vowelornot

这太复杂了。只需解释 ZeroFlag,根本不要看CX。您不再需要用“$”终止元音文本(使用CX=10)。

 lea si,string
vowelornot:
 lodsb
 mov cx,10
 lea di,vowels
 repne scasb
 jne stepdown
 inc bh        ;Vowel found +1
stepdown:
 dec bl
 jnz vowelornot

mov ah,06                ;;;THIS FOR CLEARING SCREEN I GUESS
mov al,0                  ;;;
int 10h

当然,函数 06h 可以清除屏幕,但您需要提供所有必需的参数。 CX 中的左上角,DX 中的右下角和 BH 中的显示页面。

mov dx, 184Fh   ;(79,24) If screen is 80x25
xor cx, cx      ;(0,0)
mov bh, 0
mov ax, 0600h
int 10h

lea dx,string
mov ah, 09
int 21h

这将失败,因为您没有在输入的字符串末尾添加“$”字符。 如果你之后要直接输出一个 CRLF,为什么不将它添加到缓冲区中呢?

 jmp input
endinput:
 mov ax, 0A0Dh  <-- ADD THIS
 stosw          <-- ADD THIS
 mov al, "$"    <-- ADD THIS
 stosb          <-- ADD THIS

 xor bh,bh

您打印 msg2msg3 后跟一个 CRLF。为什么不将它附加到定义中?不再需要单独输出。

msg2 db 'The string is:', 13, 10, '$'
msg3 db 'No of vowels are:', 13, 10, '$'

mov count, bh
mov dh, count                   ;;; DH = VOWEL COUNT
mov ah,09
int 21h

要输出计数如果它是0到9范围内的数字,您需要将数字转换为字符。只需添加 48 或“0”即可。 不要使用功能 09h。它需要一个地址,而您显然想使用一个字符

mov dl, bh    ;Count of vowels [0,9]
add dl, '0'
mov ah, 02h
int 21h

【讨论】:

非常感谢您的澄清。

以上是关于我被困在“输入字符串:”并且没有进行任何输入 8086 编程的主要内容,如果未能解决你的问题,请参考以下文章

我试图捕捉刷卡的输入,但我被困在使用 C# Windows 窗体

我被困在运行 gradle 任务“assembledebug”

我被困在sql查询上

如何将PhpStorm与Xdebug连接

我被困在从 JSON API 获取数据中,它有点复杂和嵌套,我想从“abilities”数组中获取“resource_uri”

我试图通过在线课程学习在shell(jupyter notebook)/(anaconda提示符)中使用python中的元组。我被困在元组部分