私のプロジェクト作業のために、コード スニペットをテストしました。そして、このコード スニペットは、スタックの使用によりセグメンテーション フォールトが発生することがわかりました。しかし、スタックを使用して解決する必要があります。誰でも問題を見つけるのを手伝ってもらえますか? 私のプログラムは、文字列変数の 2 番目の文字を表示します。私のコードスニペットは次のとおりです。
section.data
string db "test",10,0
msg2 db "%c",10,0
main:
xor eax,eax
mov eax, string
mov ebx,1 ; suppose I want to get the second character of string. SO I store the index of that character in ebx
pusha
push eax
push ebx
add esp,8
popa
pop dword[ebx] ; **I assume that this following 3 lines arise segmentation fault**
pop eax ;
mov bl,[eax+ebx] ; I want to move the fisrt character to BL using the index value stored in ebx which i popped just.
pusha
push ebx
call putchar
add esp,4
popa
pusha
push msg2
call printf
add esp,4
popa
念のため、このコード スニペットの目的はスタックの操作方法を理解することであることを明確にしたいと思います。
ここで、@nrz は最近、次のコードのアイデアを教えてくれました。ここで上記のコードを編集します。
section.data
string db "test",10,0
msg2 db "%c",10,0
main:
xor eax,eax
mov eax, string
mov ebx,1 ; suppose I want to get the second character of string. SO I store the index of that character in ebx
mov eax,string
movzx eax,byte [eax]
push eax ; these push and pop are for solving it using the stack,
pop ebx
pusha
push ebx
call putchar
add esp,4
popa
pusha
push msg2
call printf
add esp,4
popa
私のクエリは具体的には次のとおりです。
指標値をあげます。登記簿に記載すべき
ebx
ですか?そして何よりも、スタックを使用する主なアイデアは、以前
string
にプッシュしたインデックス値を使用して、変数のすべての文字にアクセスすることebx
です。[それが必須です。出来ますか?]出力を8ビットレジスタにも格納したい。
だから私のすべてのアイデアは次のようなものです:
mov al, [string+ebx] ;is it possible?
ebx
スタックから値を取得する必要があります。に値を入力しebx
、push ebx
の時点で値mov al,[string+ebx]
をpop ebx
取得してmov
指示します。指示は次のようになります。pop ebx mov al,[string+dword[ebx]] ;which is a wrong statement shown by NASM
あなたの反応を楽しみに待っています。
ありがとうございました、