我编写了一个汇编程序,该程序在用户读取的字符串中计算元音数量。读取字符串和长度计算的工作正常。但是,在比较字符串的字符时,它不适用于前两个字符。这是我的代码。
.MODEL small
.STACK
.DATA
input db 10,?
length db ?
count db ?
.CODE
.STARTUP
;reading string
mov dx,00h
mov dx,offset input
mov ah,0Ah
int 21h
;calculating length
mov length,00h
mov si,offset input+2
;checking for vowels
loopi: cmp [si],'$'
je next
add length,01h
inc si
loop loopi
next:
mov cx,00h
mov cl,length
mov si,offset input+2
mov count,00h
counting:cmp [si],'a'
je count1
cmp [si],'e'
je count1
cmp [si],'i'
je count1
cmp [si],'o'
je count1
cmp [si],'u'
je count1
inc si
loop counting
cmp cl,00h
je exit
count1:inc count
inc si
loop counting
exit:
.EXIT
end
此代码没有比较/检查字符串的前两个字符。有人可以尽快帮助我吗?任何帮助将不胜感激。非常感谢。
读取字符串和长度计算的工作正常。但是在比较字符串的字符时,它不适用于前两个字符。
碰巧的是,正是比较部分很好!您的麻烦始于输入并存在,因为您不了解问号在汇编编程中的作用。
input db 10,? length db ? count db ?
在所有这些行中,问号?代表一个单个字节,大多数(如果不是全部),汇编器将初始化为零 0 。因此,您得到的是:
input db 10, 0
length db 0
count db 0
这对长度 and count 都可以功能0AH。您确实没有所需的存储空间。这是 length , count 的内存,依此类推,被错误地覆盖了!
解决方案是input db 10, 0, 10 dup (?)
。这允许输入9个字符。为什么9?因为dos总是将运输返回 13 附加到输入,并且运输返回还需要在此10字节存储空间中由10 dup (?)
定义的10字节存储空间。
此外,此运输返回说明了为什么您的长度计算会失败。当您应该搜索ASCII代码13时,您正在搜索" $"。
当然,计算长度是多余的,因为DOS已经通知您了。输入结构的第二个字节是长度。
mov cx, 0
mov cl, [input+1] ; length
一起:
.DATA
input db 10, 0, 10 dup (?)
count db ?
.CODE
.STARTUP
;reading string
mov dx, offset input
mov ah, 0Ah
int 21h
;checking for vowels
xor cx, cx ; Also clears the CX register like `mov cx, 0`
mov count, cl ; Count = 0
mov si, offset input+2
mov cl, [si-1] ; length is 2nd byte
counting:
cmp [si], 'a'
je count1
cmp [si], 'e'
je count1
cmp [si], 'i'
je count1
cmp [si], 'o'
je count1
cmp [si], 'u'
je count1
inc si
loop counting
cmp cl, 0 You can replace these 2 by
je exit / a single `jmp exit`
count1:
inc count
inc si
loop counting
exit:
.EXIT
更好的解决方案
- 不使用慢速
loop
指令 - 最小化内存访问
- 使用诸如
lodsb
之类的字符串原语 - 如果字符串为空,则不会失败!
- 最小化跳动的量
在此处介绍:
;checking for vowels
cld ; For completeness because `lodsb` depends on it
mov si, offset input+2
mov dl, -1
vowel:
inc dl
other:
lodsb ; This is `mov al, [si]` followed by `inc si`
cmp al, 'a'
je vowel
cmp al, 'e'
je vowel
cmp al, 'i'
je vowel
cmp al, 'o'
je vowel
cmp al, 'u'
je vowel
cmp al, 13
jne other
mov count, dl