汇编语言ds寄存器中所有寄存器的作用

&摘自:http://blog.csdn.net/lr2131/article/details/6334889&非常感谢博主:从头再来&的知识分享!(自己做了部分修改)
& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&第三章&&&&寄存器(内存访问)
一、&&&&&内存中字的存储
1.&&&&&&&&&8086CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。
2.&&&&&&&&&在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
3.&&&&&&&&&字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。
4.&&&&&&&&&这里将起始地址为N的字单元简称为N地址字单元。
二、&&&&&DS和&[address]
1.&&&&&&&&&8086CPU中的DS寄存器,通常用来存放要访问数据的地址。例如我们读取10000H单元的内容,代码如下:
mov bx,1000H
mov ds,bx
mov al,[0] & & & & & & & & & & & & &//0是偏移地址
2.&&&&&&&&&mov指令功能:
1)&&&&&&&&将数据直接送入寄存器
2)&&&&&&&&将某个寄存器中的内容送入另一个寄存器中
3)&&&&&&&&将一个内存单元中的内容送入一个寄存器中。
上述三条语句的作用是:把1:0)中的数据读取到al中。
mov&寄存器名&内存单元地址(偏移地址,段地址在DS中),[ &]说明操作对象的源地址是一个内存单元,8086CPU会自动取ds中的数据作为内存单元的段地址。
3.&&&&&&&&&由于8086CPU硬件设计的缘故,它不支持用mov指令将地址数据直接写到段地址寄存器中,只能先写到某个通用寄存器中,然后再写到段地址寄存器中。即不存在mov ds, 1000H
三、&&&&字的传送
将寄存器中的值写入到内存单元中:
mov bx,1000H
mov ds,bx
mov ax,[0] ;1000:0处的字型数据送入ax
mov [0],cx&&;cx中的16位数据送到1000:0处(和mov ax,[0]是个相反的过程,即从内存到寄存器 && 从寄存器到内存)
四、&&&&&mov、add、sub指令
1.&&&&&&&&&mov&指令的几种形式:
1)&&&&&&&&mov&寄存器,&&数据& & & & & &&如:mov ax,8
2)&&&&&&&&mov&寄存器,&&寄存器& & & & &如:mov ax,bx
3)&&&&&&&&mov&寄存器,&&内存单元&& & &如:mov ax,[0]
4)&&&&&&&&mov&内存单元,寄存器&& & & &如:mov [0],ax
5)&&&&&&&&mov&段寄存器,寄存器&& & & &如:mov ds,ax
6)&&&&&&&&mov&寄存器,段寄存器&&&&&&&&如:mov ax,ds
7)&&&&&&&&mov&内存单元,段寄存器&&&&&如:mov [0],cs
8)&&&&&&&&mov&段寄存器,内存单元&&&&&如:mov cs,[0]
2.&&&&&&&&&add和sub指令同mov一样,都有两个操作对象:
1)&&&&&&&&add&寄存器,数据& & & & & & & & & & & 如:add ax,8
2)&&&&&&&&add&寄存器,寄存器& & & & & & & & & &如:add ax,bx
3)&&&&&&&&add&寄存器,内存单元&&&&&&&&&&&&&&&&如:add ax,[0]
4)&&&&&&&&add&内存单元,寄存器&&&&&&&&&&&&&&&&如:add [0],ax
5)&&&&&&&&sub&寄存器,数据& & & & & & & & & & & &如:sub ax,9
6)&&&&&&&&sub&寄存器,寄存器& & & & & & & & & &&如:sub ax,bx
7)&&&&&&&&sub&寄存器,内存单元& & & & & & & & &如:sub ax,[0]
8)&&&&&&&&sub&内存单元,寄存器& & & & & & & & &如:sub [0],ax
五、&&&&&数据段
1.&&&&&&&&&对于8086CPU机,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N&=64KB)、地址连续、起始地址为16的倍数的内存单元当做专门存储数据的内存空间,从而定义了一个数据段。
2.&&&&&&&&&将一段内存当做数据段,是我们在编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,在根据需要,用相关指令访问数据段中的具体单元。
七、&&&&&CPU提供的栈机制
1.&&&&&&&&&8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,在基于8086CPU编程的时候,可以将一段内存当做栈来使用。
2.&&&&&&&&&8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。如:
& &&&&&&&&&&&&&push ax,将寄存器ax中的数据入栈,pop ax表示从栈顶取出数据到ax。对栈的操作都是以字为单位进行的(这也就是为什么下面会出现SP=SP-2 or SP = SP+2 )。
3.&&&&&&&&&栈顶为低地址,也即是说栈增长方向是从高到低。在栈操作指令完成后,栈顶是指向有数据的(栈为空时例外)。
4.&&&&&&&&&8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中,任意时刻,SS:SP指向栈顶元素。
5.&&&&&&&&&push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。
6.&&&&&&&&&push ax的执行过程:
1)&&&&&&&&SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
2)&&&&&&&&将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
注意:第一幅图中的红色箭头标注的位置,是在1000FH的下面位置.
7.&&&&&&&&&pop ax的执行过程:
1)&&&&&&&&将SS:SP指向的内存单元处的数据送入ax中。
2)&&&&&&&&SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
八、&&&&&&&&&&&&&栈顶超界的问题
1.&&&&&&&&&栈顶超界既可以发生在入栈时,也可以发生在出栈时。即当栈满的时候再使用push指令入栈,或栈空的时候再使用pop指令出栈,都将发生栈顶超界的问题.
2.&&&&&&&&&栈顶超界是危险的,栈空间外的空间可能存放了有其他用途的数据、代码。如果在出栈入栈时不小心将这些数据、代码意外地改写,将会引发一连串的错误。
3.&&&&&&&&&8086CPU不保证我们对栈的操作不会超界。也就是说,8086CPU只知道栈顶在何处(由SS:SP指示),而不知道我们安排的栈空间有多大。类似的,CPU只知道当前要执行的指令在何处(由CS:IP指示),而不知道要执行的指令有多少。从这两点看出,8086CPU的工作机理,它只考虑当前的情况:当前的栈顶在何处、当前要执行的指令是哪一条。
4.&&&&&&&&&我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。
九、&&&&&push、pop指令
1.&&&&&&&&&push和pop指令是可以在寄存器和内存单元之间传送数据的。
2.&&&&&&&&&push和pop指令的格式可以是如下形式:
1)&&&&&&&&push&寄存器&&&&&&&&&&&&&&&&pop&寄存器
2)&&&&&&&&push&段寄存器&&&&&&&&&&&&pop&段寄存器
3)&&&&&&&&push&内存单元&&&&&&&&&&&&pop内存单元
3.&&&&&&&&&寄存器清零指令有:sub ax,ax(两个字节机器码)和mov ax,0(三个字节机器码)
4.&&&&&&&&&push,pop指令实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。同时,push和pop指令还要改变SP中的内容。
5.&&&&&&&&&push和pop指令不同于mov指令,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。(首先是SP的变化,其次才是数据的入栈or出栈)
十、&&&&&&&&&&&&&栈段
1.&&&&&&&&&将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就在执行push、pop等栈操作指令时自动地将我们定义的栈段当作栈空间来访问。
2.&&&&&&&&&一个栈段最大可设为64KB。
十一、&&实验2:用机器指令和汇编指令编程
1.&&&&&&&&&&d &段寄存器:偏移地址 & & 等价于 & & d 段地址:偏移地址
& 2010 - 2018 苏州灵动帧格网络科技有限公司 版权所有.
ICP经营许可证 苏B2-&豆丁微信公众号
君,已阅读到文档的结尾了呢~~
汇编语言复习资料(附答案)
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
汇编语言复习资料(附答案)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口您还可以使用以下方式登录
当前位置:&>&&>& > 汇编寄存器简介
汇编寄存器简介
.1通用 寄器 存通 寄用器存包了括个16/82位的3存器:AX/EA寄、BXXE/X、CX/EBXC、XDE/X、SD/ESP、BP/PBPED、/EIIDS及IE/S。I其A中/EAXXB、/XBX、CEX/CXEDX/、EXD一在情般况下为作用通数据的寄存,器来暂用时存放计算过程中所到的用作数、操果或结其信他息它。们还可分为个独立两的位8寄存器使用命名为,ALAH、BL、、HBC、L、H、DL和DHC。这4个用通数据寄器存通除功能用外,还有如下专门用途:  X/EAXA作为累器用,加以它是算术所运算的要主存器寄在。乘指令除指定用来存中操作放。另外数所有,I的O指令都使用/XAA或L外部设与传送信备息。 BX E/B在X计算储器地存址,可作为时址寄存基使用器。 C /XECX常来用保存计数,值在移位如令、指循环令指串处和理令指中作用隐含计的数。器DX在作字长双运时,算把D可和AX组合在X起一放存一双字长数个DX,用存来放16高位数据此。,对外些某/OI作操D,可用来存放IXO/的端地口。址  P/ESPSBP、/EPB、S/EII、DIS/EI四个D6132/寄位存可以器象数据寄存器一在运样过程中算存操放数,作但它只能们字(以6/32位)1单为位用。使外,此们更它常经用的途是存在储器寻时址提,偏供移址地。因,此它可称为们指或针址变寄器存。 S /PEPS称堆为栈指寄存器针,用来出栈顶指偏移的址。地  PB/BE称P为址基指针寄存器,在址寻作为基地时寄存址器使用,它但须与堆栈段必寄器存SS用来联定堆栈确段中存储单元的址地。2、志寄标存器FALG条码件志用标来录程记中序行结果运状的信态息它,是们根据有指令关的行结果由运(CPU)动设置自的由于。些状态信息往这作往为续后条转件移指的令移控制条转,所件称以为条件码  。①进 位标 C志F,录记运算时最有效位高生产的位进值。  ② 号标志 SF,符录记运算结果符的号结果。为负时1,否置则0。置  ③ 零标志  ZF运算,果为结0时ZF置1位,否置0则。  ④溢出 标 志F,O运在算程过中,操作如超出数机器可表了数的示围范称为出溢溢。时OF出位1,置则置否。0 ⑤ 辅助进位 志 标F,记录运A时第算位3(半个节字)产生进位的。值 ⑥  奇标志 偶P,用来F机为器传中信息时送可能生的代产出码错况情提检验供条件。结当果操数作中1个的数为偶时数1置,则否置0。百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网92to.com,您的在线图书馆!
欢迎转载:
相关推荐:人生可以一无所有,但不能一事无成。
汇编之寄存器详解
“变量”寄存器
一个典型CPU由运算器、控制器、寄存器等器件构成。之所以称寄存器为“变量”的原因,CPU中的主要部件是寄存器,寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。
不同的CPU,寄存器的个数、结构是不相同的。8086CPU有14个寄存器,每个寄存器有一个名称,分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。下面主要接收一下通用寄存器,寄存器存储,16BitCPU结构,物理地址,段寄存器,代码结构。
通用寄存器
8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通冲用来放一般性的数据,被称为通用寄存器,一个16为寄存器可以存储一个16位的数据,作为一门经典语言,为了保证其兼容性(上下),可以将其分为两个独立使用的8为寄存器来用:AX(16位)可分为AH(8~15位)和AL(0~7位)。
例如AX寄存器,如下图所示:
例如AX:AH+AL,如下图所示:
寄存器存储
处于兼容性的考虑,8086CPU可以一次性处理一下两种尺寸的数据。①字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中;②记为word,一个由两个字节组成,这两个字节分别称为这个的高位字节和低位字节。
一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器中。
16位CPU结构
在8086内部,能够一次处理、传输、暂时存储的信息的最大长度是16位或16位的地址。其结构特性包括以下几方面。
①运算器一次最多可以处理16位的数据;
②寄存器的最大宽度为16位;
③寄存器和运算器之间的通路为16位。
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次处理、传输、暂时存储的地址为16位。从8086CPU的内部机构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出寻址能力只有64KB。
当8086CPU要读写内存时,将提供的两个16位的地址(段、偏移地址),通过内部总线送入一个地址加法器的部件,其中地址加法器将两个16位地址合成为一个20的物理地址,采用规则位物理地址=段地址*16+偏移地址,既而将物理地址送入输入输出控制电路,最后地址总线完成物理地址到存储器过程。
(物理地址=段地址*16+偏移地址)的本质含义是:CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
小技巧:一个数据的十六进制形式左移1位,相当于乘以16;一个X进制的数据左移1位,相当于乘以X。
纠正一个常识问题:内存被划分成了一个一个的段,每一个段有一个段地址。其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,是的我们可以用分段的方式来管理内存。
所以,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址*16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元,注意:①段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;②偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。
8086CPU中最关键的两个段寄存器CS和IP,它们指示了CPU当前要读取指令的地址。CS位代码段寄存器(段),IP位指令指令寄存器(偏移)。
8086CPU的工作过程可以简要描述如下:
⑴从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
⑵IP=IP+所读取指令的长度,从而指向下一个指令;
⑶执行指令。转到步骤⑴,重复这个过程。
在8086CPU加电启动或复位后,CS和IP被设置位CS=FFFFH,IP=0000H,即8086PC机刚启动时,CPU从内存FFF0H单元中读取指令执行。在CPU中,程序员能够用指令读写的只有寄存器,通过改变CS、IP中的内容来控制执行目标指令。
控制CPU完成的操作
用高级语言的语法描述
将18送入寄存器AX
将78送入寄存器AH
将寄存器AX中的数值加上8
将寄存器BX中的数据送入寄存器AX
将AX和BX中的数值相加,结果存在AX中
代码段归咎于一段段内存用于存放代码,它包含段地址与长度。例如123B0H~123B9H,段地址为123BH,长度为10个bit
小结:在8086CPU中段地址存放于段地址器,主要为4个段寄存器,其中CS用于存放指令的段地址;CS存放指令的段地址,IP存放指令的偏移地址;任意时刻,CPU将CS:IP指向的内容当作执行执行。
注:Debug作为DOS、Windows系统的调试工具,常用指令如下:
①R命令:查看、改变CPU寄存器的内容;
②D命令:查看内存中的内容;
③E命令:改写内存中的内容;
④U命令:将内容中的机器指令翻译成汇编指令;
⑤A命令:以汇编指令的格式在内存中写入一条机器指令;
⑦C命令:比较两个内存的内容;
⑧F命令:将表中的值,添加内存单元中;
⑨G命令:执行需运行的程序,并对调试的程序进行断点测试跟踪;
⑩H命令:对两个十六进制数进行加、减;
(11)N命令:给文件定名,用于文件存盘或装入内存区;
(12)Q命令:退出Debug状态;
(13)T命令:执行以CS:IP中指定开始的一个或几个指令,并显示出执行每条指令后所有寄存器;
(14)U命令:将内存某一区的机器码,用此命令反汇编为源程序;
(15)W命令:把正在调试的文件写入磁盘;
(16)O命令:向指定的端口输出一个字节;
(17)L命令:把磁盘上的内容转入内存;
(18)I命令:从指定的端口显示输入数据。
命令详细用法百度吧。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 汇编语言的寄存器 的文章

 

随机推荐