3

ユーザーから入力文 (数字と文字の組み合わせ) を受け取り、次の行に文中の小文字の数を表示するアセンブリ言語で書かれたプログラムがあるとします。文の桁数も表示します。

私の質問は、数字と文字を数えるカウント命令を作成するにはどうすればよいですか?

4

4 に答える 4

3

x86アセンブリを意味し、文字列はnullで終了していると思います。

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 に答える