本文主要是介绍汇编语言(二)—— 数据表示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
汇编语言(二)—— 数据表示
- 数据表示
- 常量表达
- 变量定义
- 定义BYTE和SBYTE数据
- 定义WORD和SWORD数据
- 定义DWORD和SDWORD数据
- 定义QWORD数据
- 定义压缩BCD数据
- 定义浮点类型
- 补码表示的有符号整数
- 多字节数据的存储顺序
- 变量应用
- 变量的地址属性
- 变量的类型属性
- 参考
数据表示
常量表达
常量:程序中使用的确定数值,不需要保存在内存当中,直接编码于指令代码。所有出现的符号名都将被替换为定义内容。
常量表达形式包括:① 常数(数值);② 字符和字符串(ASCII码值)③ 符号常量(标识符代替数值)④ 数值表达式(运算得到数值)
-
常数:十进制(后缀:D 或 无后缀)、十六进制(后缀:H;以字母A ∼ \sim ∼ F开头的十六进制常数要加前导0)、二进制(后缀:B)表达的数值。
-
字符和字符串:英文单引号或双引号括起来的单个或多个字符,每个字符的数值是对应的ASCII码值。
-
符号常量:使用标识符表达一个数值,定义形式如下:
① 等号伪指令:
等号定义的符号,在同一程序内可以被重新定义。符号名 = 数值表达式
② EQU伪指令:
EQU定义的符号不能被重新定义。符号名 EQU 数值表达式符号名 EQU 已存在符号名称符号名 EQU <字符串> ,如WriteConsole equ <WriteConsole)
③ TEXTEQU伪指令:
TEXTEQU定义的符号随时可以被重新定义。符号名 TEXTEQU <字符串>符号名 TEXTEQU 已有文本宏的内容符号名 TEXTEQU %整数常量表达式
-
数值表达式:
① 用运算符连接各种常量构成的算式,常用的算术运算符有加减乘除;
② 数值用作地址,数值表达式称为地址表达式,地址表达式只能使用加减,指示地址移动常量表示的若干个字节存储单元。
变量定义
变量:随程序运行发生变化的数据,保存在可读可写的主存空间,主存单元的数据,需要事先定义然后使用,属性定义后就有属性便于使用。
变量的定义:
变量名 变量定义伪指令 初值表
-
变量名(符号地址):用户标识符,可以没有,表示首元素逻辑地址。
-
变量定义伪指令助记符:byte(8位)、sbyte(8位,有符号)、word(16位)、sword(16位,有符号)、dword(32位)、sdword(32Bit,有符号)、qword(64Bit)等,表示变量类型。
-
初值表:用逗号分隔的一个或多个参数(多个参数同高级语言数组),表示变量初值。初值表参数类型:① 各种形式的常量;② 使用“?”表示表示初值不确定,即未赋初值,在主存保留存储空间,用0填充;③ 使用复制操作符DUP表示多个同样数值。
-
复制操作符格式:
重复次数 DUP(重复参数) ; e.g. bvar byte 5 dup("\$") 复制操作符DUP可以嵌套 ; e.g. byte 2 dup(2, 3, 2 dup(4))
定义BYTE和SBYTE数据
每个变量1个字节空间(8位),2个16进制位。
-
8位无符号整数(伪指令:BYTE / DB):0 ∼ \sim ∼ 255
-
8位补码表示的有符号整数(伪指令:SBYTE / DB):-128 ∼ \sim ∼ +127
-
多初始值:标号只指出第一个初始值的偏移量。
-
字符:ASCII码
-
定义字符串:
; e.g. msg byte 'Hello',13,10,0 ; 13,10,0表示$\backslash$n与0
-
“?”:无初值,在主存中保留存储空间,用0填充。
-
符号常量:使用等价的数值替代。
;e.g.minint = 10bvar byte minint dup(0), minint dup(minint, ?)bvar byte 10 dup(0), 10 dup( 10 , ?) ; (10+20)个字节(BYTE)空间
-
…
定义WORD和SWORD数据
每个变量2个字节空间(16位),4个16进制位。
- 16位无符号整数(伪指令:WORD / DW):0 ∼ \sim ∼ 65535
- 16位补码表示的有符号整数(伪指令:SWORD / DW):-32768 ∼ \sim ∼ +32767
- 16位字数组
- 16位段地址
- 16位偏移地址
- …
定义DWORD和SDWORD数据
每个变量2个字节空间,8个16进制位。
- 32位无符号整数(伪指令:DWORD / DD):0 ∼ \sim ∼ 2 32 2^{32} 232-1
- 32位补码表示的有符号整数(伪指令:SDWORD / DD):- 2 31 2^{31} 231 ∼ \sim ∼ + 2 31 2^{31} 231-1
- 32位双字数组
- 32位逻辑地址:含16位段地址和16位偏移地址
- …
定义QWORD数据
每个变量8个字节空间,16个16进制位。
伪指令:QWORD / DQ
定义压缩BCD数据
Intel将压缩的二进制编码的十进制整数存放在一个10字节的包中,每个字节包含2个10进制数字,最高字节中,最高位表示该数的符号位,如果最高字节为80h,该数就是负数;如果最高字节为00h,该数就是正数。
伪指令(常数的初始值必须是16进制):TBYTE
将实数编码为压缩BCD码:
.dataposVal REAL8 1.5bcdVal TBYTE ?.codefld posVal ; 加载到浮点堆栈fbstp bcdVal ; 向上舍入到2,压缩BCD码值
定义浮点类型
伪指令:
- REAL4定义4字节单精度浮点变量
- REAL8定义8字节双精度数值
- REAL10定义10字节扩展精度数值
补码表示的有符号整数
- 正数原码求补码:
原码 = 反码 = 补码 - 负数原码求补码:
原码 = 符号位为1,数值部分取绝对值
反码 = 符号位为1,数值部分为原码取反
补码 = 符号位为1,数值部分为反码+1 - 补码求原码:
符号位 = 0,补码就是原码;
符号位 = 1,再次求补得其正数值,即补码符号位不变,其余各位取反+1。 - 补码加法:[X+Y] b u m a _{buma} buma = [X] b u m a _{buma} buma + [Y] b u m a _{buma} buma
异号加法时,结果一定不会溢出;同号加法时,结果同号则未溢出,结果异号则溢出。 - 补码减法:[X-Y] b u m a _{buma} buma = [X] b u m a _{buma} buma + [-Y] b u m a _{buma} buma
[-Y] b u m a _{buma} buma = 负补,对补码的每一位取反(包括符号位)末位+1。
计算机只会加法运算,减法运算将被转换为加法运算。
同号减法 = 异号加法,一定不会溢出;
异号减法 = 同号加法,若结果与减数符号相同则溢出(正 - 负 = 正 + 正 = 负;负 - 正 = 负 + 负 = 正),否则未溢出(正 - 负 = 正 + 正 = 正;负 - 正 = 负 + 负 = 负)。 - 如果十六进制数的最高位大于等于8,该数是负数;如果最高位小于等于7,该数是正数。
多字节数据的存储顺序
变量保存于字节编址的主存储器中,每个存储单元保存一个8位的字节量数据,多个字节数据逐个存放在主存的相邻单元。
- 一个存储单元保存一个字节量数据,一个存储单元对应一个存储器地址。对N个字节的数据(N ≥ \geq ≥ 2),存储在N个连续的存储单元,具有N个存储器地址。
- 字节量数据的顺序存储:低地址 -> 高地址
- 字量、双字量数据的存储顺序:书写时左边是高位,右边是低位。
大端方式:高字节数据保存在低地址存储单元,低字节数据保存在高地址存储单元;
小端方式:高字节数据保存在高地址存储单元,低字节数据保存在低地址存储单元(高对高,低对低)。 - 80x86采用小端方式存储多字节数据。
变量应用
定义后的变量名具有两类属性:① 地址属性:首个变量所在存储单元的逻辑地址;② 类型属性:变量定义的数据单元。
变量的地址属性
变量的地址属性指所在存储单元的逻辑地址,含段基地址和偏移地址。通过地址操作符获得变量的地址属性值。
地址操作符:
; 地址操作符
[] ; 括起的表达式作为存储器地址指针
$ ; 返回当前偏移地址
OFFSET varName ; 返回变量名所在段的偏移地址
SEG varName ; 返回段基地址(实地址存储模型); e.g. 1
bvar byte 12h,34h ; 该条指令在数据段(DS)出现mov al, bvar ; 该条指令在代码段(CS)出现,AL = 12Hmov ah, bvar + 1 ; 该条指令在代码段(CS)出现,AH = 34H; e.g. 2
wvar word 5678H ; 该条指令在数据段(DS)出现
dvar dword 9abcdef0H ; 该条指令在数据段(DS)出现,地址值在 wvar 之后mov bx, wvar[2] ; wvar + 2 刚好为 dvar 地址值的开始; bx 为16位寄存器,因此bx = def0; e.g. 3
dvar dword 9abcdef0H ; 该条指令在数据段(DS)出现mov edx, $ ; 该条指令在代码段(CS)出现,; 因此EDX = 代码段地址 + $ 值mov esi, offset dvar ; dvar变量在数据段(DS)定义,; 因此ESI = 数据段地址 + offset 值mov edi, [esi] ; 通过地址获得变量值mov ebp, dvar ; 直接获得变量值
- org指令:org 参数 ; 指定变量存放位置的伪指令。
- 数据段使用变量名代表其偏移地址;
- 代码段使用变量名代表其首个数据值(变量值),变量名加减常量指向首个数据的前后单元,变量名[n] = 变量名 + n。
变量的类型属性
变量的类型属性表示变量定义的数据单位,通过类型操作符获得变量的类型属性值。
; 类型操作符
typeName PTR varName ; 将变量名按照指定的类型使用
TYPE varName ; 返回占用字节空间的字量数值
LENGTHOF varName ; 返回整个变量的数据项数
SIZEOF varName ; 返回整个变量占用的字节数; e.g.
array word 1,2,3,4,5,6,7,8,9,10 ; 数据段(DS), 字类型mov eax, dword ptr array ; 代码段(CS), 以双字类型访问,eax 为双字类型
- 变量定义: 字节变量定义BYTE,字变量定义WORD,双字变量定义DWORD
- 类型名:BYTE,WORD,DWORD
- 类型值(字节数):1,2,4
- 寄存器具有确定的类型属性:8位寄存器是字节类型byte;16位寄存器是字类型word;32位寄存器是双字类型dword。
参考
中国大学MOOC汇编语言程序设计
汇编语言基于x86处理器
这篇关于汇编语言(二)—— 数据表示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!