【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等
本次笔记内容:
15.程序格式与伪操作-2
16.上级过程-1(前15分钟)
注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。
本节课对应幻灯片:汇编语言程序设计-程序格式,第15页起。
文章目录
- P15 简化段定义
- P16 编译器的预定义
- P18 段组定义伪操作
- P21 程序开始和结束伪操作
- P22 数据定义及存储器分配伪操作
- P23 数据定义及存储器分配伪操作 - 例2
- P24 定义变量名字
- P25 再谈 LABEL 伪操作
- P26 表达式赋值伪操作
- P27 地址计数器
- P28 对准伪操作 ORG
- P29 EVEN 使下一地址从偶地址开始
- P30 基数控制伪操作 RADIX
- P31 汇编语言程序格式
- P32 表达式操作符 - 算术操作符
- P33 表达式操作符 - 算逻辑和移位操作符
- P34 表达式操作符 - 关系操作符
- P35 表达式操作符 - 数值回送操作符
- P36 例子
- P37 表达式操作符 - 属性操作符
P15 简化段定义
没有 SEGMENT
等,一个段的开始代表上衣段的结束。
P16 编译器的预定义
编译器预定义了一些段名,如@data
等。并且,常量表数据段在 link 后组成了段组,为DGROUP
。
在 .startup
下的代码中,做了什么?
- 前两行,代码段在 1A09 ,DS即将要被改成 1A0B ;1A0B在下,说明了
先放代码,再放数据
。 -
做简化段时,代码在上面,别看我们在之前声明了数据
这与完整段定义不同。 - 后面,第三行,将 SS(1A09) 赋值给 BX(1A0B),1A09 - 1A0B = -2 (FFFE);
-
之后 BX 逻辑左移4位
;成为 FFE0 。 - 之后,调整 SS 与 SP 的值。
P18 段组定义伪操作
在代码中,将 ds 与段组名联系起来,以后的操作可以更简洁些。
P21 程序开始和结束伪操作
TITLE 与 NAME 实际用处不大(在生成列表文件时打印表头)。
程序找 [label] ,从这里开始执行。
P22 数据定义及存储器分配伪操作
[变量] 助记符 操作数 [ , 操作数 , … ] [ ; 注释 ]
助记符:DB DW DD DF DQ DT
注意到变量名是可写可不写的。
所谓“助记符”,就是声明是一个字节、一个字还是双子的大小,这就是“位初始化”
。
如上,是一个小端模式的存储器分配。比如:
- -5 是
FFFB
; - 所以先放
FB
,后放FF
。
P23 数据定义及存储器分配伪操作 - 例2
一个字符放在一个字节里。
注意到:
- A的
ASC码
是41,B是42; - 使用DB存时,是
41H 42H
; - 但是使用DW存时,就是
42H 41H
了,如何理解?
因为DW声明的是一个完整的字,因此A放在字中的高位,B放在低位。
在PAR1
的例子中,我们建了一个内存表叫做ADDR_TABLE
。内存里不仅能放数,也能放数据的地址。
对于 VAR DB 100 DUP (?)
,表示重复进行:
- 如果是
VAR DB 100 DUP 1
,表示内存中有 100 个 1 ,每个是一个字节; -
?
表示未初始化。
DUP 可以嵌套,如 DB 2 DUP (0, 2 DUP(1,2), 3)
,从最里面的开始括号开始推。
P24 定义变量名字
如上图,定义了不同的变量名与类型。
但是有时搞错了类型容易出错。
如上图,有可能造成类型不匹配(使用了寄存器的类型与字节、字不匹配)。
但是可以进行 WORD PTR
等进行强制类型转换。
P25 再谈 LABEL 伪操作
LABEL 能标识一个变量名是什么类型的。
但是其并不分配内存空间。
BYTE_ARRAY 是一个字节类型的变量名字;声明之后,为 WORD_ARRAY 分配了一个 50 个字的空间;接下来,为 tos
规定了一个字类型。
LABEL 指向了即将分配内存的地址。对于100个字节分配完毕后,tos即指向0064。
P26 表达式赋值伪操作
与数据定义不同的是,其不分配内存;其公式记录在汇编工具的表格中。
P27 地址计数器
地址计数器,记着每条指令开始的IP
;当前正在汇编的指令的地址用 $
表示。
注意到上图中,红色与绿色的内容是不同的:
- 红色的,是 0078 (当前地址) + 4 = 007C ;
- 绿色的,是 007E (当前地址) + 4 = 0082 。
P28 对准伪操作 ORG
ORG 实际上就是设置 地址计数器的值
。
如上,就是空 10 个字节,再放 VAR1 。
对于下两种代码,是等价的:
BUFFER LABEL BYTE
ORG $+8
# 等价于
BUFFER DB 8 DUP (?)
P29 EVEN 使下一地址从偶地址开始
计算机是偶地址访问,因此,需要有这么一个命令,保证起始地址都是偶数。
EVEN
命令与 ALIGN 2
等价。
P30 基数控制伪操作 RADIX
使用 .RADIX 16
,规定了都是 16 进制;否则,需要以 0FFH
表示是 16 进制 的 0FF
;如果默认为 16 进制,则需要使用 178D
表示 178
是 10 进制的。
P31 汇编语言程序格式
此其实为下一节课(下一集视频的内容)。
P32 表达式操作符 - 算术操作符
对于绿色部分,即为求数组长度,并且赋给 CX 。
对于地址来讲,加减常数是有意义的,乘除意义不明确;寄存器 BX 来讲,进行 + 1 是无意义的。
P33 表达式操作符 - 算逻辑和移位操作符
对于 输入指令 IN 与 输出指令 OUT 那部分:
- 输入进来,再输出出去;
- 使用了
AND 0FEH
,说明如果是偶数,则输出其本身,否则输出时要进行处理。
P34 表达式操作符 - 关系操作符
对于 MOV FID, (OFFSET Y - OFFSET X) LE 128
,可以判断其时进跳转,还是短跳转。
P35 表达式操作符 - 数值回送操作符
P36 例子
TYPE ARRAY
,由于 ARRAY
的 TYPE
是 WORD
,因此将 2 赋给 SI
。
注意 length 与 size 的区别。SIZE对于DB来讲,是指“以DB为单元分配了多少空间”(?)。在高版本中,使用的是sizeof与lengthof。
P37 表达式操作符 - 属性操作符
此外,还有 LOW , HIGH 操作符等。操作符在汇编程序汇编是就已经算出结果了。
上一篇: 财务决策支持系统FDSS 博客分类: 重要生活 DSS
下一篇: 简单理解Binder机制的原理