汇编上机资源

IDE

  1. 使用Emu8086仿真(支持DOS16位程序)

    • emu8086不能用:
      1. 32位寄存器
      2. INVOKE
      3. USES
      4. .IF .ENDIF .ELSEIF
      5. .REPEAT .UNTIL
  2. 或者MASMPlus+DOSBOX(支持DOS16位或32位程序)

Docs

Note

  • PROC里记得RET,否则调用过程后不返回,将顺序执行

  • MACRO里的LABEL使用前用LOCAL限制在局部,否则多次调用宏会报重复

  • NUMS是WORD(字)数组,MOV NUMS[BX],AX 后BX应该加2才能下一次使用,如果加1,下一次是存在下一字节,而不是下一字,可能会覆盖之前的数据

  • int 21h是只能在DOS下使用,但不是只能16位模式,.386开关开启后仍可以使用

  • masmplus相关

    • 在dos上想使用32位寄存器的话
      那就要 >= .386

    • .386 ;指明指令集
      .model flat,stdcall 程序工作模式,
      flat为Windows程序使用的模式(代码和数据使用同一个4GB段),
      stdcall为API调用时右边的参数先入栈

      option casemap:none ;指明大小写敏感

    • 过程结束不能只写ENDP,要完整PROCNAME ENDP

    • 调用没有参数的PROC时可直接CALL

      有参数的应该用INVOKE

      INVOKE FGETN,FILEHANDLE,DNUMS[BX]
      

      INVOKE格式

      invoke procedure, parameter1, parameter2, parameter3 
      

      等价于手动PUSH参数,然后用CALL

      push parameter3
      push parameter2
      push parameter1
      call procedure 
      
    • 在masmplus中编译

      CALC:
         BIGMUL D_N_FAC,D_TMP,D_I
         MOV8 D_TMP,D_N_FAC  
         CALL PRINTNHEX 
         PRINTNEWLINE
         INC D_I[0]  ;I++
         LOOP CALC 
      

      提示

      error A2075: jump destination too far : by 22 byte(s)

      stackoverflow上查得原因是

      loop has limited range. It can only jump up to 127 bytes ahead or 128 back in the instruction stream measured from the start of the following instruction.

      前面几条宏展开后指令非常长

      把LOOP改用

      DEC CX
      CMP CX,0
      JNE CALC
      

      就行了

  • 使用64位寄存器

文章目录
  1. IDE
  2. Docs
  3. Note
|