as86的资料实在是少之又少。翻译了man文档....不过翻译的很烂,就当练英文水平吧:) Linus为什么要用它来写boot程序呢,nnd..翻译真是一项辛苦的工作啊...特别是对翻译的东西还不了解的时候....
as86(1) as86(1) 名称 概要格式 as86_encap prog.s prog.v [prefix_] [as86 options] 描述 命令行中的src参数可为‘-‘,代表对标准输入进行汇编。 as86_encap是一个脚本,使用了as86汇编程序,并且把生成的二进制文件转为一个C文件prog.v,用于被连接或者包含到程序里,例如引导块安装程序。prefix_参数定义一个加到源文件中所有定义的变量的前缀,缺省前缀是源文件名。... 选项 -1 以16位代码段运行,当使用了高于80186指令集的指令时警告。 -2 以16位代码段运行,当使用了高于80286指令集的指令时警告。 -3 以32位代码段运行,不对任何指令发出警告信息(就算使用了486或586的指令) -a 使汇编程序部分兼容于Minix asld.交换了[]与()的用法,并且改变了一些16位跳转与调用的语法("jmp @(bx)" 就成了一个合法的指令) -g 仅仅把global符号写入目标或者符号文件中 -j 把所有短跳转指令(译注:8位跳转称为短跳转)换成相似的16位或者32位跳转。并且把16位条件转移指令换为一个条件短转移命令与一个无条件长跳转组合 -O 汇编程序会做几遍额外的工作,以尝试支持向前引用。最多30遍。不推荐使用 -l 产生清单文件(list file),文件名写在选项后 -m 把宏展开后写在清单文件里 -n 把模块名写在选项之后(目标模块,而非源文件) -o 生成目标文件,文件名写在选项之后 -b 生成纯二进制文件,文件名写在后面。这是一个没有头部的纯二进制文件(译注:类似Dos下的com和sys)如果没有-s选项程序将会在内存地址0处开始执行 -s 生成一个ASCII码符号文件,文件名写在选项后。很简单就能将其转换,用于与-b选项生成的二进制文件相关联和封装。如果二进制文件不从地址0处开始执行。那么符号文件表中前两项分别代表起始地址与结束地址 -u 假定未定义符号在未指定的段中被导入了 -w- 允许汇编程序输出警告信息 -t n 把所有text段的数据放到段n+3中. AS86 资料 * 本行起始地址 ;或! 注释起始符,另外,在一行起始处的“unexpected”字符被认为是注释(但是仍然会被显示在终端上) $ 16进制数的前缀, C风格的前缀, 比如0x1234, 也可以使用. % 2进制数的前缀. # 立即数的前缀. [ ] 间接寻址运算符. 与MASM不同,汇编程序没有标识符的类型信息,每个标识符仅仅代表是一个段地址和偏移地址。[]与立即数操作与传统汇编程序一致 例: mov ax,bx jmp bx 寄存器寻址, jmp指令把bx寄存器中的值拷到程序计数器中 mov ax,[bx] jmp [bx] 简单的寄存器间接寻址, jmp指令把bx寄存器值指向的内存单元的值拷到程序计数器中 mov ax,#1234 立即数, 把1234赋值给ax寄存器 mov ax,1234 mov ax,_hello mov ax,[_hello] 直接寻址,内存地址1234处的存储字赋给ax寄存器。注意第三个指令并不十分严格,只是为了与asld保持兼容所以保留(译注:若想将_hello标识符表示的值作为立即数使用,需要加上#前缀 #_hello) mov ax,_table[bx] mov ax,_table[bx+si] mov eax,_table[ebx*4] mov ax,[bx+_table] mov ax,[bx+si+_table] mov eax,[ebx*4+_table] 变址寻址。两种形式都可以,但是我认为第一种要更正确些,但是我往往用第二种形式:) 条件判断 IF, ELSE, ELSEIF, ENDIF 数字比较 IFC, ELSEIFC 字符串比较 (str1,str2) FAIL .FAIL 生成用户错误 段相关 .TEXT .ROM .DATA .BSS LOC 数字表示段 0=TEXT, 3=DATA,ROM,BSS, 14=MAX. 连接器设定的段顺序现在是0,4,5,6,7,8,9,A,B,C,D,E,1,2,3.段 0 以及所有3以上的段都假设为text段。注意64K限制对3-14的段不适用。 标识符类型定义 EXPORT PUBLIC .DEFINE ENTRY 强制连接器在a.out文件里包含这个特殊符号 .GLOBL .GLOBAL EXTRN EXTERN IMPORT .EXTERN NB: bin格式的文件不支持外部变量(译注:关于这些格式,推荐参考一下NASM的手册。纯C论坛上有中文的NASM手册) .ENTER 标识出旧式bin格式(obs)的程序入口 数据定义 DB .DATA1 .BYTE FCB DW .DATA2 .SHORT FDB .WORD DD .DATA4 .LONG .ASCII FCC .ASCIZ Ascii 写到输出的Ascii码字符串,末尾添加nul 空间定义 .BLKB RMB .SPACE .BLKW .ZEROW COMM .COMM LCOMM .LCOMM 其他实用伪指令 .ALIGN .EVEN EQU 定义标识符(译注:可参考NASM或者MASM的EQU) SET 定义可重定义的标识符 ORG .ORG BLOCK 定义汇编位置并且把原来的汇编位置入栈 ENDB 回到刚才栈里记录的汇编位置 GET INCLUDE USE16 [cpu] USE32 [cpu] END 标识出本文件停止汇编的地方 .WARN 警告信息开关 .LIST 清单 on/off (1,-1) .MACLIST 宏的使用形式如下 MACRO sax 未实现/未使用的 IDENT Define object identity string. SETDP Set DP value on 6809 MAP Set binary symbol table map number. 寄存器 操作数类型说明 near和far关键字并没有提供段间寻址编程的能力,所有”far”操作都是 普通指令. 长分支 段间操作 段修饰符指令 字节操作指令 标准指令 浮点 |
|