第三章 寄存器(内存访问)
3.1 内存中字的存储:内存中每个地址对应一个字节,对于字,可以利用最后一位的0/1来区分,它由两个连续的内存单元来存储。
3.2 DS和[ADDRESS] 内存单元地址,由段地址和偏移地址组成,可以利用MOV进行修改,但是不能利用立即数进行修改,需要利用通用寄存器作为中介。对于字的传送,指定低位地址,高位字节自动放在高地址单元。
3.3 MOV、SUB、ADD指令
两个操作数,ADD/SUB/MOV寄存器或[立即数],寄存器或[立即数]
3.5 数据段:与代码段对应,在内存中划分出64K的内存段用来存储数据。CPU利用DS加上偏移量来读取数据
3.6 栈:先入后出的一种数据结构,可以利用软件或者硬件的方式实现,用于倒序数组(LIFO)。
操作指令PUSH压栈指令,内存取址SS:SP指向栈顶元素,每次取两个字节。从高到低排列
PUSH AX
SP=SP-2
送入AX中元素
·POP AX
送出AX中元素
SP=SP+2
8086CPU利用SS和SP指示栈顶的地址,并提供PUSH和POP指令实现对于栈的入栈和出栈,但是无法保证栈顶不超过栈空间,如果超过栈空间,则会将栈外数据覆盖。
栈空间是一段在内存中分配的以特殊的访问方式进行操作的空间,它从地址较大段向地址较小段写入,从地址较小段向地址较大段读取
PUSH POP可以操作通用寄存器、段寄存器和内存单元,只有一个操作数。
栈段在编程时进行安排,CPU在需要读取栈段时会将SS:SP所指向内存的内容进行访问
关于栈的使用:
使用栈之前需要首先分配栈空间,利用数据段.DATA中 DUP(?)
利用MOV 来指定SS和SP,指定到一定的内存空间为栈空间。
第四章 程序格式及程序的解读
格式一:
assume cs:codeseg ds:dataseg ss:stackseg ;assume关联段寄存器与段定义
codeseg segment
MOV AX,DATASEG
MOV DS,AX
MOV AX,STACKSEG
MOV SS,AX
;
MOV AH,4CH
INT21H
codeseg ends
dataseg segment
;
cdataseg ends
stackseg segment
;
stackseg ends
end
格式二:
.MODEL SMALL
.STACK 100H ;规定栈大小
.DATA
;
.CODE
[LABEL] PROC FAR
MOV AX,@DATA
MOV DS,AX
;
MOV AH,4CH
INT 21H
[LABEL] ENDP
END [LABEL]
格式三:
.MODEL SMALL ; 设定8086汇编程序使用Small model
.8086 ; 设定采用8086汇编指令集
.stack 100h ; 定义256字节容量的堆栈
.data ; 定义数据段
.code ; Code segment definition
.startup ; 定义汇编程序执行入口点
;
END ;指示汇编程序结束编译
格式四:
ORG 100H
;
注意程序执行时会保留头部100H的内存空间来保存信息
当然,也可以在代码段使用数据,这是数据将保存在代码段,可以利用CS:IP来使用这些数据。也可以在代码段使用栈,基本代码如下:
MOVAX,CS
MOVSS,AX
MOVSP,30H ;堆栈指针指向CS:30H,当然,在代码段前面部分需要分配相对应大小的数据空间。
但是为了程序结构清晰,最好代码数据堆栈分开放置