entry(my_tgkill)
s***b sp!,
//ldr r0, debug_message
//mov r1, pc
//bl dp_printf
ldr r4, debug_message
mov r0, r4
mov r1, pc
nopnop
nopbl printf
nopnop
nopnop
nopadd r4,r4,#20
mov r0, r4
str r0, [r0]
ldr r0, func_point123
nopadd
ip, pc, #0, 12
nopnop
nopnop
addip, ip, #8192
ldrr1, [ip, #1896]
/*00000654 :
654:
e28fc600
add ip, pc, #0, 12
658:
e28cca02
add ip, ip, #8192
; 0x2000
65c:
e5bcf954
ldr pc, [ip, #2388]!
; 0x954
*/nop
nopnop
nopnop
ldr r0, debug_message
//bl printf
blx r1
//r1為printf的位址 在got表中 實際中是跳轉到00000654 :
654:e28fc600add ip, pc, #0, 12
658:e28cca02add ip, ip, #8192; 0x2000
65c:e5bcf954ldr pc, [ip, #2388]!; 0x954
,從got表中獲取printf的實際位址,我計算了654與本程式pc的偏移,然後直接算出got表中printf
的位址blx r1呼叫之,由於printf是thrumb指令,用blx
//add lr, pc
//movs
pc, r1
//add
ip, ip, #4096
//ldr
pc, [ip, #2444]!
//mov r1,ip
//bl dp_printf
//59c:
e28fc600
.word
0xe28fc600
//5a0:
e28cca01
.word
0xe28cca01
//5a4:
e5bcfa58
.word
0xe5bcfa58
//ldr r3, printf
//ldr pc,printf
//add
ip, pc, #0, 12
//add
ip, ip, #4096
//;0x1000
//ldr
pc, [ip, #2656]!
//; 0xa60
ldmia sp!,
error_code: .word 0x1ffc
func_point123: .word printf
debug_message: .word debug_string
end(my_tgkill)
entry(dp_printf)
s***b sp!,
bl printf
ldmia sp!,
end(dp_printf)
.data
debug_string:
.string "valuewww = 0x%x.\n"
.space 0x400, 0
.end
模擬實現庫函式 printf
上次在部落格中提到過可變引數列表的使用,今天我再次使用可變引數列表來模擬實現庫函式printf。實現 如下 如有不理解的地方請檢視可變引數列表那篇部落格 include includevoid my printf const char format,break case s break defaul...
c 庫函式 printf函式使用方法
printf 函式是式樣化輸出函式,一般用於向準則輸出裝置按規定式樣輸出訊息。正在編寫步驟時經常會用到此函式。printf 函式的挪用式樣為 printf 式樣化字串 參數列 其中式樣化字串包括兩部分內容 一部分是正常字元,這些字元將按原樣輸出 另一部分是式樣化規定字元,以 開端,後跟乙個或幾個規定...
關於printf的幾個C語言庫函式
一 vsnprintf,c語言庫函式之一,屬於可變引數。用於向字串中列印資料 資料格式使用者自定義。函式原型 int vsnprintf char str,size t size,const char format,va list ap 引數說明 char str out 把生成的格式化的字串放入此...