3

假设我有一个用汇编语言编写的程序,它接受用户输入的句子(数字和字母的组合),下一行将显示句子中小写字母的数量。同时显示句子中的位数。

我的问题是:我怎样才能使计数指令来计算数字和字母?

4

4 回答 4

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
于 2009-01-16T11:09:20.403 回答
0

我认为 Mehrdad 对要完成的工作有大致的了解。

不过,只是一些观察——

在“ inc ecx ”之后跳转到 .notlowercase可以节省几个周期,这可能是一个疏忽——

我认为最后一个inc ecx应该是inc ebx

考虑到这只是字母/数字字符,对上/下测试略有扭曲,在 .notdigit 标签之后,可以将小写测试替换为

.notdigit:
    and   dl, 0x20
    jz   .notlowercase
    inc   ebx
.notlowercase:

只是我的 2 美分——:)

于 2009-01-23T02:50:40.070 回答
0

这也会为 Unicode 字符串提供不正确的结果。给定 UTF-16,您需要将 eax 增加 2。如果您需要使用高字节集计算字符,您也需要考虑这一点。

于 2009-01-23T03:13:10.693 回答
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:
于 2009-01-16T11:33:13.057 回答