当前位置:  技术问答>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:
%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 - 快捷方式》

|
“链接器与加载器”

    
 
 

您可能感兴趣的文章:

  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题
  • tc编译的dos程序和vc编译的win32控制台程序的异同
  • JB下,我的程序编译得好慢!请问用什么方法编译才可以快一点?或编译顺序改变一下?
  • 在cygwin编译驱动程序要不要交叉编译?
  • 编译JAVA程序的时候,如果需要的JAR不在CLASSPATH,有什么办法能成功编译吗???
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • rethat系统以前是32位的 现在想用64位的,ESQL编译C程序,需要加什么编译参数啊?
  • 在网上下的许多ubuntu程序都需要编译,那应该用什么编译?
  • 怎么查看arm平台上的程序是用那个版本的交叉编译器编译的????
  • 在linux下用proc编译程序,'*.pc'文件编译后成了'*.c?',多了一个问号?
  • 请问在linux下编译程序怎么设置编译器字节对齐?
  • 谁编译过PLX9054 Linux的驱动程序,我给100分教我编译和安装??
  • 请问:在proc程序中,若里面有模板的类型,能不能通过预编译啊,(编译时老是无法识别类型,我的头文件都已包含了)
  • 使用gcc编译器进行代码编译出来的程序是否遵循gpl协议
  • 用-g编译器选项编译程序就在makefile中按下面样子的加进去吗:
  • unix环境高级编程》源程序编译的讨论,编译成功、不成功的都请进!!!
  • 菜鸟问题: redhat linux 编译一个最简单的c程序, 其中包含了<studio.h>头文件,但在gcc编译时,提示找不到studio.h文件,请问各位大大
  • 有人说用vc++写的程序,代码可以直接拿到linux下找编译器,就可以编译,是真的吗?
  • 如果重新编译了.so文件后,但程序运行结果还是编译前的情况,大概是什么问题呢?
  • c程序对内存分配怎么管理?
  • 求一个ip地址池分配地址的小程序。谢谢了
  • 如何在java程序中获得拨号上网分配的动态IP?
  • 那位高人有任务分配问题的禁忌搜索算法、模拟退火算法的算法实现程序啊
  • 求助:关于双核程序运行资源分配的问题,一大一小啊现在。。。
  • 嵌入式linux的应用程序分配内存地址问题
  • 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题
  • 一个程序如何被操作系统调用分配然后执行的呢?
  • 高分求救!我在uclinux上运行应用程序时出现内存分配错误,不知如何解决,解决者高分!!
  • 如果释放动态内存多于当初分配的数目,积少成多会造成程序崩溃吗?
  • 在我的java程序中,我从数据库中得到一批数据,不能确定是多少个,我要把它保存到我的java数组中,可是怎样才能向C++中的数组一样可以自由分配空间,在java中我必需预先指定大小,不会一定要用java中的那个可改变数组大小的类吧?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 32位机器上编的程序能在64位机器上跑吗?
  • 为什么在我机器上写的程序,放在别人机器上编译有问题啊?
  • 一台机器上编译的程序为什么不能在另一台机器上运行?急!!
  • 为什么一台机器上编译的程序不能在另一台机器上执行?
  • 32位机器上编译的程序能在64位机器上运行吗
  • 奇怪的程序:相同的程序不同机器上编译产生了不同的行为,为什么???
  • Linux下面的开发好的Java程序,如何部署到其他机器?开发好的Java图形程序,终端上能否用?等问题
  • 用GTK编写的程序程序,在我的机器上能用,并生成了可执行文件,可是!
  • 谁知道怎么在启动在其他linux机器上的程序吗?
  • linux下依赖于boost库的程序,拷到其他的linux机器上
  • 把socket客户端程序和服务端程序放在同一机器上运行,可以吗?
  • linux gdb: 我在一台机器上编译的程序用GDB可以调试,把程序放到另外一台机器上调试,调试信息就没有了 这是什么原因呢?
  • 编一个程序,检测Linux系统下机器网卡的状态(只要检测网络线是否被拔掉?)
  • 请教如何在程序中修改机器的IP地址?
  • linux程序中如何检测机器所用的硬件
  • 为什么程序在2.6内核的机器上正常,到了2.4内核的机器上就不好用了????????
  • 如何用程序生成一个本地机器上一个类的实例?
  • 如何用JAVA程序取得UNIX机器下的当前用户?
  • 谁能告诉我,怎样知道我所使用的机器安装了几个cpu(用c程序)
  • 机器上直接装 linux 驱动程序哪里可以找到
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • windows server2008上PowerBuilder程序系统错误解决方法
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • 程序员的八种级别,你属于哪一级?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 我的程序是用c写的gtk+程序,有个函数的参数要传给它图片的文件名,但是图片和原程序不在同一目录下怎么办?怎么在程序里指定文件的路径
  • 在docker容器中通过apt-get安装新的程序


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,