当前位置: 技术问答>linux和unix
程序编译后在机器中的存储分配问题
来源: 互联网 发布时间:2017-05-09
本文导语: code first: %include "pm.inc" org 07c00h jmp LABEL_BEGIN [SECTION .gdt] LABEL_GDT: Descriptor 0, 0,0 LABEL_DESC_CODE32: Descriptor 0,SegCode32Len-1,DA_C+DA_32 LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh,DA_DRW GdtLen equ $ - LABEL_GDT GdtPtr dw GdtLen-1 dd ...
code first:
这段代码估计很多人都见过,就不说了。
1.[SECTION .s16]/[SECTION .s32]后面是代码,应该会被汇编成机器码,那么[SECTION .gdt]呢,它会被存储在哪儿?
2.第一句的
表明程序会被加载到07c00h开始执行,不过bin文件不是不包含地址信息都么,那机器如何知道应该加载到7c00h?(个人猜测,是不是bios检测到引导扇区后会自动加载到7c00处去,而汇编程序中给出都这个地址只是为了方便汇编器计算相应的地址?)
3.假如这些机器码被烧写到软盘里面,插入软盘被加载后,代码中的地址是从软盘中寻找还是在内存中寻找?
4.如果想更清楚的了解“代码编写”-“编译连接”-“机器执行”这一过程中的细节(就是说自己写的代码在汇编之后是个什么样子,存储如何分配,在机器中如何被保存并且执行),需要学习哪些方面的知识,有相应都资料或者书籍推荐么?
thans!
%include "pm.inc"
org 07c00h
jmp LABEL_BEGIN
[SECTION .gdt]
LABEL_GDT: Descriptor 0, 0,0
LABEL_DESC_CODE32: Descriptor 0,SegCode32Len-1,DA_C+DA_32
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh,DA_DRW
GdtLen equ $ - LABEL_GDT
GdtPtr dw GdtLen-1
dd 0
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h
xor eax,eax
mov ax,cs
shl eax,4
add eax,LABEL_SEG_CODE32
mov word [LABEL_DESC_CODE32+2],ax
shr eax,16
mov byte [LABEL_DESC_CODE32+4],al
mov byte [LABEL_DESC_CODE32+7],ah
xor eax,eax
mov ax,ds
shl eax,4
add eax,LABEL_GDT
mov dword [GdtPtr+2],eax
lgdt [GdtPtr]
cli
in al,92h
or al,00000010b
out 92h,al
mov eax,cr0
or eax,1
mov cr0,eax
jmp dword SelectorCode32:0
[SECTION .s32]
[BITS 32]
LABEL_SEG_CODE32:
mov ax,SelectorVideo
mov gs,ax
mov edi,(80*11+79)*2
mov ah,0ch
mov al,'P'
mov [gs:edi],ax
jmp $
SegCode32Len equ $ - LABEL_SEG_CODE32
这段代码估计很多人都见过,就不说了。
1.[SECTION .s16]/[SECTION .s32]后面是代码,应该会被汇编成机器码,那么[SECTION .gdt]呢,它会被存储在哪儿?
2.第一句的
org 07c00h
表明程序会被加载到07c00h开始执行,不过bin文件不是不包含地址信息都么,那机器如何知道应该加载到7c00h?(个人猜测,是不是bios检测到引导扇区后会自动加载到7c00处去,而汇编程序中给出都这个地址只是为了方便汇编器计算相应的地址?)
3.假如这些机器码被烧写到软盘里面,插入软盘被加载后,代码中的地址是从软盘中寻找还是在内存中寻找?
4.如果想更清楚的了解“代码编写”-“编译连接”-“机器执行”这一过程中的细节(就是说自己写的代码在汇编之后是个什么样子,存储如何分配,在机器中如何被保存并且执行),需要学习哪些方面的知识,有相应都资料或者书籍推荐么?
thans!
|
《程序员的自我修养—链接、装载与库--书签目录.pdf - 快捷方式》
|
“链接器与加载器”