IDE
使用Emu8086仿真(支持DOS16位程序)
- emu8086不能用:
- 32位寄存器
- INVOKE
- USES
- .IF .ENDIF .ELSEIF
- .REPEAT .UNTIL
- emu8086不能用:
详解从零开始配置汇编开发环境(DosBox,MasmPlus)
DOSBOX使用:
窗口太小问题
https://blog.csdn.net/m0_37822685/article/details/80241598
挂载指定目录
https://jingyan.baidu.com/article/ce09321b7649012bff858f32.html
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位寄存器