8086CPU的所有寄存器都是16位的, 可以存放2个字节. AX, BX, CX, DX这4个寄存器通常用来存放一般性的数据, 被称为通用寄存器
为了兼容上一代8位寄存器.AX, BX, CX, DX这4个寄存器可以分为两个独立的8位寄存器来使用
8086cpu有4个段寄存器: CS, DS, SS, ES,各自扮演了特定的角色。
1. CS(代码段寄存器):Code Segment register,是用来存储执行指令的段的基地址。当8086在运行时,会使用CS:IP来构造实际的物理地址来获取需要执行的指令。
2. DS(数据段寄存器):Data Segment register,它被用来存储处理器正在处理的数据段的基地址。当处理器需要处理数据(读取或者写入)时,会用DS和有效地址结合生成实际的物理地址。
3. SS(堆栈段寄存器):Stack Segment register,是用于存储当前使用的堆栈的基地址。当进行堆栈操作(比如PUSH或POP)时,会用SS与堆栈指针(SP)组成实际的物理地址。
4. ES(附加段寄存器):Extra Segment register,是一个附加的数据段寄存器,通常在需要进行一些数据拷贝和转移的操作(例如字符串操作)时用到,用于存储源/目标数据的段基地址。
以上所有的段寄存器都用于确定不同类型内存操作的物理地址。因为在8086中,实际的物理地址 = 段寄存器 * 16 + 有效地址,因此段寄存器的存在及其重要,对于了解8086构造物理地址的方式、理解整个存储器的结构和运行特性具有很大的帮助。
在8086内部,能够一次性处理, 传输, 暂时存储的信息最大长度是16位. 8086cpu有20位地址总线, 可以传送20位地址, 达到1MB的寻址能力.
计算ffff:0006单元中的数乘以3, 结果存在dx中
assume cs: code
code segment
mov ax,0ffffh ;在汇编源程序中,数据不能以字母开头,所以要在前面加0
mov ds,ax ;设置数据段地址的起始地址为,offff
mov bx,6 ;以上,设置ds:bx指向ffff:6 ,设置偏移地址,偏移量为6
mov al,[bx] ;从内存地址ffff:6中取出数去到al中,[BX]表示的是一个内存地址,具体的地址值存储在BX寄存器中。意思是从内存中读取一个数据到AL寄存器
mov ah,0 ;以上,设置(al)=((ds*16) + (bx)), (ah)=0 ,因为第一句ah=FF,所以在这里将ah设置为0
mov dx,0 ;累加寄存器清0
mov cx,3 ;循环3次,用与loop循环计数器
s: add dx,ax ;ax既 ah+al的值
loop s ;以上,累加计算(ax)*3,从ax取值与dx内容相加,共进行3次+ax的操作,应注意:ax内的值是16进制的
mov ax,4c00h
int 21h ;程序返回
code ends
end
利用栈, 将程序中定义的数据逆序存放
assume cs:codesg
codesg segment
;dw 定义的数据偏移地址从0开始,地址段属于cs地址段 cs:0 开始
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
; 用dw定义16个字型数据,在程序加载后,将取得16个字的内存工具
; 在后面的程序中将这段空间当做栈来使用
start: mov ax,cs ;取出cs的初始地址
mov ss,ax ;cs的初始地址放在ss中
mov sp,30h ; 将设置栈顶ss:sp指向cs:30,dw定义了24个字空间,共计48个字节,48=30h
mov bx,0 ;累加器,用于计算数据栈地址偏移量
mov cx,8 ;loop计数器,循环8次
s0: push cs:[bx] ;
add bx,2
loop s0 ;以上将代码段0~15单元总的8个字型数据依次入栈
mov bx,0
s1: pop cs:[bx]
add bx,2
loop s1 ;以上依次出栈8个字型数据到代码段0~15单元中
mov ax,4c00h
int 21h
codesg ends
end start ;指明程序的入口在start处
8086汇编程序中,什么时候用 cs,IP, SS, SP, BP, SI, DI, DS, ES这些寄存器?
在8086汇编编程中,这些寄存器具有不同的用途:
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack ;栈地址给ax
mov ss,ax ;栈地址放到ss中,ss寄存器寄存器用于指向当前使用的堆栈的基址。它通常与SP寄存器一起使用,以处理堆栈操作
mov sp,16 ;此寄存器一般与SS寄存器一起使用,以维护堆栈指针。它指向当前堆栈的顶部
mov ax,data ;data数据段地址给ax
mov ds,ax ;data数据段的地址送到ds段寄存器中。此寄存器主要用于处理数据操作。在使用数据数组或变量时,通常会保留数据段的地址。
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
本文链接:https://blog.nnwk.net/article/176
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论