動態庫函式 printf研究

2021-07-24 18:50:08 字數 1948 閱讀 3330

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 把生成的格式化的字串放入此...