linux内核学习---as86语法

系统 2189 0

as86(1)                                                            

名称

as86 - as86-8086..80386处理器的汇编程序

 

概要格式
      as86  [-0123agjuw]  [-lm[list]]  [-n name]  [-o obj] [-b[bin]] [-s sym]
      [-t textseg] src

 

      as86_encap prog.s prog.v [prefix_] [as86 options]

 

描述
     as86是8086..80386处理器下的汇编程序,它所采用的语法与Intel/MS采取的语法类似,而不同于广泛运用于UNIX下的汇编语法(译注,gas中的语法,AT&T汇编)

 

    命令行中的src参数可为'-',代表对标准输入进行汇编。

 

    as86_encap是一个脚本,使用了as86汇编程序,并且把生成的二进制文件转为一个C文件prog.v,用于被连接或者包含到程序里,例如引导块安装程序。prefix_参数定义一个加到源文件中所有定义的变量的前缀,缺省前缀是源文件名。...

 

选项
     -0     以16位代码段运行,当使用了高于8086指令集的指令时警告。

 

     -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
             设置当前段。可以在前面加上关键字.SECT

 

      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
             1字节的对象列表

 

      DW .DATA2 .SHORT FDB .WORD
             2字节的对象列表

 

      DD .DATA4 .LONG
             4字节的对象列表

 

      .ASCII FCC
           写到输出的Ascii码字符串.

 

      .ASCIZ Ascii 写到输出的Ascii码字符串,末尾添加nul

 

       空间定义

 

      .BLKB RMB .SPACE
             以字节为单位计算空间

 

      .BLKW .ZEROW
             以字为单位计算空间 (一字2字节)

 

      COMM .COMM LCOMM .LCOMM
             通用数据域定义

 

       其他实用伪指令

 

      .ALIGN .EVEN
             对齐

 

      EQU    定义标识符(译注:可参考NASM或者MASM的EQU)

 

      SET    定义可重定义的标识符

 

      ORG .ORG
             定义汇编位置(译注:即设置地址计数器的值,建议参考MASM的资料)

 

      BLOCK  定义汇编位置并且把原来的汇编位置入栈

 

      ENDB   回到刚才栈里记录的汇编位置

 

      GET INCLUDE
             插入新文件 (no quotes on name)

 

USE16 [cpu]
        定义默认操作数大小为16位,参数表示程序代码将会运行在什么样的CPU的(86,186, 286,386,486,586)指令集上.使用了指定指令集之上的指令会产生警告信息

 

USE32 [cpu]
       定义默认操作数大小为32位,参数表示程序代码将会运行在什么样的CPU的(86,186,     286,386,486,586)指令集上.使用了指定指令集之上的指令会产生警告信息

 

      END    标识出本文件停止汇编的地方

 

      .WARN  警告信息开关

 

      .LIST  清单 on/off (1,-1)

 

      .MACLIST
             宏清单 on/off (1,-1)

 

     宏的使用形式如下

 

          MACRO sax
             mov ax,#?1
          MEND
          sax(1)

 

      未实现/未使用的

 

      IDENT  Define object identity string.

 

      SETDP  Set DP value on 6809

 

      MAP    Set binary symbol table map number.

 

      寄存器
             BP BX DI SI
             EAX EBP EBX ECX EDI EDX ESI ESP
             AX CX DX SP
             AH AL BH BL CH CL DH DL
             CS DS ES FS GS SS
             CR0 CR2 CR3 DR0 DR1 DR2 DR3 DR6 DR7
             TR3 TR4 TR5 TR6 TR7 ST

 

      操作数类型说明
             BYTE DWORD FWORD FAR PTR PWORD QWORD TBYTE WORD NEAR

 

             near和far关键字并没有提供段间寻址编程的能力,所有”far”操作都是
             都是通过显式地使用以下指令得到的:指令: jmpi, jmpf, callf, retf, 
             等等. Near关键字可以被用来强制使用80386的16位条件跳转指令. 
             'Dword'和'word' 能控制远跳转和远调用的操作数的大小

 

      普通指令 .
             这些指令和其他8086汇编程序所提供的指令大体上差不多,(译注:后面的
             看不明白了.我的英语功底啊~555) the main exceptions being a few '
             Bcc' (BCC, BNE,  BGE,  etc)  instructions which are shorthands f
             or a short branch plus a long jump and 'BR' which is the longest
             unconditional jump (16 or 32 bit).

 

       长分支
             BCC  BCS  BEQ  BGE BGT BHI BHIS BLE BLO BLOS BLT BMI BNE BPC BPL
             BPS BVC BVS BR

 

       段间操作
             CALLI CALLF JMPI JMPF

 

      段修饰符指令
             ESEG FSEG GSEG SSEG

 

      字节操作指令
             ADCB ADDB ANDB CMPB DECB DIVB IDIVB IMULB  INB  INCB  MOVB  MULB
             NEGB  NOTB ORB OUTB RCLB RCRB ROLB RORB SALB SARB SHLB SHRB SBBB
             SUBB TESTB XCHGB XORB

 

      标准指令
             AAA AAD AAM AAS ADC ADD AND ARPL BOUND BSF BSR BSWAP BT BTC  BTR
             BTS CALL CBW CDQ CLC CLD CLI CLTS CMC CMP CMPS CMPSB CMPSD CMPSW
             CMPW CMPXCHG CSEG CWD CWDE DAA DAS DEC DIV DSEG ENTER  HLT  IDIV
             IMUL  IN  INC  INS  INSB INSD INSW INT INTO INVD INVLPG INW IRET
             IRETD J JA JAE JB JBE JC JCXE JCXZ JE JECXE JECXZ JG JGE JL  JLE
             JMP  JNA JNAE JNB JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ
             JO JP JPE JPO JS JZ LAHF LAR LDS LEA LEAVE LES LFS LGDT LGS LIDT
             LLDT  LMSW  LOCK  LODB  LODS  LODSB  LODSD LODSW LODW LOOP LOOPE
             LOOPNE LOOPNZ LOOPZ LSL LSS LTR MOV MOVS MOVSB MOVSD MOVSW MOVSX
             MOVW  MOVZX  MUL  NEG NOP NOT OR OUT OUTS OUTSB OUTSD OUTSW OUTW
             POP POPA POPAD POPF POPFD PUSH PUSHA PUSHAD PUSHF PUSHFD RCL RCR
             REP REPE REPNE REPNZ REPZ RET RETF RETI ROL ROR SAHF SAL SAR SBB
             SCAB SCAS SCASB SCASD SCASW SCAW SEG SETA SETAE SETB SETBE  SETC
             SETE SETG SETGE SETL SETLE SETNA SETNAE SETNB SETNBE SETNC SETNE
             SETNG SETNGE SETNL SETNLE SETNO  SETNP  SETNS  SETNZ  SETO  SETP
             SETPE  SETPO SETS SETZ SGDT SHL SHLD SHR SHRD SIDT SLDT SMSW STC
             STD STI STOB STOS STOSB STOSD STOSW STOW STR SUB TEST VERR  VERW
             WAIT WBINVD XADD XCHG XLAT XLATB XOR

 

       浮点
             F2XM1  FABS  FADD  FADDP FBLD FBSTP FCHS FCLEX FCOM FCOMP FCOMPP
             FCOS FDECSTP FDISI FDIV FDIVP  FDIVR  FDIVRP  FENI  FFREE  FIADD
             FICOM  FICOMP  FIDIV  FIDIVR FILD FIMUL FINCSTP FINIT FIST FISTP
             FISUB FISUBR FLD FLD1 FLDL2E FLDL2T FLDCW FLDENV  FLDLG2  FLDLN2
             FLDPI  FLDZ  FMUL  FMULP  FNCLEX FNDISI FNENI FNINIT FNOP FNSAVE
             FNSTCW FNSTENV FNSTSW FPATAN FPREM FPREM1 FPTAN  FRNDINT  FRSTOR
             FSAVE  FSCALE  FSETPM  FSIN  FSINCOS FSQRT FST FSTCW FSTENV FSTP
             FSTSW FSUB FSUBP FSUBR FSUBRP FTST FUCOM  FUCOMP  FUCOMPP  FWAIT
             FXAM FXCH FXTRACT FYL2X FYL2XP1

linux内核学习---as86语法


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论