文档库 最新最全的文档下载
当前位置:文档库 › 汇编指令二进制代码手册

汇编指令二进制代码手册

汇编指令二进制代码手册
汇编指令二进制代码手册

汇编指令与二进制代码对应手册

汇编指令与二进制代码具有一一对应关系,也就是说,一条汇编指令必将唯一对应一条二进制代码指令,而一条二进制代码指令也唯一对应一条汇编指令,这就为写一个汇编语言与二进制指令相互对应的参考表成为可能。

手册的使用范围

本手册的读者需要据有一定的计算机专业知识,了解CPU的工作原理及内部的体系结构,熟悉IBM汇编、NASM或其它汇编语言,并且对汇编语言指令的二进制代码有足够的兴趣。本手册列出了绝大部分的中文汇编指令与二进制指令的对应关系,及相应的英文汇编指令名称。由于作者水平有限,而且本手册主要是对照NASM汇编语言指令集、《Intel 微处理器结构、编程与接口》中文第六版及其Intel公司公布的《IA-32 Intel Architecture Software Developer’s Manual》2001年版的PDF 格式文档指令集而生成的,或许有一些比较新的指令或者其他CPU特有的指令,并未收集在本手册中。

汇编指令解析

一、操作码汇编指令按其功能可分为:一般指令、浮点指令、多媒体指令和SIMD流式扩展(SSE)指令。汇编指令因其繁多且对应的二进制代码有多种变化而变得异常复杂,二进制代码的指令都是由操作码与操作数构成,就指令与操作数的关系而言,指令无非是无操作数、单操作数、双操作数和三操作数。所谓的操作码就是唯一代表着指令的意义的一段二进制码,操作码可以是单字节或者是双字节。有一种特殊的操作码,它与操作数合起来共用一个字节或者两个字节,这种操作码的操作数都是寄存器,而且寄存器的二进制代码都为这操作码字节的最后三位,在参照表中用“操作数指令”字段表示,如果这个段中的数据为“是”就表示这个操作码是与寄存器操作数共用一个字节或两个字节,否则就不是。从对照表中,我们可以看出,实事上二进制操作码与汇编指令名称并非一一对应,一条汇编指令的名称如:转移指令,它可以对应多个操作码,只有当指令名称与指令操作数合在一起,才与操作码和操作数有一一对应的关系。也就是说同一个指令名称,指令操作数类型不同,对应的二进制操作码也可能不同。操作码在对照表是用“操作码”字段表示。

在操作码字节中通常又有方向位、符号位、操作数大小修饰位值得注意,它们都用一个二进制位来表示,方向位与符号位通常都在操作码的倒数第二位,而操作数修饰位通常在操作码的最后一位。举例说明:如果倒数第二位是方向位,那么如果这一位值为0,那么表示操作数是从左到右,如果是1表示操作数从右到左;如果倒数第二位是表示符号位,那么如果这一位值为0表示操作数是无符号操作数,如果值为1表示操作数为有符号操作数;如果最后一位是修饰操作数位,那么最后一位为0表示操作数是八位操作数,就是字节操作数,最后一位为1表示操作数大小由汇编模式决定,如果是16位汇编就表示是16位操作数,即字操作数,如果是32位汇编就表示是32位操作数,即双字操作数。汇编模式是16位还是32位,由汇编代码决定,在NASM汇编中默认为32位模式,如果代码显示地给出BIT16就表示汇编成16位模式,如果代码显示地给出BIT32就表示汇编成32位模式。汇编模式不同,操作数也不相同,具体请看操作数节中介绍。

二、操作数计算机指令之所以复杂的一个主要原因就是操作数有多种变化,最为简单的指令就是无操作数指令。其中操作数可以是立即数、寄存器和内存地址。通常情况下,操作数含有立即数的指令与不含立即数的指令,指令操作码不同;操作数都为寄存器的,通用寄存器、段寄存器、控制寄存器、调试寄存器和任务寄存器的指令操作码不同;多媒体指令、浮点指令和SIMD指令都有各自的指令系统。最为复杂的变化是当操作数为寄存器或内存的时候,之所以把它们放在一起,是因为它们都由一个叫做模数(MOD)的两位二进制数来决定。

计算机指令是如何分辨多变的操作数的呢?前面提到,如果操作数是立即数,那么就用操作码来区分。当操作数是寄存器或是内存地址时,主要是用一个字节来区分,这个字节的前两位就是模数(MOD),后三位是寄存器的二进制代码,最后三位的值由开始两位的模数来决定具体的类型,如果模数为11那么最后三位就用来表示寄存器。内存地址是用寄存器的值来表示的,有的内存地址带有位移量,于是,当模数为00时字节的最后三位就表示寄存器内的数据是内存地址,并且没有位移量,当模数为01时,字节最后三位表示寄存器内的数据是内存地址,并且在这一字节之后有8位数的位移量,当模数为10时字节后面有16位或32位,是16位还是32位由汇编模式来决定。16位模式常用于实模式,可使用16位寄存器,如AX、BX等,32位常用于保护模式,可使用32位寄存器,如EAX、EBX等。然而,只用一个字节的最后三位来表示内存地址,不可能用来表示众多的寄存器组合,于是模数为00时(没有位移量),就有在16位汇编模式,当nnn=000(nnn表示是用来表示内存的三位二进制数)时,内存地址为DS:[BX+SI],在32位汇编模式时nnn=000,内存地址为DS:[EAX],其它的值请参照后面的对应表。于是,我们知道了,计算机指令是通过模数、寄存器和寄/内三个域来决定操作数的,其实除此之外,还有一种特殊的情况,就是操作数并没有都用到这三个域,而是把第二个域的值设为一个预设值,也就是说,第二个用来表示寄存器的域设成了固定值,而不是可变的寄存器,那么这就出现了只有一个寄存器或是内存地址操作数的变型,其实它是由前一种类型变化得来的。

有三个操作数的指令又是如何的呢?实事上搞明白了上一种变化,三个操作数就很容易了,它只不过是在两个寄存器或内存地址操作数之后再加一个立即数,这种情况同样有一种特例,那就是有两个相同寄存器操作数,和一个立即数,那么在写汇编代码的时候就把这种情况认为是一个寄存器和一个立即数,而实际翻译成二进制代码时要翻译成两个相同的寄存器和一个立即数,它同样是属于三个操作数的情况,IMUL指令就属于这一种特例。

在具体的指令中还有一些例外,比如,一个看上去只有一个操作码,不含操作数的指令,而实际上它有隐含的寄存器作为它的操作数如计数寄存器,或者它的寄存器操作数被指令指定了,而不是可变的,如只使用累加寄存器,这也是比较常见的,这些在对照表中有详细的注明。

三、指令前缀有些指令通过添加前缀来改变默认段或超越指令模式。所谓超越指令模式是指在16位汇编模式时使用了32位的寄存器或者由32位寄存器组成的内存地址,或者在32位汇编模式时使用了16位寄存器或者由16位寄存器组成的

超越前缀表

前缀字节作用

26H ES:段超越前缀

2EH CS:段超越前缀

36H SS:段超越前缀

3EH DS:段超越前缀

64H FS:段超越前缀

65H GS:段超越前缀

2EH 分支未获取前缀(原英文是:Branch not taken,分支暗示前缀--仅用于条件跳转(Jcc)指令)

3EH 分支被获取前缀(原英文是:Branch taken,分支暗示前缀--仅用于条件跳转(Jcc)指令)

66H 对操作数长度的指令模式超越

67H 对内存地址长度的指令模式超越

F0H 锁(LOCK)指令前缀

F2H 不相等重复/不为零重复前缀(REPNE/REPNZ)指令前缀(只适用于字符串操作指令)

F3H 重复(REP)指令前缀(只适用于字符串操作指令)

F3H 相等重复/为零重复前缀(REP/REP)指令前缀(只适用于字符串操作指令)

四、总结通过以上的分析,我们可以总结出计算机指令的结构,由于286以前(含286)的处理器只能识别16位地址指令,且不能识别超越前缀字节,因此,这种16位地址指令的格式又与32位地址,即386以后(含386)的处理器的指令格式有所不同,如下表:

16位

32

*值得注意的是,操作数域中的比例变址只适用于32位寻址方式,且此时jjj/nnn=100 比例变址字节的前两位表示比例因子,后三位表示变址寄存器,最后三位表示基地寄存器,最终得到的地址值是:比例因子*变址+基址,当比例因子为00时乘以1,当比例因子为01是乘以2,当比例因子为10时乘以4,当比例因子为11时乘以8。

其中“带模数的寄存器和寄/内操作数”这一操作数域仅占一个字节,如下表示:

mm jjj jjj/nnn mm是两位模数 jjj是三位表示的寄存器 nnn是三位用寄存器的值来表示的内地地址

当mm=11时 jjj/nnn的值就表示为寄存器,即:11 jjj jjj

当mm=00时 jjj/nnn的值就表示为内存地址,即:00 jjj nnn 且此时“内存位移量”域不取值,没有位移量

当mm=01时 jjj/nnn的值就表示为内存地址,即:01 jjj nnn 且此时“内存位移量”域取8位的位移量

当mm=10时 jjj/nnn的值就表示为内存地址,即:10 jjj nnn 且此时“内存位移量”域取16位或32位的位移量,如果是16位汇编模式则取16位的位移量,如果是32位汇编模式则取32位的位移量。

是否有最后面的立即数操作数则由操作码来决定。

如果汇编代码指定为16位汇编模式,但指令的操作数中使用了32位的寄存器,则就需要在指令前加0x66的超越前缀,如果是使用了32位寄存器的值来表示内存地址,则需要在指令前加0x67的超越前缀,同理,汇编代码指定为32位汇编模式时,在指令的操作数中使用了16位的寄存器,也需要在指令前加0x66的超越前缀,如果是使用了16位寄存器的值来表示内存地址,则需要在指令前加0x67的超越前缀。其每条指令的这两种超越前缀已经在指令对照表中完整给出。

寄存器中文-

注:英文名称有星号“*”的表示作为保留域,实际并没有使用,二进制码有星号“*”表示无需二进制数表示

寻址方式

16位寻址方式时模数mm与内存寻址nnn可能的组合

mm nnn 寻址方式中文表示寻址方式英文表示

00 000 数据段:[基址16+源变址16] DS:[BX+SI]

00 001 数据段:[基址16+目标变址16] DS:[BX+DI]

00 010 堆栈段:[基址指针16+源变址16] SS:[BP+SI]

00 011 堆栈段:[基址指针16+目标变址16] SS:[BP+DI]

00 100 数据段:[源变址16] DS:[SI]

00 101 数据段:[目标变址16] DS:[DI]

00 110 堆栈段:[基址指针16] SS:[BP]

00 111 数据段:[基址16] DS:[BX]

01 000 数据段:[基址16+源变址16+8位符号位移] DS:[BX+SI+sign_disp8]

01 001 数据段:[基址16+目标变址16+8位符号位移] DS:[BX+DI+sign_disp8]

01 010 堆栈段:[基址指针16+源变址16+8位符号位移] SS:[BP+SI+sign_disp8]

01 011 堆栈段:[基址指针16+目标变址16+8位符号位移] SS:[BP+DI+sign_disp8]

01 100 数据段:[源变址16+8位符号位移] DS:[SI+sign_disp8]

01 101 数据段:[目标变址16+8位符号位移] DS:[DI+sign_disp8]

01 110 堆栈段:[基址指针16+8位符号位移] SS:[BP+sign_disp8]

01 111 数据段:[基址16+8位符号位移] DS:[BX+sign_disp8]

10 000 数据段:[基址16+源变址16+16位符号位移] DS:[BX+SI+disp16]

10 001 数据段:[基址16+目标变址16+16位符号位移] DS:[BX+DI+disp16]

10 010 堆栈段:[基址指针16+源变址16+16位符号位移] SS:[BP+SI+disp16]

10 011 堆栈段:[基址指针16+目标变址16+16位符号位移] SS:[BP+DI+disp16]

10 100 数据段:[源变址16+16位符号位移] DS:[SI+disp16]

10 101 数据段:[目标变址16+16位符号位移] DS:[DI+disp16]

10 110 堆栈段:[基址指针16+16位符号位移] SS:[BP+disp16]

10 111 数据段:[基址16+16位符号位移] DS:[BX+disp16]

注意:当处理器执行时,将所有8位符号位移量符号扩展成16位的位移量,如果8位的位移量是00H-7FH(正的),则在位移地址之前扩展成0000H-007FH,如果8位的位移量是80H-FFH(负的),则在位移地址之前扩展成FF80H-FFFFH,因此,这个工作也可由汇编器来完成,在编译时将模数设为10,地址扩展成16的位移量,所以有些汇编程序不使用8位的位移量。

32位寻址方式时模数mm与内存寻址nnn及比例因子字节基址域jjj可能的组合

mm nnn jjj 寻址方式中文表示寻址方式英文表示

00 000 - 数据段:[累加32] DS:[EAX]

00 001 - 数据段:[计数32] DS:[ECX]

00 010 - 数据段:[数据32] DS:[EDX]

00 011 - 数据段:[基址32] DS:[EBX]

00 100 000 数据段:[累加32+比例变址] DS:[EAX+比例变址]

00 100 001 数据段:[计数32+比例变址] DS:[ECX+比例变址]

00 100 010 数据段:[数据32+比例变址] DS:[EDX+比例变址]

00 100 011 数据段:[基址32+比例变址] DS:[EBX+比例变址]

00 100 100 数据段:[堆栈指针32+比例变址] DS:[ESP+比例变址]

00 100 101 数据段:[32位位移量+比例变址] DS:[32位位移量+比例变址]

00 100 110 数据段:[源变址32+比例变址] DS:[源变址32+比例变址]

00 100 111 数据段:[目标变址32+比例变址] DS:[目标变址32+比例变址]

00 101 - 数据段:[32位位移量] DS:[32位位移量]

00 110 - 数据段:[源变址32] DS:[ESI]

00 111 - 数据段:[目标变址32] DS:[EDI]

01 000 - 数据段:[累加32+8位位移量] DS:[EAX+8位位移量]

01 001 - 数据段:[计数32+8位位移量] DS:[ECX+8位位移量]

01 010 - 数据段:[数据32+8位位移量] DS:[EDX+8位位移量]

01 011 - 数据段:[基址32+8位位移量] DS:[EBX+8位位移量]

01 100 000 数据段:[累加32+比例变址+8位位移量] DS:[EAX+比例变址+8位位移量]

01 100 001 数据段:[计数32+比例变址+8位位移量] DS:[ECX+比例变址+8位位移量]

01 100 010 数据段:[数据32+比例变址+8位位移量] DS:[EDX+比例变址+8位位移量]

01 100 011 数据段:[基址32+比例变址+8位位移量] DS:[EBX+比例变址+8位位移量]

01 100 100 堆栈段:[堆栈指针32+比例变址+8位位移量] SS:[ESP+比例变址+8位位移量]

01 100 101 堆栈段:[基址指针32+比例变址+8位位移量] SS:[EBP+比例变址+8位位移量]

01 100 110 数据段:[源变址32+比例变址+8位位移量] DS:[ESI+比例变址+8位位移量]

01 101 - 堆栈段:[基址指针32+8位位移量] SS:[EBP+8位位移量]

01 110 - 数据段:[源变址32+8位位移量] DS:[ESI+8位位移量]

01 111 - 数据段:[目标变址32+8位位移量] DS:[EDI+8位位移量]

10 000 - 数据段:[累加32+32位位移量] DS:[EAX+32位位移量]

10 001 - 数据段:[计数32+32位位移量] DS:[ECX+32位位移量]

10 010 - 数据段:[数据32+32位位移量] DS:[EDX+32位位移量]

10 011 - 数据段:[基址32+32位位移量] DS:[EBX+32位位移量]

10 100 000 数据段:[累加32+比例变址+32位位移量] DS:[EAX+比例变址+32位位移量]

10 100 001 数据段:[计数32+比例变址+32位位移量] DS:[ECX+比例变址+32位位移量]

10 100 010 数据段:[数据32+比例变址+32位位移量] DS:[EDX+比例变址+32位位移量]

10 100 011 数据段:[基址32+比例变址+32位位移量] DS:[EBX+比例变址+32位位移量]

10 100 100 堆栈段:[堆栈指针32+比例变址+32位位移量] SS:[ESP+比例变址+32位位移量]

10 100 101 堆栈段:[基址指针32+比例变址+32位位移量] SS:[EBP+比例变址+32位位移量]

10 100 110 数据段:[源变址32+比例变址+32位位移量] DS:[ESI+比例变址+32位位移量]

10 100 111 数据段:[目标变址32+比例变址+32位位移量] DS:[EDI+比例变址+32位位移量]

10 101 - 堆栈段:[基址指针32+32位位移量] SS:[EBP+32位位移量]

10 110 - 数据段:[源变址32+32位位移量] DS:[ESI+32位位移量]

10 111 - 数据段:[目标变址32+32位位移量] DS:[EDI+32位位移量]

指令代码对照表说明

一、字段说明

指令内码是中文汇编语言程序使用的指令内部代码,它是一个以数字编号为主体的字符串。

中文名称是中文汇编程序使用的指令名称。

英文名称是对应指令的英文名称。

操作数类型是指令操作数的种类,它包括:无操作数;单操作数中的单寄存器、单内存和单立即数;双操作数中的寄存器到寄存器、内存到寄存器、立即数到寄存器、寄存器到内存,立即数到内存;三操作数中的寄存器到寄存器到寄存器、立即数到寄存器到寄存器、立即数到内存到寄存器、立即数到寄存器到内存。还有几种特例种类,是寄存器被指定为累加器或是计数器寄存器。

操作码是唯一代表本指令意义的二进制代码,表中用十六进制数表示。

模数是“带模数的寄存器和寄/内操作数”字节的最前两位数,用来指定“寄/内”位是寄存器还是内存地址及内存位移量。

操作数是指令的操作数具体表现形式,比如操作数类型是寄存器到寄存器,那么就可能是8位寄存器到8位寄存器或者16位寄存器到16寄存器等,具体请参照对应表。

操作数大小是操作数的长度,通常是字节(Byte)、字(Word)或双字(Dword),也有一些特有的指令的操作数大小为四字或更长的操作数。

符号是指指令的操作数是否有正负符号之分,如果有则指令操作码的倒数第二位表示符号位。

方向是指指令的源操作数与目标操作数是从左到右还是从右到左的关系,0表示从左到右,1表示从右到左。

芯片型号是指令适用的芯片类型,有8086、386、Pentium、AMD等值。

操作数指令表示此指令的操作码中是否含有操作数,此类操作数通常为寄存器,且在占操作码的最后三位。

操作数预设值是表示有些指令的“带模数的寄存器和寄/内操作数”的字节中,第一个寄存器(从左到右两位模数之后的三位)被预设为的定值。

16位和32位字段是指令在汇编16位汇编模式下和在32汇编模式下对应的前缀,用十六进制数表示。

二、简称说明

为了使表不至于过份冗长,使用下例简称来表示内容:寄--寄存器、内--内存、寄:XXX--指定的寄存器、数--立即数、数:X--定值立即数、11--8位寄存器、12--16位寄存器、13--32位寄存器、41--8位立即数、数16--16位立即数、数32--32位立即数、31--8位位移量、32--16位位移量、33--32位位移量。

三、其它说明

表中表示内存的方式就是使用了NASM汇编风格,所有的内存地址都用中括号“[]”括起来,所有没有用中括号括起来的值(除在中括号之前用来修饰操作数大小的数)都表示立即数或者寄存器。由于对内存地址操作时,并不知道操作数的大小,根据源操作数与目地操作数大小匹配的原则(除某些特例指令外),如果未能识别操作数大小的对内存操作都有必要在内存前面加操作数大小修饰,因此,在中括号前面有8、16或32数值是有来修饰操作数大小的,在汇编语言中常用byte、word 或dword来修饰操作数的大小。在操作数字段中还有“=>”和“<=”两组符号,它表示源操作数与目的操作数的关系,在操作数字段中,操作数的顺序是按真实的指令操作数排列,对于许多有方向性指令的,通常操作码的倒数第二位为方向位,“=>”这个符号的左边为源操作数,右边为目的操作数,“<=”符号与“=>”符号操作数相反。这样看起来比较直观,并且反映指令操作数的真实形式。对于有方向性的指令可解释为“从源操作数到目的操作数”,而对于没有方向性的指令可解释为“源操作数作用于目的操作数”。这一点有别于所有当前的汇编程序,当前的汇编程序都是以逗号“,”隔开操作数,并默认从左

指令代码对照表

PowerPC总汇编指令集

PowerPC汇编指令集 标签:汇编指令PowerPC PPC 2008-05-04 21:25 PowerPC 体系结构规范(PowerPC Architecture Specification)发布 于 1993 年,它是一个 64 位规范 ( 也包含 32 位子集 )。几乎所有常规可用 的 PowerPC(除了新型号 IBM RS/6000 和所有 IBM pSeries 高端服务器)都 是 32 位的。 PowerPC 处理器有 32 个(32 位或 64 位)GPR(通用寄存器)以及诸如 PC (程序计数器,也称为IAR/指令地址寄存器或 NIP/下一指令指针)、LR(链接寄存器)、CR(条件寄存器)等各种其它寄存器。有些 PowerPC CPU 还 有 32 个 64 位 FPR(浮点寄存器)。MPC555使用的PowerPC CPU是带有FPR 的。一些常用寄存器介绍如下: 通用寄存器的用途: r0在函数开始(function prologs)时使用。 r1堆栈指针,相当于ia32架构中的esp寄存器,idapro把这个寄存器反汇编标识为sp。 r2内容表(toc)指针,idapro把这个寄存器反汇编标识为rtoc。系统调用时,它包含系统调用号(这个好像跟系统有关吧)。 r3作为第一个参数和返回值。 r4-r10函数或系统调用开始的参数。 r11用在指针的调用和当作一些语言的环境指针。 r12它用在异常处理和glink(动态连接器)代码。 r13保留作为系统线程ID。 r14-r31 作为本地变量,非易失性。 专用寄存器的用途: lr链接寄存器,它用来存放函数调用结束处的返回地址。 ctr计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。 xer定点异常寄存器,存放整数运算操作的进位以及溢出信息。 msr机器状态寄存器,用来配置微处理器的设定。 cr条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。 寄存器r1、r14-r31是非易失性的,这意味着它们的值在函数调用过程保持不变。寄存器r2也算非易失性,但是只有在调用函数在调用后必须恢复它的值时才被处理。

x86汇编指令集

x86汇编指令集 数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX reg32,r/m8 ; o32 0F BE /r [386] MOVSX reg32,r/m16 ; o32 0F BF /r [386] MOVZX reg16,r/m8 ; o16 0F B6 /r [386] MOVZX reg32,r/m8 ; o32 0F B6 /r [386] MOVZX reg32,r/m16 ; o32 0F B7 /r [386] PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.

PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. ── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS.

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

汇编语言指令汇总

汇编语言程序设计资料简汇 通用寄存器 8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。 16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。 AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。专用寄存器 指令指针:IP(16位)。 标志寄存器:没有助记符(FLAGS 16位)。 段寄存器 段寄存器:CS、DS、ES、SS。 内存分段:80x86采用分段内存管理机制,主要包括下列几种类型的段: ?代码段:用来存放程序的指令序列。 ?数据段:用来存放程序的数据。 ?堆栈段:作为堆栈使用的内存区域,用来存放过程返回地址、过程参数等。 物理地址与逻辑地址 ?物理地址:内存单元的实际地址,也就是出现在地址总线上的地址。 ?逻辑地址:或称分段地址。 ?段地址与偏移地址都是16位。 ?系统采用下列方法将逻辑地址自动转换为20位的物理地址: 物理地址= 段地址×16 + 偏移地址 ?每个内存单元具有唯一的物理地址,但可由不同的逻辑地址描述。 与数据有关的寻址方式 立即寻址方式 立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 例:MOV AL,18 指令执行后,(AL)= 12H 寄存器寻址方式 在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。 例3:MOV AX,BX 如指令执行前(AX)= 6789H,(BX)= 0000H;则指令执行后,(AX)= 0000H,(BX)保持不变。 直接寻址方式 直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。直接寻址方式适合于处理单个数据变量。 寄存器间接寻址方式 在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。 如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址。 如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段。

汇编语言编码

二进制换十进制: 10100101.11B=1x2^7+0X2^6+1x2^5+………+1x2^0+1x2^-1+1x2^-2=165.75; N位二进制数可表示2^n个数; 十六进制的数码:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F; 八进制的数码: 0、1、2、3、4、5、6、7; 二进制的数码:0、1; 例如: 八进制:534.5 Q=5x8^2+3x8^1+4x8^0+5x8^-1=348.625; 十六进制:2AC.C H=2x16^2+10x16^1+12x16^0+12X16^-1=684.75; 二进制:10100101.11B=1x2^7+0X2^6+1x2^5+………+1x2^0+1x2^-1+1x2^-2=165.75; 十进制数换二进制:每次除2,得到余数为1或0,即a0,a1,a2,a3……an, 于是,an……a3,a2,a1,a0; 小数部分:乘以2取整,为1或0,即a-1,a-2,a-3……a-n, 于是,a-1,a-2,a-3……a-n; 十六进制换二进制:4位二进制为一个十六进制; 八进制换二进制:3位二进制为一个八进制数; 运算规则:逢2进一,逢八进一,逢十六进一; 例如: 3DA6H -0FC3H 2DE3H 向高位借一为16的原则;

补码: 正数补码为本身,负数的补码为其相反数的二进制数,取反后再加一,得到的数即为,负数的补码。 例如:-27的补码: +27 的补码:0001 1011 按位取反为: 1110 0100 末位加一:1110 0101 [-27]补= E5 H; 数的范围:8位二进制可以表示2^8=256个数, 1000 0000 为-128; 0000 0000 为0; 0111 1111 为128; 8位补码的范围为:-128~127; 255+1=256 到此进制的编码运算以结束。

8086汇编指令手册

8086汇编指令手册 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. —— BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器.

STM 常用汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。 ARM指令使用的基本格式如下: 〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉} opcode操作码;指令助记符,如LDR、STR等。 cond可选的条件码;执行条件,如EQ、NE等。 S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 Rd目标寄存器。 Rn存放第1操作数的寄存器。 operand2第2个操作数 arm的寻址方式如下: 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址 这里不作详细描述,可以查阅相关文档。 数据处理指令 Load/Store指令 程序状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断指令 协处理器指令 在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。 1、相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令前后32M。 b funa .... funa: b funb ....

funb: .... 2、数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。 mov r1,r2 mov r1,#1024 mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。 ldr r1,=1024 3、内存访问指令ldr、str、ldm、stm ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。 ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。 ldr r1,[r2,#4] ldr r1,[r2] ldr r1,[r2],#4 str r1,[r2,#4] str r1,[r2] str r1,[r2],#4 寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下: LDM/STM{}Rn{!}, 4、加减指令add、sub add r1,r2,#1 sub r1,r2,#1 5、程序状态寄存器的访问指令msr,mrs ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是: 状态寄存器到通用寄存器的传送指令(MRS) 通用寄存器到状态寄存器的传送指令(MSR) 其汇编格式如下: MRS{}Rd,CPSR|SPSR 其汇编格式如下:

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

MCS-51汇编语言指令集

MCS-51汇编语言指令集 符号定义表 符号 含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 2指令介绍 指令 字节 周期 动作说明 算数运算指令 1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 1

将累加器与间接地址的内容相加,结果存回累加器4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBB A,0data 2 1 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 1 1 将累加器的值加1 14.INC Rn 1

汇编语言指令速查表

附录 附录A 常用80x86指令速查表 指令按助记符字母顺序排列,缩写、符号约定如下: (1) 指令中,dst, src表示目的操作数和源操作数。仅一个操作数时,个别处也表示为opr。 (2) imm表示立即数,8/16/32位立即数记作:imm8/imm16/imm32。 (3) reg表示通用寄存器,8/16/32位通用寄存器记作:reg8/reg16/reg32。 (4) mem表示内存操作数,8/16/32等内存操作数记作:mem8/mem16/mem32等。 (5) seg表示段寄存器,CS, DS, SS, ES, FS, GS。 (6) acc表示累加器,8/16/32累加器对应AL/AX/EAX。 (7)OF, SF, ZF, AF, PF, CF分别表示为O, S, Z, A, P, C,相应位置为:字母,根据结果状态设置;?,状态不确定;-,状态不变;1,置1;0,清0;例如:0 S Z ? P -表示:OF清0,AF不确定,CF不变,其它根据结果设置。若该栏空白,则表示无关。 (8)寄存器符号诸如(E)CX, (E)SI, (E)DI, (E)SP, (E)BP和(E)IP等,表示在16地址模式下使用16位寄存器(如CX),或在32地址模式下使用32位寄存器(如ECX)。 (9)周期数表示指令执行所需的CPU时钟周期个数,即执行时间为:周期数/主频(秒)。 (10)诸如(386+)是表示该指令只能用于80386及以后微处理器上。

·252·

附录 ·253·

·254·

附录 ·255·

·256·

汇编语言的进制显示

引言 如果要处理一个与数相关的问题,不管是中间的、还是最终的结果,我们都 希望能直观地在显示器上显示出来。数字计算机中的数据存储方式是由“0”和“1”组成的二进制码串,根据不同的需要,我们往往要求数据的显示形式不一样,如二进制、十进制、十六进制、八进制等等,然而在汇编语言中实现数据的显示没有类似高级语言中的输出格式命令那么方便,对每个数的显示,一般都需要逐位地转换成ASCII码才能调用系统显示功能完成显示,其中,按不同的数制要求,还要先完成数制间的转换。下面我们来探讨一个数如何编程让它分别按二进制、十进制、十六进制的数制形式显示在显示器上。 二、编程思路与算法 以一个16位二进制机器整数为例,它的二进制表示范围是0至1111111111111111B;十进制的范围是0至65535(无符号数),或-32768 至+32767(有符号数);十六进制表示范围是0000至FFFFH。为方便说明,假设此数放在BX寄存器中,下面介绍按不同进制形式显示的编程思路和算法。(一)按二进制形式显示 二进制只有“0”和“1”两个数字,它们的ASCII码分别是30H和31H,只要逐位判断是“0”还是“1”,然后转换成对应的ASCII码即可。 实际编程时,对于BX中的十六位二进制数,可设臵一个循环次数为16的 循环体,用向左的移位指令,通过CPU标志寄存器中的CF标志,由高位到低位逐位判断、逐位取ASCII码值、逐位显示。当然也可以先将十六个数位都转换成一个ASCII码串放入内存缓冲区后再按字符串方式显示,要注意2种方法在显示时系统调用的功能号不同。

(二)按十进制形式显示 首先要完成二进制到十进制数的转换,一般采用“除10取余”法来完成,其大致过程如下:将待转换的数(在BX中)除以10,得到第一个商和余数,此第一个余数就是所求的十进制数的个位;再用第一个商除以10,得到第二个商和余数,此第二个余数就是所求十进制数的十位;……;重复这一过程直至商为0,此时的余数就是所求十进制数的最高位。 在内存中分配一缓冲区,用来存放以上分离出来的十进制数的每一位,然后再逐个转换成ASCII码,转换成ASCII码的过程很简单,就是给每个十进制位加上30H即可;最后送显示器输出。从转换的过程可以看出,先分离出来的是十进制数的低位,要后显示;后分离出来的是十进制数的高位,应该先显示。因此在编程时,我们可以利用堆栈操作中“先进后出、后进先出”的特性,当分离出各十进制位时依次入栈,要逐个转换成ASCII码,显示时依次出栈。(三)按十六进制形式显示 十六进制与二进制有很好的对应关系(每4位二进制数和1位十六进制数 存在一一对应关系),显示时只需将原二进制数(在BX中)每4位分成一组,按组求对应的ASCII码送显示器即可。 ASCII码与十六进制数字的对应关系为:30H~39H对应数字0~9,41H~46H 对应数字A~F,从数字9到A,其ASCII码间隔了7H,这一点在转换时要特别注意。为使一个十六进制数能按高位到低位依次显示,实际编程中,我们对先BX中的数每次循环左移一组(4位二进制),然后屏蔽掉当前高12位,对当前余下的4位(即1位十六进制数)求其ASCII码,要判断它是0~9还是A~F,是前者则加30H得对应的ASCII码,后者则要加37H才行,最后送显示器输

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

汇编语言指令集合 吐血整理

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位:AH,BH,CH,DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

二进制数转换ASCⅡ码的汇编语言源程序

二进制数转换ASCⅡ码的汇编语言源程序一实验目的 (3) 二、编程提要 (3) 三、流程图及算法 (4) 四、心得体会 (7) 一实验目的: 进一步熟悉汇编语言的代码; 学会分析算法并构造流程图;

能够完成简单的子程序设计; 学会查找程序的算法。 二、编程提要 在这些功能段中,最重要的工作是管理当前光标位置的指针和键盘缓冲区的头、尾指针,为此,在数据段中,设置了一个60H字节的缓冲区(kbd_buff),两个字的缓冲区头、尾指针(bufpt&buftl),指示光标位置的行、列指针(rowpt&colpt),根据需要还设置了10H行的字符计数单元和一个字的最大输入行的记录单元。如此设置的缓冲区及其它指针单元在调试程序时,可正好用DEBUG的D命令将全部信息一次显示出来。程序调试好后,可根据实际扩充数据区 三、流程图及算法

根据流程图编写程序:如下:

DATA SEGMENT NUM8 DB 93H NUM16 DW 0ABCDH ASCBUF DB 20 DUP(0) DATA ENDS STACK SEGEMNT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START: MOV AX,DATA MOV DS,AX MOV DX,0 MOV DL,NUM8 ; 转化二进制数送DX MOV CX,8 ;置数8 LEA DI,ASCBUF ;字符串首地址→DI CALL BTASC ;调用子程序BTASC MOV [DI],BYTE PTR 0DH MOV [DI+1],BYTE PTR 0AH MOV [DI+2],BYTE PTR ‘$’ LEA DX,ASCBUF MOV AH,9

汇编语言指令分类详解

3.1 8086/8088寻址方式 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在 操作码的后面,与操作码一起放在代码段区域中。 如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若 是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如:MOV AX,DS:[2000H];

图2-2 (对DS来讲可以省略成MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以 分成两种情况: (1)以SI、DI、BX间接寻址,则 通常操作数在现行数据段区域 中,即数据段寄存器(DS)*16 加上SI、DI、BX中的16位偏移 量,为操作数的地址, 例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI) (2)以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如:MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP)5.变址寻址 由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个

相关文档