ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Exercise 2.8

このCソースがどのようなアセンブラになるかという問題

	data = receiver.receivedByte;
	receiver.ready = 0;
	receiver.enable = 1;

gccの出力から該当箇所を抜き出しました。

  • data = receiver.receivedByte;

receiverの値をメモリからレジスタへ転送、右シフトでレジスタの位置調整、andで関係の無いbitを0にする、レジスタの内容をメモリへ書き込み、をしています。

	lw	$2, receiver
	srl	$2,$2,22
	andi	$2,$2,0xff
	sw	$2, data
  • receiver.ready = 0;

receiverの値をメモリからレジスタへ転送、liとori命令を使い0x7FFFFFFFを作る、andを取って最上位ビット(receiver.ready)を0にする、メモリへ書き込み、をしています。

	lw	$3, receiver
	li	$2, 2147418112			# 0x7fff0000
	ori	$2, $2,0xffff
	and	$2, $3,$2
	sw	$2, receiver
  • receiver.enable = 1;

receiverの値をメモリからレジスタへ転送、0x40000000とorを取って30bit目(receiver.enable)を1にする、メモリへ書き込み、をしています。

	lw	$3, receiver
	li	$2,1073741824			# 0x40000000
	or	$2, $3,$2
	sw	$2, receiver