首页 汇编语言入门-高手经验

汇编语言入门-高手经验

举报
开通vip

汇编语言入门-高手经验汇编语言入门-高手经验 汇编语言入门 三大类语言——汇编语言系列 汇编语言,总给人一中乱七八糟的东西整到一起,然后就出来了。事实上,汇编语言和此 还真有点儿相像。 那什么是汇编语言呢, 计算机的编程语言经历了三大过程: 一、机器语言 计算机说白了就是对电信号的处理,计算机的电信号就是高电位和低电位两种,就是通和 断。我们把通记作 1,断记作 0。所以,有人说计算机脑子笨,只会数到 1。事实上,这已 经足够了。最开始的编程可不像现在这么轻松。1001010101010000110 就可能是一段指令(就...

汇编语言入门-高手经验
汇编语言入门-高手经验 汇编语言入门 三大类语言——汇编语言系列 汇编语言,总给人一中乱七八糟的东西整到一起,然后就出来了。事实上,汇编语言和此 还真有点儿相像。 那什么是汇编语言呢, 计算机的编程语言经历了三大过程: 一、机器语言 计算机说白了就是对电信号的处理,计算机的电信号就是高电位和低电位两种,就是通和 断。我们把通记作 1,断记作 0。所以,有人说计算机脑子笨,只会数到 1。事实上,这已 经足够了。最开始的编程可不像现在这么轻松。1001010101010000110 就可能是一段指令(就 是命令 CPU 做一个事情的最基本单元),但是,这实在是太费劲了。计算机读得懂,可人 读不懂啊~ 我真怀疑前辈是怎么熬过来的。 二、汇编语言 不知道那位天才的主意,他把这些难懂的计算机指令转换为通俗易懂的 英语 关于好奇心的名言警句英语高中英语词汇下载高中英语词汇 下载英语衡水体下载小学英语关于形容词和副词的题 单词简写。比 如说用的最多的 10 指令,它的作用就是把数据挪来挪去的,所以和英语单词 move 的意思 。这样,每个难懂的计算机指令都转换成为了指令 差不多,干脆,把它替换成 MOV 吧 助记符(确实挺好记忆的)。然后,再由汇编器将汇编源代码翻译成机器语言。最开始的翻 。现在的汇编器功能越来越全,以至于兼容了高级语言的语法, 译就是一就是 1,二就是 2 各种语法格式的汇编层出不穷,但是,最低级(这只是相对底层的说法)的还是 Intel 语法。 三、高级语言 虽然汇编语言令人轻松了不少,不过还是不接近人的思维。所以,高级语言又诞生了。比 较有名的高级语言,比如 C 语言,就兼有高级低级两大特征。既有符合人类的思维方式, 又可以和汇编语言进行轻松的转换,汇编味道还是很浓的。编译 C 语言有这么几个步骤:1、 使用 C 编译器编译成汇编语言格式;2、使用汇编器编译成二进制可执行程序格式。所以, C 语言一直是编写操作系统的首选语言(和汇编并列)。像 VB 这样的语言,就没有汇编味 道了。 ): 举个例子,下面是 C 语言的代码(我相信你学过 C 语言,如果没有学过,以后学吧 if(!a) return; //如果 a 等于 0,就返回,否则 a=1 a=1; 可以直接转化为汇编语言: cmp ax, 0 ;AX 中是数据 a jnz nequ_zero ;如果不等于 0 就调到 nequ_zero ret ;返回,相当于 return nequ_zero: mov ax, 1 ;ax 为 1 怎么样,C 语言是不是兼容高低两种风格, 我们已经初步地接触了一下汇编语言,感觉怎么样,看不懂, 没关系,我们刚刚接触 它,还什么都没有学呢。大家只是先有一个感性的认识。好了,先写道这里吧~ CPU的寄存器——汇编语言入门 为什么不直接讲汇编语言,而先讲 CPU 寄存器呢,因为,汇编指令对它们的操作是最 频繁的,如果不知道它们是干什么的话,怎么能学会汇编语言呢, 我们知道,数据交换方面,CPU 内部数据交换最快,其次是内存,最慢的是什么光驱 软驱硬盘什么的。在 CPU 中,就有一个个的小单元,用来暂时储存一些数据,就好像车站 的寄存处一样,所以,它们有一个名称,叫 CPU 寄存器(简称寄存器)。这些寄存器都是: 4 个 16 位数据寄存器,2 个 16 位指针寄存器,2 个 16 位变址寄存器,2 个 16 位控制寄存器, 4 个 16 位段寄存器。 一、通用寄存器:数据寄存器、指针寄存器、变址寄存器的总称。这些寄存器除了各 自的用途外,都可以暂时存储数据、内存地址和运算结果。 1、数据寄存器:数据寄存器指 AX、BX、CX 和 DX。这里的 AH 是 AX 的高字节, AL 是 AX 的低字节(High 和 Low),其他的数据寄存器同理。这些数据寄存器的用途稍微 有一点不同。 1)AX(Accumulator)寄存器,又叫累加器。用来存储乘法结果和除法结果,I/O 数据。 也可以用来做它用。同时,也通常进行加减法,所以叫做累加器。AX 寄存器的使用频率最 高,用途很广。 2)BX(Base)寄存器,又叫基地址寄存器(基址寄存器),用来存储内存地址。这 是数据寄存器中唯一可用于存储器指针的寄存器。 3)CX(Counter)寄存器,又叫计数器。用来控制循环的次数。 4)DX(Data)寄存器,又叫数据寄存器,进行 32 位除法时,用来存放被除数的高 16 位和余数。也用作 I/O 端口地址。 2、指针寄存器和变址存储器:是指 BP、SP、DI 和 SI,用来存储在段中的偏移地址(首 次接触偏移地址,可能不太明白,不要紧,后面会讲的),我们把内存想象成一条街道,这 条街道分成一部分一部分的(段),每部分的每家每户都有一个相对于这个部分开头的地址 (偏移地址),比如你在平安街,平安街分为西平安街和东平安街,你家住在西平安街(段 地址)31 号(偏移地址)。 1)BP(Base)寄存器,又叫基地址指针寄存器。用来存储在段中的偏移地址。 2)SP(Stack)寄存器,又叫堆栈指针寄存器。这个寄存器有些特殊,因为它和堆栈 紧紧相关。什么是堆栈呢,请看后面的段寄存器。 3)DI 和 SI 寄存器,又叫目的地址寄存器和源地址寄存器。用来进行串操作。说一下 串操作,假设把内存中一串连续的数据从这里挪到那里,怎么办,能够想到的是,把这一串 连续的数据中第一个数据在内存中的地址(源地址)移到一个寄存器中(比如 SI),然后 把要到的地方在内存中的地址(目的地址)移到另一个寄存器中(比如 DI)。然后把 SI 所 指的数据挪到 AX,再把 AX 中的数据挪到 DI 所指的地方。让 SI 和 DI 指向下一个数据。 这种操作叫做串操作,就是把一串连续的数据挪到另一个连续的内存处。 二、控制寄存器,这些寄存器比较特殊,不能够存储数据。 1、IP 寄存器,指向当前运行到的代码的内存偏移地址。 开始的时候,IP 指向内存中的一个指令。然后,CPU 根据 IP 中的内存地址,把这个指 令读取进来,并执行。同时,IP 指向下面的一个指令,就回到了步骤 1,这样不断地执行下 去,就是一步一步的。排除有指令缓存的情况。 2、标志寄存器: 有些指令会影响标志,有些指令不会影响标志,而有些指令受标志影响,有些指令不 受标志影响。这些标志可以分为两组,一组主要受加减乘除运算影响,成为运算结果标志, 另一些成为控制状态标志。 运算结果标志: 1)CF(Carry):进位标志,反应运算是否有进位和借位,有则为 1,没有为 0。有时作 函数的出口参数。 2)ZF(Zero):零标志,运算结果为 0 则置位为 1,运算结果不为零则复位为 0。 3)SF(Sign):符号标志,反应运算结果的符号位。SF 于运算结果的最高位(即符号位) 相同。在 80x86 中,有符号数采用补码的形式表示,所以 SF 反映了运算结果的符号。如果 运算结果为正,则 SF 为 0,否则为 1 4)OF(Overflow):溢出标志,用于反应有符号数运算是否引起溢出。如果运算结果超 出了 8 位或 16 位有符号数的表示范围,即在字节运算时大于 127 或小于-128,字运算时大 于 32767 或小于-32768,称为溢出,则 OF 被置 1。 5)PF(Parity):奇偶标志,用于反应运算结果中“1”的个数,如果,“1”的个数为偶数, 则 PF 置 1,否则清 0。 6)AF(Auxiliary Carry):辅助进位标志:在字节操作时,如发生低半字节向高半字节 进位或借位;在字操作时,如发生低字节向高字节进位或借位,则 AF 被置 1,否则清 0。 2、状态控制标志 1)DF(Direction)方向标志,当 DF 为 1 时,串操作指令按递减方式改变有关存储器指针 值;当 DF 为 0 时,串操作指令按递加方式改变有关寄存器值。设置 DF 方向为的指令为 STD(Set Deriction),清除指令为 CLD(Clean Direction) 2)IF(Interrupt)中断标志,当 IF 为 1 时,允许可屏蔽中断产生,当 IF 为 0 时,屏蔽任何 可屏蔽中断。设置 IF 为 1 的指令是 STI(Set Interrupt),设置 IF 为 0 的是 CLI(Clean Interrupt)。 3)TF(Trap)追踪标志,当 TF 被置位 1 后,CPU 进入单步方式。所谓单步方式,就是执 行一条指令就产生一个单步中断,用于程序的调试。 三、段寄存器。这里应用了分段机制,80x86 把一兆的内存(16 位模式下只支持一兆) 分为一个个的段,每个段寄存器就存储相应的段基地址。CS(Code Segment)代码段基址寄存 器;DS(Data Segment)数据段基址寄存器;ES(Extra Segment)附加断寄存器;SS(Stack Segment) 堆栈段寄存器。 至于分段机制的具体内容,将在以后的文章中介绍。 内存寻址和分段机制——汇编语言入门 上一篇文章介绍了 CPU 的寄存器,不知道大家留意到没有,这几个寄存器有一些特殊, SI/DI/SP/BP,这几个寄存器都有指针这个词,那什么是指针呢,CS/DS/ES/SS 叫做段寄存器, 什么又是段呢,为什么要出现分段机制, 一、什么是指针 内存,如果安装编程的眼光看的话,就是一连续的存储空间,这里,最小的存储空间 是位(这个概念不用解释吧 ),但是,位实在是太小了,所以,内存空间被分为 1 字节 1 字节的,也就是把 1 字节作为一个单位。如果我们把内存空间比作一条街的话,这每一个 单位就是一个楼。可是,我如何知道我需要的是哪个楼呢,我们知道,要找某一号楼的话, 一般说这是 XX 街 64 号楼,这叫地址。内存中每个单位也有一个地址,叫内存地址。内存 )什么 地址是从 0 开始计数的。内存中第一个字节的内存地址是 0x0000(这是十六进制 是十六进制,我就不再说明了。第二个字节的内存地址是 0x0001。存储这些内存地址的寄 存器就叫指针寄存器,指针,就是指着这一个内存单元的“针”,说白了就是一个内存地址。 二、什么是分段机制 位的 PC 机上,内存寻址最远的是 0xFFFF(1111111111111111),这是 我们知道,16 靠单一十六位寻址的最大范围了。但这实际上并不大,才能寻址到 64KB 的地方,这实在是 太小了。(怎么算的 64KB )使用 Windows 自带的计算器,调整到科学型,选择[十六进 制],输入 FFFF,然后加 1,因为内存地址是从 0 算起的,得出的就是寻址的最远处,这时 的数是 10000,表示最远到 0x10000 字节处,不够直观,必须除以 400(十六进制的),(我 们知道,KB 到 B 的换算是 1024,十六进制的表示就是 400)得到 40(还是十六进制的), 再选择十进制,就是 64,也就是 64KB。 确实太小了,怎么办呢,于是引入了段的概念,一个内存地址就由“段基址:段内偏移 地址”表示。段基址,就是这个段的起始地址;段内偏移地址,就是距段基址的距离。这样, 段内偏移地址最大是 0xFFFF,所以,一个段的最大长度是 64KB。那怎么把这个内存地址 换算成最基本的内存地址呢,规则是这样的: 实际内存地址,段基址×0x10,段内偏移地址 我们看一看,段基址最大是 0xFFFF,段内偏移地址最大是 0xFFFF,所以有: 0xFFFF×0x10,0xFFFF,0xFFFF0,0xFFFF,0x10FFEF 大约是 1M,这可比 64KB 大多了。 那么,一个内存地址就有两种表示 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 了:0:0x1000=0x100:0 也就是说,段基址是 0x0,段内偏移地址是 0x1000,和段基址是 0x100,段内偏移地址 是 0x0 所指向的内存地址相同,不信你算一算。 你也许就知道了,CS/DS/ES/SS 段寄存器存储的就是段基址。那么我们就可以用 DS:0x0002 得到数据段中偏移地址为 0x0002 的数据。 这四个段寄存器是各有分工的。在取指令时,自动把 CS×0x10,IP 得出要取的指令。 在进行堆栈操作时,自动把 SS×0x10,SP 得到栈顶指针。在进行普通数据操作时,自动把 DS 或 ES 乘以 0x10,相应的偏移地址。所以,正常情况下,段基址可以省略。 三、“高高低低”原则 16 位是 2 个字节,是 1 个字。一个字在内存中占用 2 个字节。规定:一个字存放到内 存中时,低字节存放在地址较低的字节单元中,高字节存放在地址较高的字节单元中。 所以,0x1234 存储中看起来像 0x3412。 考考你 :0x12345678 在内存中是怎么存储的, 四、内存寻址 既然要学习内存寻址,最好先了解一个最基本最常用的指令: mov 目的操作数,源操作数 这个指令就是把源操作数挪到目的操作数中。 1、立即寻址 立即寻址就是操作数就在指令中,是指令的一部分,存放在代码段中,这个操作数叫 做立即数。立即数可以是 8 位的也可以是 16 位的。但是,16 位的立即数要按照“高高低低” 原则存储,即高位存放在高地址处,低位存放在低地址处。 例如指令:mov ax, 1234h 意思就是把 0x1234 挪到 ax 寄存器中。十六进制 0x1234 在指令中表示为 1234h。 2、寄存器寻址 操作数就在 CPU 的寄存器中,指令中指定寄存器号。对于 16 位操作数,寄存器可以 使 ax,bx,cx,dx,si,di,sp 和 bp,对于 8 位操作数,寄存器可以使用 ah,al,bh,bl,ch,cl,dh,dl。 例如,指令“mov bx,ax”和指令“mov ch,dl”中的源操作数和目的操作数都是寄存器寻址。 由于操作数在寄存器中,不需要访问存储器,所以这种寻址方法的指令执行速度较快。 3、直接寻址 操作数在内存中,指令直接包含操作数的有效地址。操作数一般存放在数据段中,所 以操作数的地址由 DS 加上指令中的 16 位段内偏移地址得到。如果要访问其他的段中的数 据,就要采用段超越前缀,即指定基地址寄存器不是 DS 的其他寄存器(CS,ES,SS), 所以操作数可以不在数据段。 假设,DS 的内容是 0x1000,在段内偏移地址为 0x1234 的字存储单元中的内容是 0x6789, 那么执行指令“mov ax,[1234h]”把 ds 段内的段偏移地址为 0x1234 中的字单元中的数据存放 在 ax 中。这里的“[]”表示里面的数据是偏移地址。 下面的指令中的目的操作数采用了直接寻址,并使用了段超越前缀: mov [es:1234h], al 它可以在整个 64k 段中寻找操作数。直接寻址的操作数通常是程序使用的变量。 直接寻址的地址要放在方括号[]中。在源程序中,往往使用变量名表示。 4、寄存器间接寻址 操作数在内存中,操作数有效地址在 si,di,bx,bp 这四个寄存器之一中。一般情况下(即 不使用段超越前缀),如果有效地址在 si,di,bx 中,则使用 ds 段寄存器中的数据为段基址; 如果有效地址在 bp 中,则使用 ss 段寄存器、 例如:mov ax,[bx] 因为操作数在 bx 中,默认使用 ds 段寄存器。假设 ds 中的数据是 0x1000,bx 中的数 据是 0x1234,那么实际物理地址就是 0x11234,假设这个字存储单元中的数据是 0x5678, 则执行指令之后,ax 中的数据为 0x5678。 使用段超越前缀:mov dh, es:[si] 这里,使用的段寄存器不再是 ds,而是 es。 使用段寄存器 ss:mov [bp], cx 注意:寄存器名一定要放在方括号中。 mov [si], ax ;目的操作数寄存器间接寻址 mov si, ax ;目的操作数立即寻址(看看前面的) 5、寄存器相对寻址 这种寻址就稍微有点复杂 。 操作数在内存中,操作数的有效地址是一个基址寄存器(bx,bp)或变址寄存器(si, di)的内容加上指令中给定的 8 位或 16 位的位移量(就是偏移量)之和。 还是同样的道理, si,di,bx 引用 ds 段寄存器,bp 引用 ss 段寄存器。比较难懂啊,举 个例子就明白了: mov ax, [si+1234h] 假设 ds 为 0x1000,si 为 0x1111,则实际物理地址为 0x1000×0x10,0x1111,0x1234 ,0x12345,如果 0x12345 中存储的字数据为 0xffff,那么执行指令后 ax 中为 0xffff。 6、基址加变址寻址 操作数还是在内存中,操作数的有效地址是由基址寄存器之一的内容加变址寄存器之 一的内容相加得到的。 这好像不用说明了吧。还是同样的道理,si,di,bx 引用 ds 段寄存器,bp 引用 ss 段寄存 器。这句话都说烦了。 例子:mov ax,[bx+di] 假设:ds=0x1000,bx=0x1234,di=0x12 那么实际物理地址为 0x11246,假设字数据为 0x115,那么执行后,ax 中的数据为 0x115。 下面两种方法是等价的: mov ax, [bx+di] mov ax, [bx][di] 7、相对基址加变址寻址 这个称呼真别扭,听着就吓唬人 。事实上,一点儿也难。就是在基址加变址寻址的 基础上加上位移量。有点像寄存器相对寻址,不信往前看看。引用什么段寄存器我就不用说 ) 了(如果你还不知道…… 举例:mov ax, [bx+di-2] 假设:ds=0x1111, bx=0x1234, di=0x4214 0x8847。 那么实际物理地址为 0x16556,假设字数据为 0x8847,那么执行后 ax 为 尽管相对基址加变址寻址最复杂,却是最灵活的。下面四个表示方法均是等价的: mov ax, [bx+di+1234h] mov ax, 1234h[bx+di] mov ax, 1234h[bx][di] mov ax, 1234h[di][bx] 如果你留心的话,会发现 bp 指针寄存器引用的段寄存器始终默认是 ss 段寄存器。ss 段寄存器就是堆栈段寄存器。什么是堆栈段呢,等待…… 什么是堆栈——汇编语言入门 我们所接触到的段寄存器有四种:CS、DS、ES、SS,CS 段是代码段,当然是存放代 码的段了。DS 和 ES 是存放数据的段。这个 SS 是堆栈段,什么是堆栈呢,堆栈又有什么用 呢, 一、什么是堆栈 堆栈是一种线性表( 就是像一条线一样存储的序列),堆栈是一种限制的线性表。 堆栈只允许在一端进行插入和删除。允许插入和删除的一端称为栈顶(top),另一端称为 栈底(button)。堆栈的插入叫做入栈,删除叫做出栈。根据堆栈的特点可知,最先入栈的 总是最后出栈的,最后出栈的总是最先出栈的 。 ss 段寄存器存储的是堆栈段的基地址,sp 则存储堆栈段的栈顶。 注意~堆栈是向低地址生长的 。 为什么说栈底并不存在,假设现在 sp 指向栈底 0x1003,如果再出栈(弹出一字节)的 话,sp 就会指向 0x1004,这也可以。 二、堆栈操作 堆栈操作使用了两个指令:push 入栈、pop 出栈 1、push 操作数 将 sp 指向前一个字单元(或字节单元),并把操作数放在 sp 所指的字单元(或字节 单元)中。 2、pop 操作数 将 sp 所指的字单元(或字节单元)中的数据放到操作数中,这时的操作数不能是立即 数,只能是寄存器或内存地址,然后让 sp 指向下一个字单元(或字节单元)。 当然,也可以使用 mov 指令把 sp 所指向的数据挪到目的操作数中,只不过不改变 sp 的值。 现在假设堆栈为(b)的情况,sp 指向 0x1004,再假设 0x1002 中存储的数据为 0x5555。 问题:mov ax, [sp+2]之后,ax 中的数据是什么,mov ax,[sp-2]之后,ax 中的数据是什么, sp+2 指向 0x1006(0x1004+0x2),所以 ax 中的数据是 0x1234,同理 sp-2 指向 0x1002, 所以 ax 中的数据为 0x5555。 三、堆栈的作用 这里只是简单的说明一下: 1、调用函数 2、暂时存储数据 3、保护寄存器数据 调用函数必然会有 ip 寄存器的变化,有时还需要存储参数,所以用到堆栈。有时为了 保护一些暂时数据,使用堆栈无疑再好不过。为了防止函数改变寄存器的值,可以在进入函 数时把寄存器入栈,离开函数时把寄存器出栈。 四、进出堆栈的顺序 切忌:先进后出,先出后进。 比如,要在某段指令前把 ax 和 bx 寄存器的值保护起来,就是压入堆栈,在这段指令 之后再把它们恢复,看看下面的指令哪个对, (a) push ax push bx ..... pop ax pop bx (b) push ax push bx ..... pop bx pop ax (a)是错的,因为先进后出,ax 先入栈,应该最后出栈,而(a)执行后,ax 和 bx 的数据就会颠倒。bx 后入栈,应该出栈,却存到了 ax 中,ax 先入栈,应该后出栈,却存到 了 bx 中。 事实上,使用这种方法交换两个寄存器的值也不是不行: push ax push bx pop ax pop bx 不过还有更好的方法,以后学习。 基本汇编指令知识——汇编语言入门 经过前面几篇文章的学习,基本了解了汇编语言的基础知识。下面,我们就要开始正 式地接触汇编语言了。 首先,我们要了解汇编指令。 一、汇编语言指令分类 汇编语言的指令分为汇编指令、伪指令和宏指令。 汇编指令就是可以被汇编器直接翻译成二进制指令的指令。比如说我们最熟悉的指令 mov,他就能够被直接翻译成二进制指令。 伪指令不能够被翻译成二进制指令,它像一个指挥员,指挥汇编编译器如何进行汇编, 比如说各个段的指定,在数据段中初始化一个数据…… 宏指令以后再说罢。 二、汇编语言指令格式 [标号:] 指令 [;注释] 注:[]括起来的是可省略的。 这是一条完整的汇编指令。标号代表这个指令的偏移地址,我们可以在其他指令中使 用这个标号来代表这个偏移地址。指令就是要执行的指令,注释就是对这个指令的注解,在 编译的时候注释就被全部删掉了,所以不会影响到最后的编译程序。 MOVEDATA: mov ax, 1 ;把 1 挪到 ax 寄存器中 …… mov bx, MOVEDATA ;把 MOVEDATA 标号处的便宜地址挪到 bx 寄存器中, ;相当于把 MOVEDATA 后面的指令的偏移地址挪到 ;bx 中,我们不知道这个指令的偏移地址是什么。 伪指令的指令结构和指令语句一样,只不过标号后面的冒号省略。 [标号] 指令 [;注释] 三、指令语句分类 指令语句根据它们的作用分为以下类型: 指令类型 举例 数据传送指令 mov 堆栈操作指令 push,pop 标志操作指令 lahf 数学运算指令 add,div 逻辑运算指令 and,or,xor 位移指令 sal,shl 转移指令 jmp 串操作指令 rep 从下一篇开始,就要正式进入指令学习阶段了。Have a good time! 数据传送指令——汇编语言入门 1.传送指令 mov 目的操作数,源操作数 把源操作数指定的数据传送到目的操作数中去。源操作数和目的操作数可以是寄存器 和内存地址(包括标号),源操作数还可以是立即数,目的操作数不可以。 mov ax, 0x1024 mov ax, [si] mov ax, [bp+2] mov ax, THATDATA 2.交换指令 xchg 操作数 1,操作数 2 把操作数 1 中的数据传送到操作数 2 中,把操作数 2 中的数据传送到操作数 1 中。操 作数可以是寄存器和内存地址(包括标号),但不可以是立即数。 xchg bx, ax ;把 ax 和 bx 中的数据互换 3.端口操作指令 in 累加器, 端口地址 out 端口地址,累加器 当端口地址小于 256 时,可采用直接寻址方式,在指令中指定端口地址。如果端口地 址大于等于 256 时,就要使用间接寻址方式,先将端口地址存放在 dx 中,然后操作。 in ax, 0x11f out 0x13, ax mov dx, 0x1242 out dx, ax 4.取地址指令 lea 目的操作数, 源操作数 功能是取有效地址。源操作数必须是一个内存地址(或者标号),目的操作数必须是 一个 16 位通用寄存器(8 位的不行)。此指令将源操作数的地址偏移量送到目的操作数中。 lea bx, 0x1242 lea ax, 0x1246[bx][si] 5.32 位传送指令 lds 通用寄存器,源操作数 将源操作数指定的 4 字节 32 位数据的高 16 位送入 DS 段寄存器中,低 16 位送到指定 的通用寄存器中。 lds di, [bx] 6.32 位地址传送指令 les 通用寄存器, 源操作数 将源操作数指定的连续四个存储单元中存放的 32 位内存地址指针(一个段地址和一个 偏移地址),传送到指定的通用寄存器和段寄存器 ES 中。 les si, [bx][di] 堆栈指令和标志指令——汇编语言入门 1.入栈指令 push 操作数 把操作数放入堆栈中,操作数可以是立即数、寄存器、内存地址(或者标号)。 push 0x121 push ax push [si] 2.出栈操作 pop 操作数 把堆栈顶的数据弹出堆栈,放到操作数中,操作数不能是立即数。 pop ax pop bx 3.标志入栈操作 pushf 将标志寄存器入栈。 4.标志出栈操作 popf 把堆栈顶的数据弹出到标志寄存器中。 5.读取标志指令 lahf 把标志的低八位送入 ah 寄存器中。 6.设置标志指令 sahf 把 ah 寄存器中的数据送入标志的低八位中。 加减算术运算指令——汇编语言入门 1.加法指令 add 目的操作数,源操作数 源操作数和目的操作数相加,结果送目的操作数,并且影响标志位。 add ax, 1234h add cx, ax add BUF, ax add BUF, 14h 2.带进位加法指令 adc 目的操作数, 源操作数 带进位加法指令,用于多字节加法运算。两个操作数相加时,还要加上进位标志 CF 位的数据已经存放在 ax(高 16 位)和 dx 的当前值,结果送目的操作数。例如,有一个 32 (低 16 位)中,现要加上一个常数 0x123456: add dx, 3456h ;存放数据低 16 位的寄存器 dx 和常数的低 16 位相加, ;如果有进位则 CF 置位 1。 adc ax, 12h ;存放数据高 16 位的寄存器 ax 和常数的高 16 位相加。 3.自加运算 inc 操作数 把操作数加一后存放在操作数中。常用在循环结构中。 inc ax 4.BCD 码加法调整 daa aaa 用于对 BCD 码加法的调整指令,要调整的结果存放在 al 中。DAA 指令用于对组合 BCD 码相加的结果调整,AAA 对非组合的 BCD 码调整。 mov al, 06h ;al=0x06 add al, 18h ;al=0x1e,即 30 aaa ;al=24 5.减法指令 sub 目的操作数,源操作数 完成两个操作数的相减,结果在目的操作数中,影响标志位。 sub bx, ax sub [si+2], cl 6.带借位减法 sbb 目的操作数,源操作数 用于多字节减法指令,两操作数相减时,还要减去借位标志 CF。比如,32 位的数据高 16 位存放在 ax 中,低 16 位存放在 dx 中,现要减去 0x123456: sub dx, 3456h sbb ax, 12h 7.自减指令 dec 操作数 操作数减 1,结果存放在操作数中。 dec cx 8.取反指令 neg 操作数 用来对有符号数进行操作。用 0 减去操作数,结果存操作数中。 9.比较指令 cmp 操作数 1,操作数 2 CMP 的指令是把两数相减,只影响标志位,但结果不送操作数 1。用来比较两数的大 小。 当操作数 1 大于操作数 2 时,结果大于 0,无借位,CF,0,ZF,0 当操作数 1 等于操作数 2 时,结果等于 0,无借位,CF,0,ZF,1 当操作数 1 小于操作数 2 时,结果小于 0,有借位,CF,1,ZF,0 10.BCD 码减法调整指令 das aas 调整的结果在 al 中,das 对组合 bcd 码相减的结果调整,aas 对非组合的 BCD 码调整。
本文档为【汇编语言入门-高手经验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_686908
暂无简介~
格式:doc
大小:195KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-10-19
浏览量:31