1

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'

ここで問題がわかりません。セグメンテーション違反が発生するのはなぜですか?

4

1 に答える 1