假设我有一个用汇编语言编写的程序,它接受用户输入的句子(数字和字母的组合),下一行将显示句子中小写字母的数量。同时显示句子中的位数。
我的问题是:我怎样才能使计数指令来计算数字和字母?
假设我有一个用汇编语言编写的程序,它接受用户输入的句子(数字和字母的组合),下一行将显示句子中小写字母的数量。同时显示句子中的位数。
我的问题是:我怎样才能使计数指令来计算数字和字母?
我假设您的意思是 x86 程序集,并且字符串以空值结尾。
mov eax, STRING_VARIABLE
xor ebx, ebx
xor ecx, ecx
.loop:
mov dl, [eax]
cmp dl, 0
jz .end
cmp dl, '0'
jb .notdigit
cmp dl, '9'
ja .notdigit
inc ecx
jmp .notlowercase
.notdigit:
cmp dl, 'a'
jb .notlowercase
cmp dl, 'z'
ja .notlowercase
inc ecx
.notlowercase:
inc eax
jmp .loop
.end:
; ebx contains the lowercase letter count
; ecx contains the digit count
我认为 Mehrdad 对要完成的工作有大致的了解。
不过,只是一些观察——
在“ inc ecx ”之后跳转到 .notlowercase可以节省几个周期,这可能是一个疏忽——
我认为最后一个inc ecx应该是inc ebx
考虑到这只是字母/数字字符,对上/下测试略有扭曲,在 .notdigit 标签之后,可以将小写测试替换为
.notdigit:
and dl, 0x20
jz .notlowercase
inc ebx
.notlowercase:
只是我的 2 美分——:)
这也会为 Unicode 字符串提供不正确的结果。给定 UTF-16,您需要将 eax 增加 2。如果您需要使用高字节集计算字符,您也需要考虑这一点。
如果它是一个以字符串长度作为第一个字节的 Pascal 字符串,您将修改如下;
mov eax, STRING_VARIABLE
xor ebx, ebx ; A tiny bit quicker and shorter than mov ebx,0
xor ecx, ecx
mov dh,[eax] ; dh is loop counter based on string length
inc eax ; move onto the string data
.loop:
cmp dh,0
jz .end
.
.
.
.notlowercase:
dec dh
jmp .loop
.end: