语句可以是只包含空格、制表符和换行符的空行,也可以是赋值语句(或定义语句)、伪操作符语句和机器指令语句。赋值语句用于给一个符号或者标识符赋值。它由标识符后跟一个等于号,在跟一个表达是组成。伪操作符语句是汇编器使用的指示符,他通常并不会产生任何代码。它由伪操作码和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 在目标文件中删除所有符号