初学汇编常见问题


刚开始学习Masm汇编,有些东西好像跟教材不怎么一样,有可能是Masm版本问题,我选择的是Masm6.11,用vim编辑代码(有语法加亮),网上下载好像要分,VMware16虚拟机链接如下:

链接:https://pan.baidu.com/s/1pLR0YKzh7HGCpM0LZRw2Xw
提取码:yp6e

1、代码中assume ss:stacksg,并且定义了stacksg,为什么还提示:Link:warning L4021:no stack segment没有堆栈段呢,这里跟教材稍微不同,堆栈段需要这样定义stacksg segment stack。

2、十六进制数如果第一个是字母,应该写成数字0开头,如B800H,必须写成0B800H,否则会提示错误error A2006:undefined symbol xxx,编译器把数字xxx做符号变量处理了。

3、汇编代码不区分大小写,并通过分号(;)来表示代码注释。

4、常用教材都是通过segName segment与segName ends来定义段,但在Masm5之后,如果没有特殊的要求,可通过简单的方式定义段:.model、.data、.code、.stack、.startup、.exit等,如:

.model tiny
.data
.stack
.code
    .startup
    .exit 0
end

.model tiny指的是建立com文件,通常用small,编译成exe可执行文件。

.stack xxx,如果不设置,则stack默认为1024Byte,即1K。如.stack 100,即栈空间为100Byte。

.exit后跟返回码,如.exit xxx,与mov ax,4cxxh相同。.exit后跟end,且与.startup成对出现。

5、group(组)指的是一组segment(段)的集合,语法是:name GROUP segment [[, segment]]...,在.MODEL语法下,默认将stack和data段定义在DGROUP下,方便进行访问,只要在相应的模式下,Group的总大小不超过64K或4G,可在任何时候向组添加段成员,且添加的段成员顺序并不影响最终在内存中的排列顺序。

6、ret除了可以返回以外,还可以控制SP的出栈数量,ret n的语法含义是:

1 pop ip  
2 add sp,n

即返回调用出IP后,在弹出需丢弃的栈元素,通常用于子程序参数的栈传递。

7、Lea和Offset作用都是获取偏移地址,前者是Cpu指令,后者是伪指令(在编译的时候计算,对CPU来说相当于立即数)。Offset只能对变量或标号进行计算,当不能对一般操作数进行计算,如:Lea ax,[bx+si]。但伪指令在编译时计算,且后者是3字节内存寻址指令,所以用Offset程序运行速度较快。