1

私はnasmのスタックをよりよく理解しようとしているので、nasmの「関数」に「引数」を渡すようにこのプログラムを作成しました。私はこのアセンブリに非常に慣れていません。

section .data
v0s0msg0:       db 'Enter something',10
v1t0msg0L:      equ $-v0s0msg0

section .bss
v2i0inp0        resb 256
v3v0temp0   resb 256

section .text
global _start
_start:
;This is a nasm program to help me understand the stack better
mov eax,4
mov ebx,1
mov ecx,v0s0msg0
mov edx,v1t0msg0L
int 80h

mov eax,3
mov ebx,0
mov ecx,v2i0inp0
mov edx,256
int 80h

push dword v2i0inp0
call f0m0test0

mov eax,1
mov ebx,0
int 80h

f0m0test0:
pop dword[v3v0temp0]
mov eax,4
mov ebx,1
mov ecx,v3v0temp0
mov edx,256
int 80h
ret 4

アセンブル、リンク、および実行は問題なく実行できますが、実行時に入力を入力すると、2 つの「?」の後にセグメンテーション違反が表示されるだけです。見た目のキャラクター。

変えてみました

pop dword[v3v0temp0]

次のようなものに:

pop v3v0temp0

あるいは:

mov v3v0temp0,dword[ebp]

そのような多くのことですが、それらはすべてセグメンテーション違反、または次のようなアセンブラのエラーとして終了します: オペコードとオペランドの無効な組み合わせ このプログラムを機能させるために助けていただければ幸いです。また、少し説明してください接頭辞「dword」を使用したスタック、および「[]」文字の目的。スタックを「引数」に使用する方法だけを説明してください。これをLinux OS、Ubuntuで実行しています よろしくお願いします

4

1 に答える 1

2
f0m0test0:
pop dword[v3v0temp0]

これにより、パラメーターではなく、スタックから戻りアドレスがポップされます。

mov eax,4
mov ebx,1
mov ecx,v3v0temp0
mov edx,256
int 80h
ret 4

popスタックから何か (意図したパラメーターではありませんが)をすでに編集しているため、ret 4上記はほぼ間違いなく間違っています。

私はあなたがただ欲しいと思う:

f0m0test0:
mov eax,4
mov ebx,1
mov ecx,[esp+4]
mov edx,256
int 80h
ret 4

または、呼び出し先が でパラメーターをクリーンアップする代わりに、呼び出しret 4元にそれを行わせます (これは通常の呼び出し規則だと思います)。

push dword v2i0inp0
call f0m0test0
add esp,4
于 2012-06-24T17:09:39.477 に答える