欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

程序员文章站 2024-03-23 23:38:22
...

本次笔记内容:
15.程序格式与伪操作-2
16.上级过程-1(前15分钟)

注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。

本节课对应幻灯片:汇编语言程序设计-程序格式,第15页起。

P15 简化段定义

没有 SEGMENT 等,一个段的开始代表上衣段的结束。

P16 编译器的预定义

编译器预定义了一些段名,如@data等。并且,常量表数据段在 link 后组成了段组,为DGROUP

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

.startup 下的代码中,做了什么?

  • 前两行,代码段在 1A09 ,DS即将要被改成 1A0B ;1A0B在下,说明了先放代码,再放数据
  • 做简化段时,代码在上面,别看我们在之前声明了数据这与完整段定义不同。
  • 后面,第三行,将 SS(1A09) 赋值给 BX(1A0B),1A09 - 1A0B = -2 (FFFE);
  • 之后 BX 逻辑左移4位;成为 FFE0 。
  • 之后,调整 SS 与 SP 的值。

P18 段组定义伪操作

在代码中,将 ds 与段组名联系起来,以后的操作可以更简洁些。

P21 程序开始和结束伪操作

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

TITLE 与 NAME 实际用处不大(在生成列表文件时打印表头)。

程序找 [label] ,从这里开始执行。

P22 数据定义及存储器分配伪操作

[变量] 助记符 操作数 [ , 操作数 , … ] [ ; 注释 ]
助记符:DB DW DD DF DQ DT

注意到变量名是可写可不写的。

所谓“助记符”,就是声明是一个字节、一个字还是双子的大小,这就是“位初始化”

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

如上,是一个小端模式的存储器分配。比如:

  • -5 是 FFFB
  • 所以先放 FB ,后放 FF

P23 数据定义及存储器分配伪操作 - 例2

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

一个字符放在一个字节里。

注意到:

  • 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 定义变量名字

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

如上图,定义了不同的变量名与类型。

但是有时搞错了类型容易出错。

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

如上图,有可能造成类型不匹配(使用了寄存器的类型与字节、字不匹配)。

但是可以进行 WORD PTR 等进行强制类型转换。

P25 再谈 LABEL 伪操作

LABEL 能标识一个变量名是什么类型的。

但是其并不分配内存空间。

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

BYTE_ARRAY 是一个字节类型的变量名字;声明之后,为 WORD_ARRAY 分配了一个 50 个字的空间;接下来,为 tos 规定了一个字类型。

LABEL 指向了即将分配内存的地址。对于100个字节分配完毕后,tos即指向0064。

P26 表达式赋值伪操作

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

与数据定义不同的是,其不分配内存;其公式记录在汇编工具的表格中。

P27 地址计数器

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

地址计数器,记着每条指令开始的IP;当前正在汇编的指令的地址用 $ 表示。

注意到上图中,红色与绿色的内容是不同的:

  • 红色的,是 0078 (当前地址) + 4 = 007C ;
  • 绿色的,是 007E (当前地址) + 4 = 0082 。

P28 对准伪操作 ORG

ORG 实际上就是设置 地址计数器的值

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

如上,就是空 10 个字节,再放 VAR1 。

对于下两种代码,是等价的:

BUFFER LABEL BYTE
	   ORG   $+8
# 等价于
BUFFER DB 8 DUP (?)

P29 EVEN 使下一地址从偶地址开始

计算机是偶地址访问,因此,需要有这么一个命令,保证起始地址都是偶数。

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

EVEN 命令与 ALIGN 2 等价。

P30 基数控制伪操作 RADIX

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

使用 .RADIX 16 ,规定了都是 16 进制;否则,需要以 0FFH 表示是 16 进制 的 0FF ;如果默认为 16 进制,则需要使用 178D 表示 178 是 10 进制的。

P31 汇编语言程序格式

此其实为下一节课(下一集视频的内容)。

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

P32 表达式操作符 - 算术操作符

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

对于绿色部分,即为求数组长度,并且赋给 CX 。

对于地址来讲,加减常数是有意义的,乘除意义不明确;寄存器 BX 来讲,进行 + 1 是无意义的。

P33 表达式操作符 - 算逻辑和移位操作符

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

对于 输入指令 IN 与 输出指令 OUT 那部分:

  • 输入进来,再输出出去;
  • 使用了 AND 0FEH ,说明如果是偶数,则输出其本身,否则输出时要进行处理。

P34 表达式操作符 - 关系操作符

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

对于 MOV FID, (OFFSET Y - OFFSET X) LE 128 ,可以判断其时进跳转,还是短跳转。

P35 表达式操作符 - 数值回送操作符

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

P36 例子

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

TYPE ARRAY ,由于 ARRAYTYPEWORD ,因此将 2 赋给 SI

注意 length 与 size 的区别。SIZE对于DB来讲,是指“以DB为单元分配了多少空间”(?)。在高版本中,使用的是sizeof与lengthof。

P37 表达式操作符 - 属性操作符

【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等

此外,还有 LOW , HIGH 操作符等。操作符在汇编程序汇编是就已经算出结果了。