読者です 読者をやめる 読者になる 読者になる

アセンブラでほげほげする

ASM

アセンブラを吐かせる。

gcc -S hello.c

こんな出力が。

	.cstring
LC0:
	.ascii "Hello C!\0"
	.text
.globl _main
_main:
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%ebx
	subl	$20, %esp
	call	L3
"L00000000001$pb":
L3:
	popl	%ebx
	leal	LC0-"L00000000001$pb"(%ebx), %eax
	movl	%eax, (%esp)
	call	L_puts$stub
	movl	$0, %eax
	addl	$20, %esp
	popl	%ebx
	leave
	ret
	.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_puts$stub:
	.indirect_symbol _puts
	hlt ; hlt ; hlt ; hlt ; hlt
	.subsections_via_symbols


AT&T表記

  • レジスタの名前の前に%
  • レジスタの値が指すアドレスを表わすときは()
  • longとかDWORD、BYTEの修飾のためにlやw、bを付ける(付録1に詳細が)

アセンブリ言語

  • 「55」という2桁の16進のマシンコードを「pushl %ebp」という表現として定義
  • CPUに対する命令を、このような人間にとって分かりやすい(?)表現にしたものがアセンブリ言語

アセンブラのリスティングファイル

as -al hello.s

がMacだと動かなす。。。

ESP、CPU、メモリ

この本だと%espと書くらしい。CPUの中のレジスタと呼ぶ特別な記憶領域。レジスタは値を保存するだけでなく、演算や実行状態を保存する特別な役割がある。

CPU

  • 一連の命令を順に読み込んで解釈し、その結果に従ってデータの移動や演算を行なう
  • 演算をするときの値や結果などの情報はレジスタおちう特別な記憶領域に保存される
  • ESPはレジスタの一つ
  • レジスタには(授業で出てきてたような)
    • アキュムレーター
    • カウントレジスタ
    • ベースポインタ

などなどいくつか種類がある。

gdbでデバッグ

gcc -g -o hello hello.s

でアセンブラもデバッグできる。gdbすごす。