数据表示和寻址(汇编语言)

整数

无符号整数(无符号数)

  • 只表达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给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言

变量应用

变量

程序运行中随之发生变化的结果
保存在可读可写的主存空间
实质是(主存单元的数据,因而可以改变)
变量需要先定义才能使用
变量具有(属性方便应用)
变量表达主存数据,即(存储器操作数)

变量定义

  1. 申请存储空间,还可以进行存储单元初始化

变量名 变量定义伪指令 初值表

  1. 变量名是(用户标识符),表示(首)元素(逻辑地址)
  2. 变量定义的伪指令有:

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字节数据(浮点处理单元支持)

  1. 初值表示用逗号分隔的参数

各种形式的常量
"?"表示初值不确定,即未赋初值
复制操作符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整除的地址

  1. 2字节,16位数据是被2整除的地址(偶地址)
  2. 4字节,32位数据是被4整除的地址(模4地址)
  3. 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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值