回過頭來看我們的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 ...