as86汇编语言程序
.global begtext,begdata,begbss,endtext,enddata,endbss
是全局标识符,供ld86链接用的.text
是正文段.data
是数据段,.bss
是未初始化数据段entry start
告诉链接程序,程序是从start标号处开始执行jmpi go,BOOTSEG
段间跳转.org 510
表示以后语句从地址510开始存放- 在as86汇编程序中,凡是以感叹号!或分号;开始的语句其后面均为注释文字,
- 汇编指示符以一个字符
.
开始,并且不会在编译时产生任何代码,汇编指示符有一个伪操作码,后跟0或多个操作数组成, - 标号是后面带冒号的标识符
.global
伪操作符用于定义随后的标号标识符是外部的还是全局的,并且即使不使用也强制引入。.data
.text
.bss
分别对应汇编程序编译产生目标文件中的3个段,即正文段、数据段和未初始化段。.text
用于标识正文段的开始位置,并把当前切换到text段,.data
用于标识数据段的开始位置,并把当前段切换到data段,而`.bss’用于标识一个未初始化数据段的开始,并把当前段改成bss段,entry
是保留关键字,用于迫使链接器ld86在生成的可执行文件中包括其后指定的标号’start‘。- 在as86中,间接操作数需要使用
[]
方括号对。 - 定义字符串需要使用伪操作符
.ascii
,并且需要使用双引号盖住字符串 ,伪操作符.asciiz
还会自动在字符串后面添加一个NULL(0)字符。 - 定义字符需要使用伪操作符
.byte
,并且需要单引号把字符括住。 .org
定义了当前汇编的位置。- 伪操作符
.word
用于在当前位置定义一个双字节内存对象,其后可以是一个数或者表达式
as86汇编语言程序的编译和链接
as86 -0 -a -o boot.o boot.s
,ld86 -0 -s -o boot boot.o
其中-0
用于生成8086的16位目标程序,-a
用于指定生成与GNU as和ld部分兼容的代码,-s
选项用于告诉链接器要去除最后生成的可执行文件中的符号信息-o
指定生成的可执行文件名称。
as86和ld86使用方法和选项:
as的使用方法和选项:
as [-03agjuw] [-b[bin]] [-lm[list]] [-n name] [-o objfile] [-s sym] srcfile
默认设置:除了下列默认值,其他选项默认关闭或无
-3 使用80386的32位输出
list 在标准输出上显示
name 源文件的基本名词(即不包括.后的扩展名)
各选项 | 含义 |
---|---|
-0 | 使用16比特的代码段 |
-3 | 使用32比特的代码 |
-a | 开启与GNU as、ld的部分兼容性选项 |
| 产生二进制文件,后面可跟文件名 |
-g | 在目标文件中仅存入全局符号 |
-j | 使所有跳转语句均为长跳转 |
-l | 产生列表文件,后面可以跟随列表文件名 |
-m | 在列表中扩展宏定义 |
-n | 后面跟随模块名词,取代源文件名称放入目标文件中 |
-o | 产生目标文件,后跟目标文件名 |
-s | 产生符号文件,后跟符号文件名 |
-u | 将未定义符号作为输入的未指定段的符号 |
-w | 不显示警告信息 |
ld连接器的使用语法和选项:
对于生成Minix a.out格式的版本
ld [-03Mims[-]] [-T textaddr] [-llib_extension] [-o outfile] infile...
对于生成GNU-Minix的a.out格式的版本:
ld [-03Mimrs[-]] [-T textaddr] [-llib_extension] [-o outfile] infile...
默认设置:
-03 32位输出
outfile a.out格式输出
选项 | 解释 |
---|---|
-0 | 产生具有16位比特魔数的头结构,并且对-lx选项使用i86子目录 |
-3 | 产生具有32比特魔数的头结构,并且对-lx选项使用i386子目录 |
-M | 在标准输出设备上显示已链接的符号 |
-T | 后面跟随正文基地址 |
-i | 分离的指令与数据段输出 |
-lx | 将库/local/lib/subdir/libx.a加入链接的文件列表中 |
-m | 在标准输出设备上显示已链接的模块 |
-o | 指定输出文件名,后跟输出文件名 |
-r | 产生蛇和于进一步重定位的输出 |
-s | 在目标文件中删除所有符号 |
此文章内容是笔者看《linux内核源码剖析》上进行的摘录笔记