《汇编语言》寄存器物理地址第二章第二节
- 格式:ppt
- 大小:673.08 KB
- 文档页数:50
汇编语⾔——寄存器⼀、栈的基本概念栈有两个基本的操作:⼊栈和出栈。
⼊栈:将⼀个新的元素放到栈顶;出栈:从栈顶取出⼀个元素。
栈顶的元素总是最后⼊栈,需要出栈时,⼜最先被从栈中取出。
栈的操作规则:后进先出8086CPU提供的栈机制8086CPU提供⼊栈和出栈指令:(最基本的)PUSH(⼊栈)POP (出栈)push ax:将寄存器ax中的数据送⼊栈中;pop ax :从栈顶取出数据送⼊ax。
push和pop指令也可以在内存和寄存器传输数据(以栈的形式)8086CPU的⼊栈和出栈操作都是以字为单位进⾏的。
⽰例:1 2 3 4 5 6 7 8 9 10 11假设将10000H~1000FH这段内存当作栈来使⽤(其实CPU并不知道这段是代码段,数据段还是栈段,都是⼈为设定的)下⾯⼀段指令的执⾏过程:mov ax,0123H# AX=0123Hpush ax # 将AX的值推⼊栈中mov bx,2266H# BX=2266Hpush bx # 将BX的值推⼊栈中mov cx,1122H# CX=1122Hpush cx # 将CX的值推⼊栈中pop ax # 将栈顶的2个内存单元取出放到AX寄存器中,AX=1122Hpop bx # 将栈顶的2个内存单元取出放到BX寄存器中,BX=2266Hpop cx # 将栈顶的2个内存单元取出放到CX寄存器中,CX=0123H那么问题来了,在执⾏push和pop的时候,如何知道哪个单元是栈顶单元?8086CPU中,有两个寄存器:段寄存器SS 存放栈顶的段地址寄存器SP 存放栈顶的偏移地址任意时刻,SS:SP指向栈顶元素。
⼆、push和pop指令push 指令的执⾏过程在执⾏push ax指令时,主要做了⼀下2件事(1)先将SP=SP–2(2)将ax中的内容送⼊SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop 指令的执⾏过程在执⾏pop ax指令时,主要做了⼀下2件事(1)先将SS:SP指向的内存单元处的数据送⼊ax中;(2)SP = SP+2,SS:SP指向当前栈顶下⾯的单元,以当前栈顶下⾯的单元为新的栈顶。
汇编语⾔⼊门汇编指令及寄存器详解教程⽬录前⾔什么是汇编语⾔汇编语⾔产⽣的原因汇编与⼆进制的关系寄存器寄存器作⽤存取速度⽐较寄存器分类常⽤寄存器⽤途寄存器EAX、AX、AH、AL的关系汇编语⾔指令数据传送指令算术运算指令逻辑运算指令循环控制指令转移指令linux 和 windows 下汇编的区别总结前⾔我们⼤都是被⾼级语⾔惯坏了的⼀代,源源不断的新特性正在逐步添加到各类⾼级语⾔之中,汇编作为最接近机器指令的低级语⾔,已经很少被直接拿来写程序了,不过我还真的遇到了⼀个,那是之前的⼀个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他⽆法正确调⽤想执⾏的函数,结果他就开始在C++代码⾥嵌⼊汇编了,绕过了种种限制终于如愿以偿,但是读代码的我们傻眼了…因为项⽬是跨平台的,代码推送的 Linux 上编译的时候他才发现,汇编代码的语法在 Linux 和 Windows 上居然是不⼀样的,结果他⼜⽤⼀个判断平台的宏定义“完美”的解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值、左引⽤和右引⽤的时候,总是有⼈⽤程序编译⽣成的中间汇编代码来解释问题,看得我迷迷糊糊,所以决定熟悉⼀下简单的汇编指令,边学习边记录,⽅便今后忘记了可以直接拿来复习。
什么是汇编语⾔汇编语⾔是最接近机器语⾔的编程语⾔,引⽤百科中的⼀段话解释为:汇编语⾔(assembly language)是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。
在汇编语⾔中,⽤助记符代替机器指令的操作码,⽤地址符号或标号代替指令或操作数的地址。
汇编语⾔⼜被称为第⼆代计算机语⾔。
汇编语⾔产⽣的原因对于绝⼤多数⼈来说,⼆进制程序是不可读的,当然有能⼈可以读,⽐如第⼀代程序员,但这类⼈快灭绝了,直接看⼆进制不容易看出来究竟做了什么事情,⽐如最简单的加法指令⼆进制表⽰为00000011,如果它混在⼀⼤串01字符串中就很难把它找出来,所以汇编语⾔主要就是为了解决⼆进制编码的可读性问题。
第一章:1.一个存储器有若干个存储单元,一个存储单元可以存储一个B,及一个字节,及8个二进制位,及8个b(比特)2.一个cpu有N根地址线,则可以说这个cpu的地址总线的宽度为N。
这样的cpu最多可以寻找2的N次个内存单元。
3.数据总线中如8根总线一次可以传送一个字节即8b,1B,十六根则是两个字节16b,2B第二章:1. 8086cpu的寄存器都是十六位的,可以存放两个字节,AX,BX,CX,DX,这四个是通用寄存器,通常用来存放一般的数据。
2. 字等于两个字节,即字=2B3. 一个数据的二进制形式左移1位,相当于该数据乘以2;一个数据的二进制形式左移N 位,相当于该数据乘以2的N次方;同理X进制左移N位,相当于该数据乘以X的N次方4. 偏移地址为16位,所以16位地址的寻址能力为64KB,所以一个段的长度最大为64KB5. cs和ip寄存器是cpu每时每刻所要执行的指向6. jmp 段地址:偏移地址是直接跳而jmp 某一寄存器是修改其中的ip7. 用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码,用A命令以汇编指令的形式在内存中写入机器指令第三章:1. DS和[ ] , DS是段寄存器DS中储存的是段地址,而[ ] 中储存的是偏移地址Mvo 内存单元地址,寄存器也是可以的2.栈是一种具有特殊的访问方式的储存空间,他的的特殊性就在于,最后进入这个空间的数据,最先出去3.push pop ,后面跟寄存器,入栈和出栈都是以字为单位进行的4.段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在sp中,任意时刻,ss:sp指向栈顶元素,入栈时是从高地址向低地址方向进行第五章:1. [bx]同样也是表示一个内存单元,只是它的偏移地址在bx中,段地址还是在段寄存器中2. 注意() 表示括号内的内容,()中的元素可以有三种类型:寄存器,段寄存器名,内存单元的物理地址3. idata表示常量24. cpu执行loop指令的时候,要进行两步操作,第一是(cx)=(cx)-1,第二是判断cx中的值,不为零则转至标号处执行,如果为零则向下执行5. debug 中g 命令是转跳作用,一下子跳到预定的地方;p命令是把循环一次执行完6. 编程中要这样连用ds:[idata],ds:[寄存器],当然[寄存器+idata]也是可以的,同理[寄存器+si或di]也是可以的,前面那个里面两个顺序可以换,还可以这样写: idata[寄存器] [寄存器].idata,后面那个还可以这样写[寄存器][寄存器], [寄存器+idata+si或di],注意没有[寄存器+寄存器]这种类型7. 0:200~0:2ff, 00200h~002ffh的256个字节是安全的第七章:1. and or 是或,与命令2. si和di是8086cpu中和bx功能相近的寄存器,si和di不能分成两个8位的寄存器来使用第八章:1. 只有四个寄存器能在[ ] 中使用,就是bx,si,di,bp,而bx,bp不能同时出现,si,di也不能同时出现2. 只要[ ] 中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中3. 在没有寄存器存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte 例如:mov word ptr ds:[0],1 push pop 命令只进行字操作4.div 除法指令如下图所示:db 定义字节型数据dw定义字型数据dd是用来定义双字型数据的,dup是用来进行数据的重复,也就是复制,比如:db 3 dup (0,1,2) 是定义了0 1 2 0 1 2 0 1 2 九个字节5. 操作符offset在汇编语言中是汇编器处理的符号,它的功能是取得标号的偏移地址,比如:p187第九章:1. jcxz 标号如果cx=0,则转移到标号处执行,当cx不等于0,则什么也不做,它是短转移2. loop 标号cx=cx-1 如果cx不等于0 转移到标号处执行,就是s loop s循环3. ret指令用栈中的数据修改ip的内容,从而实现近转移,retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移所以ret相当于:pop ipRetf相当于:pop ipPop cs5.cpu执行call指令的时候,进行两步操作,第一将当前的ip或cs和ip压入栈中;第二是转移。
汇编语⾔之寄存器使⽤(bx,si,di,bp)这⾥对这⼏个寄存器总结⼀下。
通⽤寄存器的主要⽤途寄存器的分类寄存器主 要 ⽤ 途通⽤寄存器数据寄存器AX乘、除运算,字的输⼊输出,中间结果的缓存AL字节的乘、除运算,字节的输⼊输出,⼗进制算术运算AH字节的乘、除运算,存放中断的功能号BX存储器指针CX串操作、循环控制的计数器CL移位操作的计数器DX字的乘、除运算,间接的输⼊输出变址寄存器SI存储器指针、串指令中的源操作数指针DI存储器指针、串指令中的⽬的操作数指针变址寄存器BP存储器指针、存取堆栈的指针SP堆栈的栈顶指针指令指针IP/EIP标志位寄存器Flag/EFlag32位CPU的段寄存器16位CPU的段寄存器ES附加段寄存器CS代码段寄存器SS堆栈段寄存器DS数据段寄存器新增加的段寄存器FS附加段寄存器GS附加段寄存器这张表⽤来参照。
(1)在8086CPU中只有这四个寄存器可以在[...]中进⾏内存单元的寻址。
⽐如,下⾯的指令都是正确的:mov ax,[bx]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp]mov ax,[bp+si]mov ax,[bp+di]⽽下⾯都是错误的:mov ax,[cx]mov ax,[ax]mov ax,[dx]mov ax,[ds](2).在[...]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。
⽐如下⾯都是正确的mov ax,[bx]mov ax,[si]mov ax,[di]mov ax,[bp]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp+si]mpv ax,[bp+di]mov ax,[bx+si+idata]mov ax,[bx+si+idata]mov ax,[bp+si+idata]mov ax,[bp+di+idata]下⾯就是错误的mov ax,[bx+bp]mov ax,[si+di](3)只要在[....]中使⽤寄存器bp,⽽指令汇总没有显⽰给出段地址,段地址就默认在ss中。
汇编语⾔学习笔记之物理地址物理地址CPU访问内在单元时,要给出内存单元的地址。
所有的内存单元构成的存储空间是⼀个⼀维的线性空间,每⼀个内存单元在这个空间中都有惟⼀的地址,我们将这个惟⼀的地址称为物理地址。
CPU通过地址总线送⼊存储器的必须是⼀个内存单元的物理地址。
在CPU向地址总线上发出物理地址之前,必须在内部先形成这个物理地址。
不同的CPU可以有不同的形成物理地址的⽅式。
下⾯讨论8086CPU是如何在内部形成内存单元的物理地址的。
8086CPU16位结构的CPU,具有下⾯⼏⽅⾯的结构特性:运算器⼀次最多可以处理16位的数据;寄存器的最⼤宽度为16位;寄存器和运算器之间的通路为16位。
8086CPU读写内存的过程:1. CPU中的相关部件提供两个16位的地址,⼀个称为段地址,另⼀个称为偏移地址;2. 段地址和偏移地址通过内部总线送⼊⼀个称为地址加法器的部件;3. 地址加法器将两个16位地址合成为⼀个20位的物理地址;4. 地址加法器通过内部总线将20位物理地址送⼊输⼊输出控制电路;5. 输⼊输出控制电路将20位物理地址送上地址总线;6. 20位物理地址被地址总线传送到存储器。
地址加法器采⽤物理地址=段地址*16+偏移地址的⽅法⽤段地址和偏移地址合成物理地址。
CPU可以⽤不同的段地址和偏移地址形成同⼀个物理地址。
例如:CPU要访问21F60H单元,则它给出的段地址SA和偏移地址EA满⾜SA*16+EA=21F60H即可。
如果给定⼀个段地址,仅通过变化偏移地址来进⾏寻址,最多可定位多少内存单元?偏移地址16位,变化范围为0~FFFFH,仅⽤偏移地址来寻址最多可寻64KB个内存单元。
⽐如给定段地址1000H,⽤偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。
“数据在21F60H内存单元中”对于8086CPU的意思是:数据存在内存2000:1F60单元中;或者,数据存在内存的2000段中的1F60单元中。
汇编语言学习笔记《汇编语言》--王爽前言学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。
原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。
第一章基础知识有三类指令组成汇编语言:汇编指令;伪指令;其他符号。
8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。
1.1节--1.10节小结(1)汇编指令是机器指令的助记符,同机器指令一一对应。
(2)每一种cpu都有自己的汇编指令集。
(3)cpu可以直接使用的信息在存储器中存放。
(4)在存储器中指令和数据没有任何区别,都是二进制信息。
(5)存储单元从零开始顺序编号。
(6)一个存储单元可以存储8个bit,即八位二进制数。
(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。
也可以说,这些管脚引出总线。
一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。
地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。
监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.内存地址空间:最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。
对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制。
这个逻辑存储器即是我们所说的内存地址空间。
第二章寄存器(cpu的工作原理)mov ax, 2add ax, axadd ax, axadd ax, ax(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;(3)地址加法器将两个16位地址合成为一个20位的物理地址;(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;(6)20位物理地址被地址总线传送到存储器;段地址*16+偏移地址= 物理地址的本质含义内存并没有分段,段的划分来自cpu。
第二章寻址方式在8086微处理器中,一条指令通常由操作码加上操作数构成。
指令形式为:操作码[操作数1], [操作数2]; 注释其中,操作码指明执行的动作,操作数指明操作的对象。
由于寄存器数量有限,操作数不可能都放在寄存器中,实际上,操作数既可以放在寄存器中,也可以放在主存贮器中,这样就涉及到操作数的寻址问题。
我们将寻址操作数存放地址的方式称为寻址方式。
本章的内容包括:主存储器和物理地址的形成寻址方式常量与变量的定义2.1 主存贮器和物理地址的形成一、主存贮器计算机存贮系统分为:主存贮器(内存)、辅助存贮器(外存)。
●主存容量小、存取速度快、价格高;●辅存容量大、存取速度慢、价格低。
主存贮器的基本存贮单位是“位”(bit ),每8位组合成一个“字节”;每相邻的两个字节称为“字”;相邻的四个字节称为“双字”。
为了区别各个存贮单元,给每个单元编号,称为地址。
地址:字节单元的编号,也称为物理地址。
低字节放低位,高字节放高位。
例如:0004单元存放内容为1234H 。
0 10FFFFFH 低地址 高地址 从0~0FFFFFH ,共有220个单元,20根地址线。
表示:(0004)字=1234H二、存储器物理地址的形成早期的8086微处理器,有20根地址线,寻址范围2^20 = 1M 字节。
但是,8086内部为16位结构,与地址相关的寄存器均为16位,从而导致可寻址范围为64K。
因此,设计成为将主存分段使用,每段最大为64K字节。
用CS、DS、SS、ES保存当前可用段的段首地址。
规定:段首地址只能从任一“小段”的首地址开始,也就是必须最低4位为0,如果所有的段首地址都是这样,则可以忽略最低4位,而只将高16位放到段寄存器中。
因此,计算物理地址时,应将段寄存器内容左移4位,恢复段首址原值,然后再与本段中待访问单元的偏移地址相加,得到访问单元的物理地址。
因此,被访问单元物理地址PA = 段首址*16+偏移地址。
汇编语⾔考试复习资料汇编语⾔期末复习资料整理第⼆章1、寄存器组(1)通⽤寄存器数据寄存器EAX(32位) AX(16位) AH(8位)(⾼位) AL(8位)(低位)累加器EBX(32位) BX(16位) BH(8位)(⾼位) BL(8位)(低位)基址变址ECX(32位) CX(16位) CH(8位)(⾼位)CL(8位)(低位)计数器EDX(32位) DX(16位) DH(8位)(⾼位) DL(8位)(低位)数据指针或变址寄存器ESP(32位) SP(16位)堆栈指针寄存器EBP(32位) BP(16位)基址指针寄存器EDI(32位) DI(16位)⽬的变址寄存器ESI(32位) SI(16位)源变址寄存器(2)专⽤寄存器EIP(32位) IP(16位)指令指针寄存器EFLAGS(32位) FLAGS(16位)标志寄存器ESP (32位) SP(16位)堆栈指针寄存器2、标志位的符号表⽰、3、段寄存器CS(16位)代码段 DS(16位)数据段SS(16位)堆栈段 ES(16位)附加段4、段寄存器和相应存放偏移地址的寄存器之间的默认组合第三章1、七种寻址⽅式(举例)⽴即寻 MOV AX,3069H寄存器寻 MOV AL,BH在内存中的五种寻址直接寻 MOV AX,[2000H]寄存器间接寻 MOV AX,[BX]寄存器相对寻 MOV AX,COUNT[SI] 或者 MOV AX,[SI+COUNT](不推荐) 基址变址寻址 MOV AX,[BP][DI]相对基址变址寻址 MOV AX,MASK[BX][SI]2、指令系统I.数据传送指令(1)通⽤数据传送指令MOV 传送MOVSX 带符号扩展传送⽤源操作数的符号位来填充⽬的操作数的⾼位数据位。
例:MOVSX EAX,CL把CL寄存器中的8位数,符号扩展为32位数,送到EAX寄存器中。
MOVZX 带零扩展传送恒⽤0来填充⽬的操作数的⾼位数据位例:MOVZX DX,AL把AL寄存器中的8位数,零扩展成16位数,送到DX寄存器中。