NASMアセンブリ言語の文字列argv [1]の長さを数えようとしています。私は正しい道にいると思う。私はargv [1]のアドレスをeaxに登録するように移動しましたが、今はバイト単位で移動してヌル文字列ターミネータと比較したいと思います。アセンブリー(NASM)の文字列を繰り返し処理する
私はコードを実行するたびにヌル比較でsegfaultsを実行します。メモリのインデックスを正しく取得できませんか?
*免責事項:これは大きな宿題の一部です。いくつかのヒントとGDBの助けを借りた後
segment .bss
N: resd 1 ;counter for size of argv[1]
segment .text
global asm_main
asm_main:
enter 0,0 ;setup
pusha ;save all registers
mov eax, dword [ebp+8] ;argc to eax
mov ebx, dword [ebp+12] ; address of argv to ebx
mov eax, dword [ebx+4] ; address of argv[1] to eax
mov [N], dword 0 ; N = 0
.loop:
add eax, [N] ; advance index by N
cmp eax, dword 0 ; check for end of string
je .endloop ; break out of the loop if we're done
add [N], dword 1 ; N++
jmp .loop ; loop back for next char
.endloop:
popa
mov eax, 0
leave
ret
実際にどの命令がセグメンテーションされますか? 'add eax、[N]'は固定アドレスから読み込みますので、最初にsegfaultしなければsegfaultしないでください。デバッガを使用してシングルステップを実行し、障害が発生したときにregs/memの内容を確認します。 –
ここで最も明白な問題は、文字列を読むことが決してないことです。ポインタを増分してゼロと比較するだけです。 (そして、 '[N]'が直線的に増加するので、あなたは幾何級数的にeaxを増やします。) –
これはcmp行で消滅します。あなたが正しいです、上記の行は、文字そのものではなく、アドレス(うまくいけば、文字のアドレス)と期待値を比較します。私はcmp [eax]、dword 0を持つべきですか? – Eric