本次笔记内容:
14.程序格式与伪操作-1
注:本节课更换为一名女老师。我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。
注2:老的B站视频下架了,我找到了新资源,并且与老视频资源相同:清华大学 l 汇编语言与计算机系统(全·32课)。
本节课对应幻灯片:汇编语言程序设计-程序格式,第1页起。
源程序实际上是 .asm 的 ASC 机器码源程序,称为汇编源程序。
.asm 文件产生目标文件 .obj
与列表文件 .lst
。列表文件也是一个文本,存储详细信息。
.asm 文件还可产生宏指令
,后面专门有一种会讲“宏汇编”。其是一些基本指令的结合。
之所以叫“伪”,是与之前讲的“硬”指令相对应的。
伪操作是汇编程序对源程序进行汇编时
处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。
选择处理器。
比如很多汇编程序的开头,就是.386
,功能是选择处理器。
区分程序中的代码段、附加段、数据段等等。
code
, data
不是关键字。注意有一行命令:
assume cs:code, ds:data, es:extra
告诉计算机,code
是代码段,data
是数据段,extra
是附加段。
其中,有main proc far
调用了一个子程序,并且为远调用(调用了不在这个模块中的程序),因此ret
为远返回。
dup
为重复的意思,在第一个堆栈段中,开辟了200个字节。tos
是top of stack
,并非关键字,tos label word
是伪指令,将一个字word
赋给tos
,并且label
的意义为指向下一个要被赋予地址的地方,并且并不分配内存空间
。在后面的赋值中,将这个指针tos
指在堆栈栈顶外mov sp, offset tos
(紧挨着堆栈),这样一旦压栈,就进入堆栈。
tos
位置如图。
即便如此定义堆栈段,系统还是警告没有堆栈段
。
老师举了个例子(做了个演示),但是我的 ppt 上没有。
如图,会提示没有堆栈段
,为了解决这个问题,使用stack
关键字:stack segment stack
(后面的是关键字),有了这个关键字,也不需要手动为ss
和sp
赋初值了。
这页 ppt 显示了数组与其在堆栈段内存形式。
堆栈放入数据不一定通过压栈来进行,还可以通过寄存器等。
段名 SEGMENT [定位类型][组合类型][使用类型]['类别'] ... 段名 ENDS
如 ppt ,在 SEGMENT 后其实有很多选项可选。
(1)定位类型
指段起始地址
的条件;
(2)组合类型
,如 STACK 等, STACK 把相同名称的堆栈段组合在一起,没有碎片;
(3)使用类型
用“多少位”的形式;
(4)类别
指,连接时具有相同类别的内容连接在一起。
接着,老师举了一个例子(做了个演示), ppt 上没有。
组合程序由两段子程序组成:proadd1.asm
,proadd2.asm
。
在开头,声明还未建立起的调用子程序。在proadd2.asm
中,定义了public proadd
,供外部调用。
两个程序的数据段同名,则子程序2对1进行覆盖。