文章目录
整数
无符号整数(无符号数)
- 只表达0和正整数的定点整数
- N位无符号整数表达范围:0~2N-1
有符号整数(有符号数)
- 表达负整数,0和正整数的定点整数
- (最高位)表达数值正负
- 符号位用0表示正数,1表示负数
补码
有符号整数在计算机中默认采用(补码)
正数补码:直接表示数值大小(同无符号数)
负数补码:(将其绝对值的补码去反加1)
范围:-2N~2N-1
字符的编码
- 在计算机中,各种字符需要用若干位的二进制码的组合表示,即(字符的二进制编码)
- 由于字节为计算机的基本存储单位,所以常以8个二进制位为单位表达字符
BCD码(权值:8421)(又称"8421码")
二进制编码的十进制数
- 一个十进制数位(0~9)用4位二进制编码来表示
- 压缩BCD码:一个字节表达两位BCD码
- 非压缩BCD码:一个字节表达一位BCD码(低4位表达数值,高4位常设置为0)
BCD码很直观
BCD码:0100 1001 0111 1000.0001 0100 1001
十进制真值: 4978.149
ASCII码
- 标准ASCII码用7位二进制编码,有128个
- 不可显示的控制字符:前32个和最后一个
回车CR:0DH 换行LF:0AH 响铃BEL:07H
- 可显示和打印的字符:20H及以后的95个编码
- 数码0~9:30H-39H
- 大写字母A-Z:41H-5AH
- 小写字母a-z:61H-7AH
- 空格:20H
- 扩展ASCII码:最高D7位为1,表达制表符号
Unicode(统一码)
- 8位ASCII码表达应为字符
- 16位国际码表达汉字字符
汉字机内码:国际码在计算机中使用的编码
- 国际信息交换码Unicode
16位编码
对世界上所有语言的大多数字符进行编码
提供扩展能力
Unicode兼容ASCII
注:Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言
变量应用
变量
程序运行中随之发生变化的结果
保存在可读可写的主存空间
实质是(主存单元的数据,因而可以改变)
变量需要先定义才能使用
变量具有(属性方便应用)
变量表达主存数据,即(存储器操作数)
变量定义
- 申请存储空间,还可以进行存储单元初始化
变量名 变量定义伪指令 初值表
- 变量名是(用户标识符),表示(首)元素(逻辑地址)
- 变量定义的伪指令有:
DB(变量类型:字节):分配一个或多个(字节)单元;每个数据是字节量,也可以是字符串常量
字节量表示8位无符号数或有符号数,字符的ASCII码值
DW(变量类型:字):分配一个或多个(字)单元;每个数据是字量,16位数据
字量表示16位无符号数或有符号数,16位段地址,16位偏移地址
DD(变量类型:双字):分配一个或多个(双字)单元;每个数据是双字量,32位数据
双字量表示32位无符号数或有符号数,32位段基地址,32位偏移地址
DF(变量类型:3个字):分配一个或多(6字节)单元;
6字节量表示汗16位段选择器和32位偏移地址的48位指针地址
DQ(变量类型:4个字):分配一个或多个(8字节)单元;8字节量表示64位数据
DT(变量类型:10个字节/5个字):分配一个或多个(10字节)单元;
表示BCD码,10字节数据(浮点处理单元支持)
- 初值表示用逗号分隔的参数
各种形式的常量
"?"表示初值不确定,即未赋初值
复制操作符DUP(重复次数 DUP(重复参数))
字节量数据
DB定义8位,字节量变量数据
可以表达
无符号整数0~255
补码表示的有符号整数:-128~+127
一个字符(ASCII码值)
压缩BCD码(用4位二进制数表示一个BCD码,用一个字节表示两个BCD码,即一个字节存放两个十进制数位):0~99
非压缩BCD码:0~9
注:字符串定义使用字节变量定义DB
字量数据
(DW)定义16位,字量变量数据
可以表达
16位无符号或有符号整数
16位短地址,16位偏移地址
16位数据含高低2个字节,占2个连续的字节存储单元
(小端方式)(Little Endian):(Intel处理器采用小端方式)
低字节数据存放在低地址存储单元
高字节数据存放在高地址存储单元
(大端方式)(Big Endian):
低字节数据存放在高地址存储单元
高字节数据存放在低地址存储单元
字变量程序:
;class002.asm in DOS
;字量数据
.model small ;程序的存储模型
.stack ;定义堆栈段(默认1KB)
.data ;定义数据段
;数据定义(数据待填)
minint =10
wvar1 dw 0,32768,65535,-32768,0,+32767
wvar2 dw 1,-1,38,-38,38h,-38h
wvar3 dw ?
wavr4 dw 2010h,1020h
dw 5 dup(minint,?)
wvar6 dw 3139h,3832h
bvar6 db 39h,31h,32h,38h
db '$'
.code ;定义代码段
.startup ;程序执行起始
;主程序(指令待填)
mov dx,offset wvar6
mov ah,09H
int 21H
.exit ;程序正常执行结束
;子程序(指令待填)
end ;汇编结束
8086采用小端存储方式
双字量数据
(DD)定义32位,双字量变量数据
可以表达
32位无符号或有符号整数
32位偏移地址,线性地址或段基地址
32位数据包含4个字节,以"高对高,低对低"原则占用4个连续字节空间
;class003.asm
;双字变量程序
.model small ;程序的存储模型
.stack ;定义堆栈段(默认1KB)
.data ;定义数据段
;数据定义(数据待填)
minint=10
dvar1 dd 0,80000000h,0ffffffffh,\
-80000000h,0,7fffffffh
;0000 00000000 80000000 ffffffff
; 80000000 00000000 7fffffff
dvar2 dd 1,-1,38,-38,38h,-38h
;0018 00000001 ffffffff 00000026
; FFFFFFDA 00000038 FFFFFFC8
dvar3 dd ?
;0030 00000000
dd 2010h,1020h
dvar5 dd minint dup(minint,?)
dvar6 dd 38323139h
bvar6 db 39h,31h,32h,38h
db '$'
.code ;定义代码段
.startup ;程序执行起始
;主程序(指令待填)
mov dx,offset dvar6
mov ah,09h
int 21h
.exit ;程序正常执行结束
;子程序(指令待填)
end ;汇编结束
变量定位:指定偏移地址
(1)变量定义的存储空间
- 按照书写的先后顺序 一个接着一个分配
(2)"ORG 参数"控制存放的偏移地址
org 100h ;从偏移地址100H处安排
(3)指令代码也有汇编程序
- 按照语句的书写顺序安排存储空间
(4)定位伪指令也可以用于控制代码的偏移地址
变量定位:对齐地址边界
(1)N字节数据起始于能够被N整除的地址
- 2字节,16位数据是被2整除的地址(偶地址)
- 4字节,32位数据是被4整除的地址(模4地址)
- 8字节,64位数据是被8整除的地址(模8地址)
(2)8086处理器允许不对齐边界存放数据,性能有下降
(3)"ALIGN N"控制对齐N字节边界
align 2 ;对齐2字节地址边界
地址A对齐N字节边界
A MOD N=0(能够被N整除的地址)
org 100h
bvar1 db 100
;地址0100 数据64(1个字节)
align 2
wvar2 dw 100
;地址0102 数据0064(2个字节/一个字)
even
dvar3 dd ?
;地址0104 数据00000000(4个字节/双字)
变量属性
变量定义
分配空间
赋初值
创建变量名
变量名具有两类属性
(1)(地址属性):首个变量所在存储单元的逻辑地址,含有(段基地址)和(偏移地址)
(2)(类型属性):变量定义的数据单位
字节量BYTE(DB)
字量WORD(DW)
双字量DWORD(DD)
3字量FWORD(DF)
4字量QWORD(DQ)
10字节量TBYTE(DT)
地址操作符
(地址操作符)用于获取变量名的地址属性
[] :括起的表达式作为存储器地址指针
$ :返回当前偏移地址
OFFSET 变量名:返回变量名所在段的偏移地址
SEG 变量名:返回段基地址(高16位)
;class004.aam
.model small
.stack
.data
;数据段
bvar db 12h,34h
;地址0000 数据12 34
org $+10 ;从偏移地址$+10处安排,$返回当前偏移地址2+10=12
array dw 1,2,3,4,5,6,7,8,9,10
;地址000C 数据0001 0002 0003 ......
wvar dw 5678h,9abch
;地址0020 数据5678 9ABC
arr_size=$-array
;=0018
arr_len=arr_size/2
;=000C
dvar dd 9abcdef0h
;地址0024 9ABCDEF0
.code
.startup
mov al,bvar ;al=12h
mov ah,bvar+1 ;ah=34h,ax=3412
mov bx,wvar[2] ;bx=9abc
mov cx,arr_len ;cx=000C
mov dx,$ ;dx=0025,返回当前数据段末尾的偏移地址
mov si,offset dvar;si=0020
mov di,[si] ;di=5678
mov bp,wvar ;bp=5678
;sp=0430
.exit
end
类型操作符
类型操作符使用变量名的类型属性
类型名 PTR 变量名 :将变量名按照指定的类型使用
TYPE 变量名 :返回占用字节空间的字量数值
LENGTHOF 变量名 :返回整个变量的数据项数
SIZEOF 变量名 :返回整个变量占用的字节数
数据寻址方式
指令有两部分:操作码和操作数
- 操作码:处理器要执行哪种操作(不可缺少,用(助记符)表示,如mov)
- 操作数:指令执行的参与者(各种操作的对象,需要通过(地址)指示).
数据寻址方式:通过地址查找数据(操作数)
- 立即数寻址:数据在指令代码中,用常量来表达
- 寄存器寻址:数据在寄存器中,用寄存器名来表示
- 存储器寻址:数据在主存中,用存储器地址代表
立即数寻址
例:mov ax,0102h
寄存器寻址
例:mov bx,ax
用寄存器名表示它的内容
绝大多数指令采用通用寄存器寻址
部分指令支持专用寄存器,例如段寄存器(CS,SS,DS,ES)
寄存器寻址方式简单便捷,最常使用
存储器寻址
编程时,存储器地址使用包含段选择器(段基地址)和偏移地址的(逻辑地址)
段基地址(段寄存器(CS,SS,DS,ES))
默认规定:
DS数据段:[bx],[si],[di],[常数];
SS堆栈段:[BP]
显示说明:使用(段超越)指令前缀,段寄存器名后跟英文冒号,如ds:[bp]
(偏移地址由各种寻址方式计算,常被称为有效地址(EA)(Effective Address))
偏移地址的组成
16位有效地址=基址寄存器+变址寄存器+位移量
基址寄存器:BX和BP
变址寄存器:SI和DI
位移量:8或16位有符号值
存储器直接寻址
有效地址只有位移量部分,直接包含在指令代码中
例:MOV AX,COUTN;COUNT是变量
MOV AX,[COUNT];
MOV AX,DS:[2000H]
注:mov指令不支持两个操作数都是存储器操作数!
常数不能当做目的操作数
寄存器间接寻址
有效地址存放在寄存器中(寄存器内容=偏移地址=有效地址)
8086可使用BX,BP,SI,DI寄存器作为间接寻址
寄存器间接寻址没有说明存储单元类型
例:MOV AL,[BX]
MOV CX,[SI]
MOV [DI],DL
MOV WORD PRT [DI],1394H
寄存器相对寻址
有效地址是寄存器内容与位移量之和
8086只能使用BX,BP,SI和DI寄存器寻址
使用BP默认访问堆栈段
例:mov si,[bx+4]
mov di,[bp-08h]
mov ax,count[si]
注:主存以字节为可寻址单位,地址的加减是以字节为单位
基址变址寻址
使用基址寄存器内容加上变址寄存器内容形成有效地址寻址操作数
8086的基址寄存器是BX和BP
8086的变址寄存器是SI和DI
使用BP默认访问堆栈段
便于支持两维数组等数据结构
例:mov al,[bx+si]
mov ax,[bp+di]
mov ax,ds:[bp+si]