假设我有一个用汇编语言编写的程序,它接受用户的输入句子(数字和字母的组合),并在下一行显示句子中的小写字母数。同时显示句子中的位数。
我的问题是:如何使计数指令计算数字和字母?
答案 0 :(得分:3)
我假设您的意思是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
答案 1 :(得分:0)
如果它是一个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:
答案 2 :(得分:0)
我认为Mehrdad对于想要实现的目标有一个总体思路;
虽然只是一些观察 -
在“ inc ecx ”之后跳转到.notlowercase会节省几个周期,可能是疏忽 -
最后 inc ecx 我认为应该 inc ebx
对于上/下测试稍微扭曲,假设这只是 字母/数字字符,在.notdigit标签之后,小写测试可以替换为
.notdigit:
and dl, 0x20
jz .notlowercase
inc ebx
.notlowercase:
只是我的2美分 - :)
答案 3 :(得分:0)
这也会给Unicode字符串带来错误的结果。给定UTF-16,您需要将eax增加2。如果您需要使用高字节集来计算字符数,那么您也需要考虑到这一点。