AS.9
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:16k
源码类别:

操作系统开发

开发平台:

C/C++

  1. Command:   as - assembler
  2. AS----ASSEMBLER [IBM]
  3.      This  document  describes  the  language  accepted  by  the   80386
  4. assembler  that  is  part of the Amsterdam Compiler Kit.  Note that only
  5. the syntax is described, only  a  few  386  instructions  are  shown  as
  6. examples.
  7. Tokens, Numbers, Character Constants, and Strings
  8.      The syntax of numbers is the same as in C.  The constants 32,  040,
  9. and  0x20  all  represent  the  same number, but are written in decimal,
  10. octal, and hex, respectively.  The rules  for  character  constants  and
  11. strings  are  also  the  same  as in C.  For example, 'a' is a character
  12. constant.  A typical string is "string".  Expressions may be formed with
  13. C  operators, but must use [ and ] for parentheses.  (Normal parentheses
  14. are claimed by the operand syntax.)
  15. Symbols
  16.      Symbols contain letters  and  digits,  as  well  as  three  special
  17. characters:  dot, tilde, and underscore.  The first character may not be
  18. a digit or tilde.
  19.      The names of the 80386 registers are reserved.  These are:
  20.    al, bl, cl, dl
  21.    ah, bh, ch, dh
  22.    ax, bx, cx, dx, eax, ebx, ecx, edx
  23.    si, di, bp, sp, esi, edi, ebp, esp
  24.    cs, ds, ss, es, fs, gs
  25. The xx and exx variants of the eight general registers  are  treated  as
  26. synonyms  by the assembler.  Normally "ax" is the 16-bit low half of the
  27. 32-bit "eax" register.  The assembler determines  if  a  16  or  32  bit
  28. operation  is  meant  solely  by  looking  at  the  instruction  or  the
  29. instruction prefixes.  It is however best to use  the  proper  registers
  30. when writing assembly to not confuse those who read the code.
  31. The last group of 6 segment registers are used  for  selector  +  offset
  32. mode  addressing, in which the effective address is at a given offset in
  33. one of the 6 segments.
  34.      Names of instructions and pseudo-ops are not  reserved.  Alphabetic
  35. characters in opcodes and pseudo-ops must be in lower case.
  36. Separators
  37.                                                                         
  38.                                                                         
  39.      Commas, blanks, and tabs are separators  and  can  be  interspersed
  40. freely  between  tokens,  but  not within tokens.  Commas are only legal
  41. between operands.
  42. Comments
  43.      The comment character is '!'. The rest of the line is ignored.
  44. Opcodes
  45.      The opcodes are listed below.  Notes: (1) Different names  for  the
  46. same  instruction  are  separated  by  '/'.   (2)  Square  brackets ([])
  47. indicate that 0 or 1 of the enclosed characters can  be  included.   (3)
  48. Curly  brackets  ({})  work  similarly,  except that one of the enclosed
  49. characters must be included.  Thus square brackets indicate  an  option,
  50. whereas curly brackets indicate that a choice must be made.
  51. Data Transfer
  52.   mov[b]  dest, source  ! Move word/byte from source to dest
  53.   pop     dest          ! Pop stack
  54.   push    source        ! Push stack
  55.   xchg[b] op1, op2      ! Exchange word/byte
  56.   xlat                  ! Translate
  57.   o16                   ! Operate on a 16 bit object instead of 32 bit
  58. Input/Output
  59.   in[b]   source        ! Input from source I/O port
  60.   in[b]                 ! Input from DX I/O port
  61.   out[b]  dest          ! Output to dest I/O port
  62.   out[b]                ! Output to DX I/O port
  63. Address Object
  64.   lds     reg,source    ! Load reg and DS from source
  65.   les     reg,source    ! Load reg and ES from source
  66.   lea     reg,source    ! Load effect address of source to reg and DS
  67.   {cdsefg}seg           ! Specify seg register for next instruction
  68.   a16                   ! Use 16 bit addressing mode instead of 32 bit
  69. Flag Transfer
  70.   lahf                  ! Load AH from flag register
  71.   popf                  ! Pop flags
  72.   pushf                 ! Push flags
  73.   sahf                  ! Store AH in flag register
  74. Addition
  75.                                                                         
  76.                                                                         
  77.   aaa                   ! Adjust result of BCD addition
  78.   add[b]  dest,source   ! Add
  79.   adc[b]  dest,source   ! Add with carry
  80.   daa                   ! Decimal Adjust after addition
  81.   inc[b]  dest          ! Increment by 1
  82. Subtraction
  83.   aas                   ! Adjust result of BCD subtraction
  84.   sub[b]  dest,source   ! Subtract
  85.   sbb[b]  dest,source   ! Subtract with borrow from dest
  86.   das                   ! Decimal adjust after subtraction
  87.   dec[b]  dest          ! Decrement by one
  88.   neg[b]  dest          ! Negate
  89.   cmp[b]  dest,source   ! Compare
  90. Multiplication
  91.   aam                   ! Adjust result of BCD multiply
  92.   imul[b] source        ! Signed multiply
  93.   mul[b]  source        ! Unsigned multiply
  94. Division
  95.   aad                   ! Adjust AX for BCD division
  96.   o16 cbw               ! Sign extend AL into AH
  97.   o16 cwd               ! Sign extend AX into DX
  98.   cwde                  ! Sign extend AX into EAX
  99.   cdq                   ! Sign extend EAX into EDX
  100.   idiv[b] source        ! Signed divide
  101.   div[b]  source        ! Unsigned divide
  102. Logical
  103.   and[b]  dest,source   ! Logical and
  104.   not[b]  dest          ! Logical not
  105.   or[b]   dest,source   ! Logical inclusive or
  106.   test[b] dest,source   ! Logical test
  107.   xor[b]  dest,source   ! Logical exclusive or
  108. Shift
  109.   sal[b]/shl[b] dest,CL ! Shift logical left
  110.   sar[b]  dest,CL       ! Shift arithmetic right
  111.   shr[b]  dest,CL       ! Shift logical right
  112. Rotate
  113.   rcl[b]  dest,CL       ! Rotate left, with carry
  114.   rcr[b]  dest,CL       ! Rotate right, with carry
  115.                                                                         
  116.                                                                         
  117.   rol[b]  dest,CL       ! Rotate left
  118.   ror[b]  dest,CL       ! Rotate right
  119. String Manipulation
  120.   cmps[b]               ! Compare string element ds:esi with es:edi
  121.   lods[b]               ! Load from ds:esi into AL, AX, or EAX
  122.   movs[b]               ! Move from ds:esi to es:edi
  123.   rep                   ! Repeat next instruction until ECX=0
  124.   repe/repz             ! Repeat next instruction until ECX=0 and ZF=1
  125.   repne/repnz           ! Repeat next instruction until ECX!=0 and ZF=0
  126.   scas[b]               ! Compare ds:esi with AL/AX/EAX
  127.   stos[b]               ! Store AL/AX/EAX in es:edi
  128. Control Transfer
  129.      As accepts a number of special jump opcodes that  can  assemble  to
  130. instructions  with  either  a byte displacement, which can only reach to
  131. targets within -126 to +129 bytes of the branch, or an instruction  with
  132. a  32-bit  displacement.   The assembler automatically chooses a byte or
  133. word displacement instruction.
  134.      The English translation of the  opcodes  should  be  obvious,  with
  135. 'l(ess)'  and  'g(reater)'  for  signed  comparisions, and 'b(elow)' and
  136. 'a(bove)*(CQ for unsigned comparisions.  There are lots of  synonyms  to
  137. allow you to write "jump if not that" instead of "jump if this".
  138.      The  'call',  'jmp',  and  'ret'   instructions   can   be   either
  139. intrasegment  or  intersegment.  The intersegment versions are indicated
  140. with the suffix 'f'.
  141. Unconditional
  142.   jmp[f]  dest          ! jump to dest (8 or 32-bit displacement)
  143.   call[f] dest          ! call procedure
  144.   ret[f]                ! return from procedure
  145. Conditional
  146.   ja/jnbe               ! if above/not below or equal (unsigned)
  147.   jae/jnb/jnc           ! if above or equal/not below/not carry (uns.)
  148.   jb/jnae/jc            ! if not above nor equal/below/carry (unsigned)
  149.   jbe/jna               ! if below or equal/not above (unsigned)
  150.   jg/jnle               ! if greater/not less nor equal (signed)
  151.   jge/jnl               ! if greater or equal/not less (signed)
  152.   jl/jnqe               ! if less/not greater nor equal (signed)
  153.   jle/jgl               ! if less or equal/not greater (signed)
  154.   je/jz                 ! if equal/zero
  155.   jne/jnz               ! if not equal/not zero
  156.   jno                   ! if overflow not set
  157.                                                                         
  158.                                                                         
  159.   jo                    ! if overflow set
  160.   jnp/jpo               ! if parity not set/parity odd
  161.   jp/jpe                ! if parity set/parity even
  162.   jns                   ! if sign not set
  163.   js                    ! if sign set
  164. Iteration Control
  165.   jcxz    dest          ! jump if ECX = 0
  166.   loop    dest          ! Decrement ECX and jump if CX != 0
  167.   loope/loopz dest      ! Decrement ECX and jump if ECX = 0 and ZF = 1
  168.   loopne/loopnz dest    ! Decrement ECX and jump if ECX != 0 and ZF = 0
  169. Interrupt
  170.   int     n             ! Software interrupt n
  171.   into                  ! Interrupt if overflow set
  172.   iretd                 ! Return from interrupt
  173. Flag Operations
  174.   clc                   ! Clear carry flag
  175.   cld                   ! Clear direction flag
  176.   cli                   ! Clear interrupt enable flag
  177.   cmc                   ! Complement carry flag
  178.   stc                   ! Set carry flag
  179.   std                   ! Set direction flag
  180.   sti                   ! Set interrupt enable flag
  181. Location Counter
  182.      The special symbol '.' is the location counter and its value is the
  183. address of the first byte of the instruction in which the symbol appears
  184. and can be used in expressions.
  185. Segments
  186.      There are four different assembly segments:  text,  rom,  data  and
  187. bss.   Segments are declared and selected by the .sect pseudo-op.  It is
  188. customary to declare all segments at the top of an  assembly  file  like
  189. this:
  190.    .sect .text; .sect .rom; .sect .data; .sect .bss
  191. The assembler accepts up to 16 different  segments,  but  MINIX  expects
  192. only  four  to be used.  Anything can in principle be assembled into any
  193. segment, but the MINIX bss segment may only contain uninitialized  data.
  194. Note that the '.' symbol refers to the location in the current segment.
  195.                                                                         
  196.                                                                         
  197. Labels
  198.      There are two types: name and numeric.  Name labels  consist  of  a
  199. name followed by a colon (:).
  200.      The numeric labels are single digits.  The nearest 0: label may  be
  201. referenced as 0f in the forward direction, or 0b backwards.
  202. Statement Syntax
  203.      Each line consists of a single statement.  Blank or  comment  lines
  204. are allowed.
  205. Instruction Statements
  206.      The most general form of an instruction is
  207.    label: opcode operand1, operand2    ! comment
  208. Expression Semantics
  209.      The following operators can be used:  + - * / & |  ^  ~  <<  (shift
  210. left)  >>  (shift  right) - (unary minus).  32-bit integer arithmetic is
  211. used. Division produces a truncated quotient.
  212. Addressing Modes
  213.      Below is a list of the addressing modes  supported.   Each  one  is
  214. followed by an example.
  215.    constant                         mov eax, 123456
  216.    direct access                    mov eax, (counter)
  217.    register                         mov eax, esi
  218.    indirect                         mov eax, (esi)
  219.    base + disp.                     mov eax, 6(ebp)
  220.    scaled index                     mov eax, (4*esi)
  221.    base + index                     mov eax, (ebp)(2*esi)
  222.    base + index + disp.             mov eax, 10(edi)(1*esi)
  223. Any of the constants or  symbols  may  be  replacement  by  expressions.
  224. Direct   access,   constants  and  displacements  may  be  any  type  of
  225. expression.  A scaled index with scale 1  may  be  written  without  the
  226. '1*'.
  227. Call and Jmp
  228.      The 'call' and 'jmp' instructions can be interpreted as a load into
  229. the instruction pointer.
  230.                                                                         
  231.                                                                         
  232.    call _routine                    ! Direct, intrasegment
  233.    call (subloc)                    ! Indirect, intrasegment
  234.    call 6(ebp)                      ! Indirect, intrasegment
  235.    call ebx                         ! Direct, intrasegment
  236.    call (ebx)                       ! Indirect, intrasegment
  237.    callf (subloc)                   ! Indirect, intersegment
  238.    callf seg:offs                   ! Direct, intersegment
  239. Symbol Assigment
  240.      Symbols can acquire values in one of two ways.  Using a symbol as a
  241. label  sets  it  to  '.'  for the current segment with type relocatable.
  242. Alternative, a symbol may be given a name via an assignment of the form
  243.    symbol = expression
  244. in which the symbol is assigned the value and type of its arguments.
  245. Storage Allocation
  246.      Space can be reserved for bytes, words, and longs using pseudo-ops.
  247. They take one or more operands, and for each generate a value whose size
  248. is a byte, word (2 bytes) or long (4 bytes).  For example:
  249.   .data1 2, 6           ! allocate 2 bytes initialized to 2 and 6
  250.   .data2 3, 0x10        ! allocate 2 words initialized to 3 and 16
  251.   .data4 010            ! allocate a longword initialized to 8
  252.   .space 40             ! allocates 40 bytes of zeros
  253. allocates 50 (decimal) bytes of  storage,  initializing  the  first  two
  254. bytes to 2 and 6, the next two words to 3 and 16, then one longword with
  255. value 8 (010 octal), last 40 bytes of zeros.
  256. String Allocation
  257.      The pseudo-ops .ascii and  .asciz  take  one  string  argument  and
  258. generate  the  ASCII  character codes for the letters in the string. The
  259. latter automatically terminates the string with a null  (0)  byte.   For
  260. example,
  261.    .ascii "hello"
  262.    .asciz "worldn"
  263. Alignment
  264.                                                                         
  265.                                                                         
  266.      Sometimes it is necessary to force the next  item  to  begin  at  a
  267. word, longword or even a 16 byte address boundary.  The .align pseudo-op
  268. zero or more null byte if the current location  is  a  multiple  of  the
  269. argument of .align.
  270. Segment Control
  271.      Every item assembled goes in one of the four segments:  text,  rom,
  272. data,  or  bss.  By using the .sect pseudo-op with argument .text, .rom,
  273. .data or .bss, the programmer can force  the  next  items  to  go  in  a
  274. particular segment.
  275. External Names
  276.      A symbol can be given global scope by including  it  in  a  .define
  277. pseudo-op.   Multiple  names may be listed, separate by commas.  It must
  278. be used to export symbols defined in the  current  program.   Names  not
  279. defined  in  the  current  program  are  treated as "undefined external"
  280. automatically, although it is customary to make this explicit  with  the
  281. .extern pseudo-op.
  282. Common
  283.      The .comm pseudo-op declares storage that can  be  common  to  more
  284. than  one  module.   There  are  two  arguments:  a name and an absolute
  285. expression giving the size in bytes of the area named by the symbol. The
  286. type  of  the  symbol becomes external.  The statement can appear in any
  287. segment.  If you think this has something to do with  FORTRAN,  you  are
  288. right.
  289. Examples
  290.      In the kernel directory, there are several assembly code files that
  291. are  worth  inspecting as examples.  However, note that these files, are
  292. designed to first be run through the C preprocessor.   (The  very  first
  293. character is a # to signal this.)  Thus they contain numerous constructs
  294. that are not pure assembler.  For true assembler examples, compile any C
  295. program  provided  with MINIX using the -S flag.  This will result in an
  296. assembly language file with a suffix with the same name as the C  source
  297. file, but ending with the .s suffix.
  298.