as86,ld86简单应用

     语句可以是只包含空格、制表符和换行符的空行,也可以是赋值语句(或定义语句)、伪操作符语句和机器指令语句。赋值语句用于给一个符号或者标识符赋值。它由标识符后跟一个等于号,在跟一个表达是组成。伪操作符语句是汇编器使用的指示符,他通常并不会产生任何代码。它由伪操作码和0个或多个操作数组成。每个操作码都由一个点字符“.”开始。

     汇编器编译产生的目标文件objfile通常至少包含3个段或区(section),即正文段(.text)、数据段(.data)和未初始化数据段(.bss)。正文段(或者称为代码段)是一个已初始化过的端,通常其中包含程序的执行代码和只读数据。数据段也是一个已初始化过的段,其中包含可以读写的数据。而未初始化数据段是一个未初始化的段。

       .globl  begtext,begdata,begbss,endtext,enddata,endbss

       .text

       begtext:

       .data

       begdata:

       .bss

       begbss:

       .text

       BOOTSEG =0x07c0

       entry   start                                                                    !告知链接程序,程序从start标号处开始执行

       start:

                    jmpi               go,BOOTSEG                             !段间跳转,BOOTSEG指出跳转段地址,标号go是便宜地址

go                mov               ax,cs

                    mov               ds,ax

                    mov               es,ax

                    mov               [msg1+17],ah                             

                    mov               cs,#20                                        !共显示20个字符,包括回车换行符

                    mov               dx,#0x1004                                !字符串将显示在屏幕第17行,第5列处

                    mov               bx,#0x000c                                !字符显示属性(红色)

                    mov               bp,#msg1                                   !指向要显示的字符串

                    mov               ax,#0x1301                                !写字符串并移动光标到串结尾处

                    int                  0x10                                           !BIOS中断调用0x10,功能0x13,子功能01

loop0:          jmp                loop0

msg1:          .ascii              "Loading system ..."

                    .byte              13,10

.org    510                                                                              !表示以后语句从地址510(0x1fe)开始存放

                    .word             0xAA55                                        !有效引导扇区标志,供BIOS加载引导扇区使用

.text

endtext:

.data

enddata:

.bss

endbss:

标识符entry是保留关键字,用于迫使连接器ld86在生成的可执行文件中包括其后指定的标号start。通常在链接多个目标文件生成一个可执行文件时应该在其中一个汇编程序中用entry指定一个入口标号,以便调试。

as86和ld86使用简介

as86:

as    [-03agjuw]   [-b [bin] ]    [0lm  [list] ]   [-n  name]   [-o  objfile]  [-s  sym]  srcfile

默认设置(除了一下默认值以外,其他选项默认为关闭或无;如没有明确说明a标志,则不会有输出):

-3        使用80386的32位输出;

list       在标准输出上显示;

name  源文件的基本名称(即不包括“.”后的扩展名);

各选项含义:

-0        使用16bit代码段

-3        使用32bit代码段

-a        开启与GNU as,ld的部分兼容性选项

-b        产生二进制文件,后面可以跟文件名

-g        在目标文件中仅存入全局符号

-j         是所有跳转语句均为长条转

-l         产生列表文件,后面可以跟随列表文件名

-m       在列表中扩展宏定义

-n        后面可以跟随模块名称(取代源文件名称放入目标文件中)

-o        产生目标文件,后跟目标文件名(objfile)

-s         产生符号文件,后跟符号文件名

-u        将未定义符号作为输入的未指定段的符号

-w        不显示警告信息

 

ld连接器的使用语法和选项如下:

ld    [-03Mims [-] ]    [-T  textaddr]    [-llib_extension]    [-o  outfile]   infile ...

默认设置

-03          32位输出

outfile      a.out格式输出

 

-0            产生具有16bit魔数的头结构,并且对-lx选项使用i86子目录

-3            产生具有32bit魔数的头结构,并且对-lx选项使用i86子目录

-M           在标准输出设备上显示已链接的符号

-T            后面跟随正文基地址

-i             分离的指令与数据输出;

-m           在标准输出设备上显示已链接的模块

-o            指定输出文件名,后跟输出文件名

-r            产生适合于进一步重定位的输出

-s            在目标文件中删除所有符号

 

转载于:https://www.cnblogs.com/lsf90/archive/2012/02/19/lp.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译过程: 1). 解压后默认的文件夹位置是在D:\Linux-0.11,如果你不是将文件解压到该目录下, 你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录. 2). 打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台. 3). make 一下,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean" 4). 如果安装了bochs,直接双击bochsrc.bxrc即可运行Linux-0.11了. 5). 也可用其它虚拟机加载Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了 6). 在出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车 这就是能在windows环境下编译的Linux 0.11了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW. 下面是在Windows下编译Linux 0.11会遇到的问题和对原文件作的修改: 1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的下划线去掉了,但MinGW的gcc可能是为了与其它Windows下的编译器保持兼容,并不能识别这些不带下划线的C变量,因而还得把原先已经在汇编程序中去掉下划线的C变量加上下划线,同时也要把被C程序引用的汇编程序中的变量加上下划线. 2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm. 3.在Makefile作的主要修改: 在LDFLAGS中加了--image-base 0x0000 将elf_i386改成i386pe 将cd 与 make 之间的;改成&,如cd kernel ; make 改成cd kernel & make MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main函数,编译成sync.exe 因为类似的原因,make dep会出错 4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是windows下的可执行文件的格式,显然是不能直接执行的,必须加以转化.我实现了通过两种方式加以转化. 1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块直接加载的.我已经将这个程序放在了Linux-0.11的tools目录下,要微软的编译器编译. 2)自己写一个PE Loader,这种方式比较麻烦,但是想想自己也能做一个PE Loader,还是满有成就感的,尽管这是一个最简单的Loader.代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释. 5.对tools下的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img 6.在Link的过程中,init目录下的main.c会出现以下错误: boot/head.o(.text+0x540c):fake: undefined reference to `_main' init/main.o(.text+0x16f):main.c: undefined reference to `_alloca' init/main.o(.text+0x174):main.c: undefined reference to `__main' make: *** [tools/system.exe] Error 1 第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为Linux 0.11根本没有这个函数,在gcc的编译选项里也有-nostdinc .有一个解释是main函数不是一个普通的函数,MinGW gcc会对它作特殊的处理.解决的办法其实也很简单,把main.c下面的main函数改名为_main,或者是干脆把它改成另外一个函数,就改成start吧.记得把head.s里的_main也改了. 在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的,有了在Windows下编译Linux 0.11源代码的经验,移植高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。 也要感谢Linux内核完全注释的作者赵炯博士,是他拉接了操作系统操作系统爱好者的距离. 最后,我也非常想和操作系统爱好者们共同交流心得体会,也希望能多认识一些朋友. 我的网名:flyfish 我的QQ:785606288 E-mail:I2CBus@126.com 另外,要转载请保持本文件的完整性,请尊重别人的劳动果实. 修改日志: 08/3/29 修改了一下Makefile,旧的Makefile在某些文件更新后还会重新编译。 修改了Trans.cpp中的一个dug,该dug在translate MinGW gcc编译的程序时可能会出错。用MinGW gcc 编译的程序的VirtualAddress的形式可能是0xFFC1000这样的形式,其实0x1000才是它的VirtualAddress 08/4/2 修改了下MinGW32.bat,现在已经不用重设路径了。 08/4/4 Trans.cpp还是有错,如果VirtualAddress>0xffff,那么生成的system.bin就错了,bochs调试时会一直重启。 权宜之计,把0xffff再改成0x3ffff,这样VirtualAddress就不能大于0x3ffff,不知谁有更好的解决方法,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值