我正在對IDA的一個大型Amiga項目進行逆向工程,並取得了很大的進展。但是,有一些我不太明白的東西。也就是說,我發現了幾個使用我認爲是「跳轉表」的子程序 - 但我無法弄清楚它們是如何工作的。有人有建議嗎?幫助68k大會 - 跳轉表?
moveq #0,d0
move.b d7,d0 ; set D0 to a byte from CTRL
subq.w #1,d0 ; subtract 1 from it
blt.w finish_29ABA ; if D0 is less than 1, branch
cmpi.w #$16,d0
bge.w finish_29ABA ; if D0 is greater than or equal to 16, branch
add.w d0,d0 ; otherwise, double D0
move.w dword_29918(pc,d0.w),d0
jmp dword_29918+2(pc,d0.w)
; ---------------------------------------------------------------------------
dword_29918: dc.l $400036 ; CODE XREF: serialCtrlCmd+E0j
dc.l $360036
dc.l $3601A0
dc.l $3601A0
dc.l $1A001A0
dc.l $360040
dc.l $2A01A0
dc.l $400036
dc.l $3601A0
dc.l $1A00036
dc.l $1A00036
dc.l $33FC0003
dc.l HEAP_3B897+$41A7 ; CTRLRead3
; ---------------------------------------------------------------------------
bra.w finish_29ABA
; ---------------------------------------------------------------------------
tst.w (CTRL_36494).l
bne.w return_29AF6
moveq #1,d0
lea ((HEAP_3B897+$2665)).l,a0
adda.w (CTRLRead1).l,a0
move.b d7,(a0)
moveq #0,d1
move.b d7,d1
move.w d1,(CTRLRead2).l
move.w (CTRLCmds).l,d1
addq.w #1,d1
move.w d1,(CTRLCmds).l ; Increment CTRL Cmds by 1
move.w d0,(CTRLRead3).l
bra.w finish_29ABA
IDA是68k的唯一反彙編程序嗎? –
有很多,但我發現的大部分是Amiga平臺本身。我相信還有其他幾個人。 – AriX
請記住,Amiga的大部分代碼都是完全「可重定位」的。使用跳轉表幾乎是一個標準(甚至對於系統庫)。程序加載器將「重新定位」所有固定地址(一個安全的操作,因爲沒有虛擬內存管理),然後所有的跳轉/引用都作爲偏移完成。 –