如何计算汇编代码的位数?

时间:2009-01-16 11:02:15

标签: assembly

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

我的问题是:如何使计数指令计算数字和字母?

4 个答案:

答案 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。如果您需要使用高字节集来计算字符数,那么您也需要考虑到这一点。