Let's write β

プログラミング中にできたことか、思ったこととか

SBCLのdisassembleの結果を比較する

SBCLでdisassembleを用いてアセンブラ(?)を出力した時に番地などの詳細情報がでてきて
diffをとって比較するのが困難なので、ちょっと必要な部分だけを抽出してくれるawkスクリプトを書いてみました。

{
	if(NF >= 5 && $3 ~ /.*:/) {
			print $3,$5,$6,$7
	} else {
		if($6 ~ /;/) {
			print $4,$5
		} else {
			print $4,$5,$6
		}
	}
}

ためしに通してみると

; disassembly for HOGE
; 02C7E279:       488B55F8         MOV RDX, [RBP-8]           ; no-arg-parsing entry point
;       7D:       BF08000000       MOV EDI, 8
;       82:       488D0C25AF040020 LEA RCX, [#x200004AF]      ; GENERIC-=
;       8A:       FFD1             CALL RCX
;       8C:       7508             JNE L1
;       8E:       31D2             XOR EDX, EDX
;       90: L0:   488BE5           MOV RSP, RBP
;       93:       F8               CLC
;       94:       5D               POP RBP
;       95:       C3               RET
;       96: L1:   488B55F8         MOV RDX, [RBP-8]
;       9A:       31FF             XOR EDI, EDI
;       9C:       488D0C25AF040020 LEA RCX, [#x200004AF]      ; GENERIC-=
;       A4:       FFD1             CALL RCX
;       A6:       BA00000000       MOV EDX, 0
;       AB:       41BB08000000     MOV R11D, 8
;       B1:       490F44D3         CMOVEQ RDX, R11
;       B5:       EBD9             JMP L0
;       B7:       CC0A             BREAK 10                   ; error trap
;       B9:       02               BYTE #X02
;       BA:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;       BB:       54               BYTE #X54                  ; RCX

HOGE  
MOV RDX, [RBP-8]
XOR EDI, EDI
LEA RCX, [#x200004AF]
CALL RCX 
JEQ L1 
XOR EDX, EDX
L0: MOV RSP, RBP
CLC  
POP RBP 
RET  
L1: MOV RDX, [RBP-8]
MOV EDI, 8
LEA RCX, [#x200004AF]
CALL RCX 
MOV EDX, 8
MOV R11D, 0
CMOVEQ RDX, R11
JMP L0 
BREAK 10
BYTE #X02 
BYTE #X18
BYTE #X54

という風に出力されます。