【汇编语言与计算机系统结构笔记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 BYTEORG $+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 操作符等。操作符在汇编程序汇编是就已经算出结果了。
【汇编语言与计算机系统结构笔记12】序格式与伪操作:简化段的定义、操作符等相关推荐
- 【汇编语言与计算机系统结构笔记11】程序格式与伪操作:段定义、堆栈 #简洁笔记形式
本次笔记内容: 14.程序格式与伪操作-1 注:本节课更换为一名女老师.我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码. 注 ...
- 【汇编语言与计算机系统结构笔记01】x86/MIPS/ARM指令集概述与特性,一篇HPCA引发的思考(商业生态的决定性作用)
资源Bilibili AV46914471 + AV57921488 汇编语言与计算机系统结构 清华大学 张悠慧 本次笔记内容: 01.汇编语言与计算机系统结构 02.汇编基础知识--指令集综述 文章 ...
- 【汇编语言与计算机系统结构笔记13】简单的上机过程示例
本次笔记内容: 16.上机过程-1(第16分钟开始) 17.上级过程-2 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码 ...
- 【汇编语言与计算机系统结构笔记06】地址计算指令,lea / leal,x86-32与x86-64下的swap对比,汇编的格式对比(Intel/Microsoft Differs from GAS)
本次笔记内容: 07.寻址模式与数据传输指令等-2 文章目录 变址寻址 寻址模式实例 总结mov指令 地址计算指令 lea 整数计算指令 将leal指令用于计算 实例1 实例2 x86-32与x86- ...
- 【汇编语言与计算机系统结构笔记05】汇编的系统结构,从C代码生产汇编代码,一个具体的、经典的数据传送指令(mov)实例与分析
本次笔记内容: 06.寻址模式与数据传输指令等 文章目录 汇编程序员眼中的系统结构 如何从C代码生产汇编代码 如何装gcc? 汇编语言数据格式 第一条汇编指令实例 数据传送指令(mov) 语法与操作数 ...
- 【汇编语言与计算机系统结构笔记03】浮点数的计算机表示,IEEE 754,舍入(rounding),C语言中的浮点数
本次笔记内容: 04.浮点数的计算机表示 文章目录 IEEE的浮点数标准 IEEE的754标准 浮点数示例 计算机中浮点数二进制表示 浮点数的类型 规格化浮点数(Normalized) 规格化浮点数示 ...
- 【汇编语言与计算机系统结构笔记02】整数的计算机表示与运算,C中的无符号字符(unsigned)和带符号字符(signed),补码,一些例题
本次笔记内容: 03.整数的计算机表示与运算 文章目录 预备知识 数制 数的机器表示 机器字在内存中的组织 字节序(Byte Ordering) 整数表示 计算机中整数的二进制编码方式 无符号数与带符 ...
- 【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 异常处理
本次笔记内容: 28.MIPS指令集与汇编程序设计-2 补充:MIPS32异常处理 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库. 本节课对应幻灯片:汇编语言程式设计-MIPS.pd ...
- 【汇编语言与计算机系统结构笔记17】MIPS 汇编初步
本次笔记内容: 25.MIPS汇编初步-1 26.MIPS汇编初步-2 27.MIPS指令集与汇编程序设计 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录 ...
最新文章
- UITableView 顶部空白总结
- Codeforces Round #503 (by SIS, Div. 1)D. the hat
- 【Oracle】PL/SQL Developer使用技巧(持续更新中)
- CSS鼠标响应事件经过、移动、点击示例介绍
- 关于C++子类父类成员函数的覆盖和隐藏
- java 计算工具类_java精确计算工具类
- PaperNotes(15)-图神经网络、PyG极简版入门笔记
- Python测试开发django1.简介
- Exchange2010应用地址列表
- js 正则表达式判断价格
- WSUS补丁服务器部署详细 利用WSUS部署更新程序
- c++编写手机小游戏代码_手机也能编程?盘点这6个可以用手机编程的App!快收藏!...
- 少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(判断题)2022年6月
- Redis中SDS简单动态字符串
- 跨平台APP开发心路历程
- YOLO多线程多模型运行模式的实施
- python财务编程_Python笔记 财务小白的 day4 python编程基础(2)
- 封面空格处添加下划线
- java解压在线tgz文件
- target找不到*.xml和*.properties文件 报错:FileNotFoundException
热门文章
- 力扣题目——107. 二叉树的层序遍历 II
- java成员变量除了方法传递_JAVA类与对象(四)----成员变量与局部变量 、成员方法、构造方法...
- angularjs路由监听,uirouter感知路由变化,解决uirouter路由监听不生效的问题
- Visual Studio 重新生成解决方案 无反映
- nginx之206异常
- Nhibernate出现No row with the given identifier exists问题的产生原因及解决方法
- libc.so.6被删后导致系统无法使用的原因及解决方法
- 关于centos启动报错:Failed to start Crash recovery kernel arming的解决方案
- 【已解决】报异常:java.lang.ArithmeticException: / by zero
- oracle安装错误10301,Oracle数据库案例整理-Oracle系统运行时故障-表空间所在的目录没有可用空间导致收集统计信息失败...