關於鏈結位址

2021-06-18 00:48:07 字數 2641 閱讀 3834

回過頭來看我們的helloworld程式,在makefile中-ttext 0x7c00,鏈結位址為0x7c00,code標號的偏移位址為0x15,則鏈結後其位址為0x7c15, 其他函式呼叫此函式時,也就會呼叫位址0x7c15,這時jmpl $0, $code語句反彙編後為:

假如我們在makefile中改為-ttext 0x0,因為code標號的偏移位址為0x15,則鏈結後其位址為0x15,而code所在的實際記憶體位址為0x7c15,這時我們還想跳轉到code的話可用這條語句jmpl $0x7c0, $code,跳到0x7c0:0x15即0x7c0<<4+0x15=0x7c15處,此時反彙編後為:

可以體會一下-ttext作用同樣是 $code,乙個是0x7c15,乙個是0x15

bootsect.s檔案**

.text  

.globl start/*程式從start處開始執行*/

.code16

start:

jmpl $0, $code

msg:

.string "hello world!"

code:

mov %cs,%ax

mov %ax,%ds

mov %ax,%es

mov %ax,%ss

mov $0x400,%sp

call dispstr/*呼叫顯示字串函式*/

loop0:/*無限迴圈*/

jmp loop0

dispstr:

mov $msg ,%ax

mov %ax ,%bp/*es:bp = 串位址*/

mov $12 ,%cx/*cs = 串長度*/

mov $0x1301,%ax/*ah=13是功能號表示顯示字串 ,al=01是顯示輸出方式*/

mov $0x000c,%bx/*bh=0是0頁,bl=0ch高亮 黑底紅字*/

mov $0 ,%dl/*0行0列*/

int $0x10

ret

makfile檔案

as    =as

ld =ld

ldflags = --oformat binary -n -e start -ttext 0x7c00

image:myboot #head

dd bs=512 if=myboot of=image count=1 conv=notrunc

sync

myboot:bootsect.s

$(as) -o myboot.o -a bootsect.s

$(ld) $(ldflags) -o myboot myboot.o

clean:

rm -f image boot head *.o

.text  

.globl start/*程式從start處開始執行*/

.code16

start:

jmpl $0x7c0, $code //-ttext 0x7c00

msg:

.string "hello world!"

code:

mov %cs,%ax

mov %ax,%ds

mov %ax,%es

mov %ax,%ss

mov $0x400,%sp

call dispstr/*呼叫顯示字串函式*/

loop0:/*無限迴圈*/

jmp loop0

dispstr:

mov $msg ,%ax

mov %ax ,%bp/*es:bp = 串位址*/

mov $12 ,%cx/*cs = 串長度*/

mov $0x1301,%ax/*ah=13是功能號表示顯示字串 ,al=01是顯示輸出方式*/

mov $0x000c,%bx/*bh=0是0頁,bl=0ch高亮 黑底紅字*/

mov $0 ,%dl/*0行0列*/

int $0x10

ret

.org 0x1fe, 0x90

.word 0xaa55

makefile:

as    =as

ld =ld

ldflags = --oformat binary -n -e start -ttext 0x0

image:myboot #head

dd bs=512 if=myboot of=image count=1 conv=notrunc

sync

myboot:bootsect.s

$(as) -o myboot.o -a bootsect.s

$(ld) $(ldflags) -o myboot myboot.o

clean:

rm -f image boot head *.o

20180601 鏈結位址

已知表頭元素為 c 的單鏈表在記憶體中的儲存狀態如下表所示。現將 f 存放於 1014h 處並插入到單鏈表中,若 f 在邏輯上位於 a 和 e 之間,則 a,e,d 的 鏈結位址 依次是 1010h,1014h,1004h 1010h,1004h,null 1014h,1010h,1004h 101...

鏈結位址和儲存位址

什麼是儲存位址呢?我們知道,我們編寫的c 會被編譯成彙編指令,進一步變成機器碼,最後載入到arm的記憶體中。也就是說我們的彙編指令被儲存在記憶體之中,而指令對應的位址,就是他的 儲存位址 其實 儲存位址 的值,一直由pc這個暫存器所記載著。想改變 儲存位址 的值直接改變pc好了 再說鏈結位址,他是指...

鏈結位址和執行位址

位置無關 和位置有關 位置無關 要好一些,適應強,放在 都可以執行 位置有關 就必須。三星推薦的啟動方式 bootloader必須大於16kb並小於96kb,假定bootloader為80kb,啟動過程是這個樣子 先開機上電後bl0執行,bl0會載入外部啟動裝置中的bootloader的前16kb ...