ユーザーから入力文 (数字と文字の組み合わせ) を受け取り、次の行に文中の小文字の数を表示するアセンブリ言語で書かれたプログラムがあるとします。文の桁数も表示します。
私の質問は、数字と文字を数えるカウント命令を作成するにはどうすればよいですか?
ユーザーから入力文 (数字と文字の組み合わせ) を受け取り、次の行に文中の小文字の数を表示するアセンブリ言語で書かれたプログラムがあるとします。文の桁数も表示します。
私の質問は、数字と文字を数えるカウント命令を作成するにはどうすればよいですか?
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
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: