32 ビット Ubuntu の NASM アセンブリを学習します。
呼び出す前に、スタックにプッシュした数値を単純に出力する関数を実行します。
SECTION .text
global main
main:
; -----------------------------------------------------------
; Main
; -----------------------------------------------------------
push 5
call print_number
; -----------------------------------------------------------
; Exit
; -----------------------------------------------------------
mov EAX,1
int 0x80
; -----------------------------------------------------------
; Prints a number
; -----------------------------------------------------------
print_number:
push EBP
mov EBP,ESP
mov EAX,4
mov EBX,0
mov ECX,[EBP + 8]
add byte [ECX],'0'
mov EDX,1
int 0x80
pop EBP
ret
セグメンテーション違反エラーが発生し続けます。
見てみましょう...関数を呼び出すと、スタックは次のようになります。
- 5
- 差出人住所
次にプッシュしEBP
ます:
- 5
- 差出人住所
- EBP
スタックのベースのアドレスを含めたいEBP
ので、次のようにします。
mov EBP, ESP
したがって、基本的EBP
にはスタックのベースへのアドレスになりました。ECX
私が印刷しようとしているもののアドレスである必要があるECX
ので、印刷したいものをEBP
指すように(スタックのベースのアドレス)を8バイト移動する必要があります:5
mov ECX,[EBP + 8]
そしてそれを印刷するには、最初にASCIIに変換します:
add byte [ECX],'0'
ここで問題がわかりません。セグメンテーション違反が発生するのはなぜですか?