程序编译后在机器中的存储分配问题

akeeenet 2013-09-08 12:30:53
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 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!
...全文
295 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
inurlcn 2014-02-12
  • 打赏
  • 举报
回复
《程序员的自我修养—链接、装载与库--书签目录.pdf - 快捷方式》
inurlcn 2014-02-12
  • 打赏
  • 举报
回复
“链接器与加载器”

1,025

社区成员

发帖
与我相关
我的任务
社区描述
Linux /Unix kernel支持不同的硬件体系,X86, ARM, MIPS, 等等
社区管理员
  • CPU和硬件区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧