汇编语言知识点
arm汇编lsls指令

arm汇编lsls指令[arm汇编lsls指令]详解在ARM汇编语言中,LSLS指令是一条很重要的指令,它用来进行逻辑左移操作。
在本文中,我们将详细探讨LSLS指令的用法、功能和实际应用。
LSLS指令是什么?LSLS指令是ARM汇编语言中的一条指令,用来执行逻辑左移操作。
逻辑左移是指将一个二进制数向左移动指定的位数,移出的位被丢弃,右侧被填充为0。
这个操作可以用来进行乘以2的运算,因为每向左移动一位,数值就会翻倍。
LSLS指令的语法是什么?在ARM汇编语言中,LSLS指令的语法如下:LSLS Rd, Rn, #n其中,Rd是目标寄存器,Rn是操作数寄存器,#n是要移动的位数。
LSLS指令的功能是什么?LSLS指令的功能是对操作数寄存器中的数值进行逻辑左移操作,并将结果存储到目标寄存器中。
移动的位数由#n指定。
LSLS指令的实际应用LSLS指令在实际的编程中有很多应用场景。
例如,当我们需要对一个数进行乘以2的操作时,可以使用LSLS指令来实现。
另外,LSLS指令也可以用来进行位操作,比如清零操作。
LSLS指令的使用示例下面是一个使用LSLS指令的简单示例,假设我们要将R1寄存器中的数值左移3位,并将结果存储到R2寄存器中:LSLS R2, R1, #3在这个示例中,LSLS指令将R1寄存器中的数值左移3位,然后将结果存储到R2寄存器中。
这样就实现了将R1中的数值乘以8的操作。
总结在本文中,我们详细探讨了ARM汇编语言中的LSLS指令,包括其语法、功能和实际应用。
LSLS指令在ARM汇编编程中有着广泛的应用,能够帮助程序员实现各种位操作和乘法运算。
掌握LSLS指令的用法,有助于提高程序的效率和性能,是ARM汇编编程中的重要知识点。
项目2:知识点2汇编语言

DATA6
54 48 49 53 20 49 53 20 41 20 45 58 41 4D 50 4C 45
T H I S I S
A
E X A M P L E
DS
(3) 段定义语句
在段定义中,SEGMENT和ENDS总是成对使用的,它们将数据和程序
分为多个段,如数据段、栈段和代码段。 ASSUME是汇编时进行操作的,它用于在汇编时告诉汇编器,哪个是数 据段,哪个是代码段,哪个是栈段。 ORG用于指定目标程序存放单元的起始偏移地址,通常写在第一条源 程序的前面,用于指定这段程序的首地址。如使用了: ORG 100 则程序执行时就从CS:100处开始执行其后面的程序。
运算符包括算术、逻辑、关系、分析、综合五类运算符。
① 算术运算符 包括 + 、-、*、/ 、MOD 参加运算的内容可以是数据,也可以是地址,但在一个算术运算符
的两边不能都是地址。
② 逻辑运算符 包括 AND、OR、NOT、XOR ③ 关系运算符 包括 相等 :EQ 大于:GT
不等:NE
小于:LT
小于或等于:LE
汇编语言
一、汇编语言程序格式 二、汇编语言程序设计基础
三பைடு நூலகம்直线程序
四、分支程序 五、循环程序 六、码转换程序设计 七、有关序列的操作 八、DOS 功能调用 九、子程序设计
一、 汇编语言程序格式
my_data segment again: Mov al,[si]
CS
array1 db 05,a2H,00,10H,85H
2000:1500
DS
DW 100 DUP (?) AX=2
定义了100个字单元,则 MOV AX, TYPE DATA1
Windows X86 64位汇编语言入门

Windows X86-64位汇编语言入门Windows X64汇编入门(1)最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。
我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。
文章的标题包含了本文的四方面主要内容:(1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista64位版,调用的均为windows API。
(2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。
至于三者间的区别,可自行搜索。
(3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。
(4)入门:既是入门,便不会很全。
其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。
其二,便于类似我这样刚接触x64汇编的新手入门。
本文所有代码的调试环境:Windows Vista x64,Intel Core2Duo。
1.建立开发环境1.1编译器的选择对应于不同的x64汇编工具,开发环境也有所不同。
最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio2005一起发布。
因此,如果你是微软的忠实fans,直接安装VS2005既可。
运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。
第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC资源编译器,且自带了Include目录。
它的最大好外是小,不用为了学习64位汇编安装几个G的VS。
因此,本文的代码就在GoASM下编译。
第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。
不同的编译器,语法会有一定差别,这在下面再说。
1.2IDE的选择搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。
汇编语言编程实例

汇编语言编程实例一、引言汇编语言是计算机硬件和软件之间的桥梁,它是一种低级语言,可以直接控制计算机硬件。
汇编语言编程可以让程序员更加深入地理解计算机的工作原理,从而实现更高效的程序。
本文将介绍几个汇编语言编程实例,涉及到基本的输入输出、循环、条件判断、数组等知识点。
在这些实例中,我们将使用NASM汇编器进行编译和链接。
二、基本输入输出1. 输出字符串在汇编语言中,我们可以使用系统调用来进行输入输出操作。
在Linux 系统中,输出字符串的系统调用为write。
下面是一个输出字符串的示例程序:```section .datamsg db 'Hello, World!',0xa ;定义一个字符串len equ $-msg ;获取字符串长度section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 1 ;exit系统调用号为1xor ebx, ebx ;退出状态码为0int 0x80 ;调用系统调用退出程序```2. 输入数字类似地,在Linux系统中,输入数字的系统调用为read。
下面是一个输入数字的示例程序:```section .datamsg db 'Please enter a number: ',0xa ;提示信息len equ $-msg ;获取字符串长度buf resb 1 ;定义一个字节的缓冲区section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 3 ;read系统调用号为3mov ebx, 0 ;文件描述符为0(标准输入)mov ecx, buf ;缓冲区地址mov edx, 1 ;要读取的字节数int 0x80 ;调用系统调用sub al, '0' ;将ASCII码转换成数字值```三、循环和条件判断1. 计算1到100的和下面是一个计算1到100的和的示例程序,其中使用了循环和条件判断:```section .datasum dd 0 ;定义一个双精度浮点型变量sumsection .textglobal _start_start:xor eax, eax ;eax清零,作为计数器和累加器使用loop_start:inc eax ;eax自增1,相当于i++cmp eax, 100+1 ;比较i是否大于100,注意要加1je loop_end ;如果i等于101,跳转到loop_endadd dword [sum], eax ;将i加到sum中jmp loop_start ;跳转到loop_startloop_end:mov eax, dword [sum] ;将sum赋值给eax,作为返回值mov ebx, 1 ;exit系统调用号为1int 0x80 ;调用系统调用退出程序```2. 判断一个数是否为素数下面是一个判断一个数是否为素数的示例程序,其中使用了循环和条件判断:```section .datamsg db 'Please enter a number: ',0xa ;提示信息len equ $-msg ;获取字符串长度buf resb 1 ;定义一个字节的缓冲区section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 3 ;read系统调用号为3mov ebx, 0 ;文件描述符为0(标准输入)mov ecx, buf ;缓冲区地址mov edx, 1 ;要读取的字节数int 0x80 ;调用系统调用sub al, '0' ;将ASCII码转换成数字值check_prime:xor ebx, ebx ;ebx清零,作为除数使用mov ecx, eax ;将eax的值赋给ecx,作为被除数使用inc ebx ;将ebx自增1,相当于除数加1cmp ebx, ecx ;比较除数是否大于被除数jge is_prime ;如果除数大于等于被除数,跳转到is_prime xor edx, edx ;edx清零,作为余数使用div ebx ;将ecx/ebx的商放在eax中,余数放在edx中 cmp edx, 0 ;判断余数是否为0je not_prime ;如果余数为0,跳转到not_primejmp check_prime ;跳转到check_primenot_prime:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, not_prime_msg ;要输出的字符串地址mov edx, not_prime_len ;要输出的字符数int 0x80 ;调用系统调用exit:mov eax, 1 ;exit系统调用号为1xor ebx, ebx ;退出状态码为0int 0x80 ;调用系统调用退出程序not_prime_msg db 'The number is not prime.',0xa ;提示信息not_prime_len equ $-not_prime_msgis_prime:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, is_prime_msg ;要输出的字符串地址mov edx, is_prime_len ;要输出的字符数int 0x80 ;调用系统调用jmp exit ;跳转到exitis_prime_msg db 'The number is prime.',0xa ;提示信息is_prime_len equ $-is_prime_msg```四、数组1. 计算数组的和下面是一个计算数组的和的示例程序:```section .dataarr dd 1, 2, 3, 4, 5 ;定义一个双精度浮点型数组arrn equ ($-arr)/4 ;获取数组长度section .textglobal _start_start:xor eax, eax ;eax清零,作为计数器和累加器使用xor ecx, ecx ;ecx清零,作为数组下标使用loop_start:cmp ecx, n ;比较ecx是否大于等于njge loop_end ;如果ecx大于等于n,跳转到loop_endadd eax, dword [arr+ecx*4] ;将arr[ecx]加到eax中inc ecx ;将ecx自增1,相当于下标加1jmp loop_start ;跳转到loop_startloop_end:mov ebx, eax ;将sum赋值给ebx,作为返回值mov eax, 1 ;exit系统调用号为1xor ecx, ecx ;退出状态码为0int 0x80 ;调用系统调用退出程序```2. 查找数组中的最大值下面是一个查找数组中的最大值的示例程序:```section .dataarr dd 10,20,30,-40,-50,-60,-70,-80,-90,-100 ;定义一个双精度浮点型数组arrn equ ($-arr)/4 ;获取数组长度section .textglobal _start_start:mov eax, dword [arr] ;将arr[0]赋值给eax,作为最大值使用xor ecx, ecx ;ecx清零,作为数组下标使用loop_start:cmp ecx, n ;比较ecx是否大于等于njge loop_end ;如果ecx大于等于n,跳转到loop_endcmp eax, dword [arr+ecx*4] ;比较eax和arr[ecx]jge loop_next ;如果eax大于等于arr[ecx],跳转到loop_next mov eax, dword [arr+ecx*4] ;将arr[ecx]赋值给eax,更新最大值loop_next:inc ecx ;将ecx自增1,相当于下标加1jmp loop_start ;跳转到loop_startloop_end:mov ebx, eax ;将max赋值给ebx,作为返回值mov eax, 1 ;exit系统调用号为1xor ecx, ecx ;退出状态码为0int 0x80 ;调用系统调用退出程序```五、总结本文介绍了几个汇编语言编程实例,涉及到基本的输入输出、循环、条件判断、数组等知识点。
汇编语言平时练习(判断题)

2.知识点:0301 (80x86的寻址方式)假设存储器中从7462H单元开始的四个相邻字节单元中的内容依次是32H,46H,52H,0FEH,则存放字数据0FE52H的字地址是7465H。
4.知识点:0303(80x86的指令系统)MOV指令不影响标志位。
5.知识点:0303(80x86的指令系统)无条件转移指令对标志位无影响,而条件转移指令对标志位有影响。
6.知识点:0303(80x86的指令系统)指令IN AL,DX是合法的指令。
7.知识点:0303(80x86的指令系统)当运算结果的低8位中有偶数个1 时, 奇偶标志位PF被置为1。
9.知识点:0301 (80x86的寻址方式)可以将一个存储器操作数与另一个存储器操作数相加。
10.知识点:0303(80x86的指令系统)在“IN AL,端口地址”指令中,端口地址指定了某个外部设备接口的I/O地址,它实际上是一个立即数,其范围为0~65535。
答案:错误11.知识点:0401(汇编程序功能)汇编程序和汇编语言源程序是不同的概念。
答案:正确12.知识点:0301 (80x86的寻址方式)相对于某起始地址的偏移量称为偏移地址。
答案:正确13.知识点:0303(80x86的指令系统)只能使用PUSH,POP类的指令对堆栈段内的内容进行操作。
14.知识点:0301 (80x86的寻址方式)立即数寻址方式不能用于目的操作数字段。
15.知识点:0203(中央处理机)BP是堆栈栈顶指针寄存器。
16.知识点:0301 (80x86的寻址方式)内存中字单元的地址必须是偶数地址。
答案:错误17.知识点:0303(80x86的指令系统)PUSH AL。
19.知识点:0303(80x86的指令系统)SHR AX,CX。
20.知识点:0401(汇编程序功能)汇编程序是用汇编语言编写的汇编语言源程序。
答案:错误22.知识点:0301 (80x86的寻址方式)不能给段寄存器进行立即数方式赋值。
汇编语言平时练习题

2. 知识点:01 (根底知识)汇编语言属于〔〕A.用户软件B.系统软件C.高级语言D.机器语言6. 知识点:0201(80x86微处理器)IBM PC机的DOS是属于〔〕。
A.用户软件B.系统软件C.系统硬件D.一种语言8. 知识点:0203(中央处理机)8086/8088 CPU的存放器组中,8位的存放器共有〔〕个A.4B.6C.8D.109. 知识点:0203(中央处理机)8086/8088 CPU的存放器组中,16位的存放器共有〔〕个。
A.10B.12C.13D.1410. 知识点:0204(存储器)8086/8088 CPU执行算术运算时PSW共有〔〕个标志位会受影响。
A.4B.5C.6D.711. 知识点:0204(存储器)在程序执行过程中,IP存放器始终保存的是〔〕。
A.上一条指令的首地址B.本条指令的首地址C.下一条指令的首地址D.需计算有效地址后才能确定地址12. 知识点:0204(存储器)IBM PC机的存储器可分〔〕个段。
A.4B.256C.512D.6553613知识点:0204(存储器)当使用BP作编程地址时,此时使用的是〔〕段。
A.CSB.DSC.ESD.SS17知识点:0204(存储器)存储器的一个字节表示〔〕位。
A.8B.16C.32D.6418知识点:0101(基于微处理器的计算机系统构成)如果某个字变量的数据存放在奇地址单元,那么8086/8088 CPU读写该变量时需要〔〕个读写周期。
A.1B.2C.3D.419知识点:0203(中央处理机)在机器内部操作中,CPU与存储器之间的任何信息交换使用的都是〔〕地址。
A.逻辑B.物理C.有效D.相对21知识点:0204(存储器)物理地址的形成过程是将段地址左移〔〕位加偏移地址。
A.2B.3C.4D.527知识点:0205(外部设备)一般的外部设备接口电路中的状态存放器是用来存放外设或接口电路的〔〕信息。
A.数据B.控制C.状态D.前三者28知识点:0201(80x86微处理器)以下表达正确的选项是〔〕。
汇编语言第3-4章平时练习题(四川农业大学)

3.知识点:0403(汇编语言程序格式) *后产生的文件的扩展名是(B)。
程序汇编汇编汇编语言源程序经A)MAP选项B)OBJ选项C)ASM选项D)EXE选项4.知识点:0403(汇编语言程序格式) *语言的什么文件经链接(汇编LINK)后产生可执行文件?(D)A)EXE选项B)OBJ选项C)MAP选项D)LST选项7. 知识点:0401(汇编程序功能)*汇编语言源程序是(A)程序。
A)不可直接执行的选项行的连接后就可直接执选项B)经编后就可执行的程序汇汇编C)经选项行的D)可直接执选项14 知识点:0302(程序占有的空间和执行时间) **(C)标0,则如果指令的运算结果为志位为1。
A)SF选项选项B)CFC)ZF选项D)OF选项15 知识点:0302(程序占有的空间和执行时间) **果中有奇数个1,则(如果指令的运算结C)标志位为0。
A)OF选项B)CF选项C)PF选项D)SF选项16. 知识点:0301(80x86 的寻址方式) *D)是编址的。
IBM PC机的内存是按(A)位选项B)双字选项C)字选项D)字节选项23 知识点:0301(80x86 的寻址方式80x86 的寻址方式) **辑地址为(C):0345H。
它的逻元的物理地址为12345H。
则如果内存的某一单A)0120H选项B)12000H选项C)1200H选项D)0012H选项24 知识点:0301(80x86 的寻址方式80x86 的寻址方式) ***如果一个字变量中存放16 个字,该字量数据变字变量的起始地址为1000H:2000H,则该区中的最末一个字单元的物理地址为(D)。
A)12020H选项B)12000H选项C)1201FH选项D)1201EH选项25 知识点:0301(80x86 的寻址方式80x86 的寻址方式) **取22000H 字单12H、34H,若要读元中的数据,设22000H、22001H单存放的数据为元分别读出的数据是(A)。
t指令知识点总结

t指令知识点总结概述T指令是一种汇编语言指令,通常用于控制程序的执行流程。
在汇编语言中,T指令可以用来实现条件分支、循环控制、函数调用等操作。
本文将就T指令的使用方法、语法规则、常见错误及解决方法等方面进行总结。
T指令的使用方法T指令通常用于控制程序的执行流程,常见的使用方式包括条件分支、循环控制和函数调用等。
下面将分别介绍这几种常见的使用方法。
条件分支在汇编语言中,条件分支是一种常见的控制结构,用于根据条件的真假来选择不同的执行路径。
T指令可以用来实现条件分支。
在T指令中,条件分支通常使用IF...THEN...ELSE...END IF的结构来实现,例如:```IF 条件 THEN执行语句1ELSE执行语句2END IF```其中,条件是一个逻辑表达式,可以是比较操作符(如等于、大于等)的组合,然后根据条件的真假来选择执行语句1还是执行语句2。
循环控制除了条件分支外,T指令还可以用来实现循环控制。
在汇编语言中,循环控制是一种常见的控制结构,用于重复执行一段代码直到满足某个条件为止。
T指令中,循环控制通常使用DO...LOOP...EXIT DO的结构来实现,例如:```DO执行语句LOOP WHILE 条件```其中,条件是一个逻辑表达式,表示循环的退出条件。
执行语句是需要重复执行的一段代码。
循环控制的执行流程是先执行执行语句,然后判断条件是否满足,如果满足则继续执行,否则退出循环。
函数调用在汇编语言中,函数是一种用来封装一段独立功能的代码块,可以在程序中多次调用,以实现代码的复用。
T指令可以用来实现函数调用。
在T指令中,函数调用通常使用CALL...RET的结构来实现,例如:```CALL 函数名...RET```其中,函数名是需要调用的函数的名称,CALL指令用于跳转到函数的入口点开始执行函数内的代码,RET指令用于返回函数调用的地方继续执行后续的代码。
T指令的语法规则T指令的语法规则包括指令格式、操作数格式、寻址方式等方面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章十进制与二进制之间的转换(P2)降幂法除法十进制与六进制之间的转换(P5)降幂法除法补码表示:正数:采用符号—绝对值法负数:先写出对应的正数的补码表示,然后再将其按位数求反,最后末尾加1,就可以得到负数的补码表示补吗运算:二进制数按位求反后在末尾加1第二章一、存储容量1K = 1024 =210 (Kilo)1M =1024K = 220 (Mega)1G = 1024M = 230 (Giga)1个二进制位:bit (比特)8个二进制位:Byte(字节)1Byte = 8bit2个字节:1 Word (字)1Word = 2Byte = 16bit二、存储单元地址和内容1.存储器以字节(8 bit)为编程单位2.每个字节单元都有唯一的地址编码3.地址用无符号整数来表示(编程用十六进制表示)4.一个字要占用相继的两个字节5.低位字节存入低地址,高位字节存入高地址6.字单元地址用它的低地址来表示7.机器以偶地址访问(读/ 写)存储器三、物理地址= 16 段地址+ 偏移地址四、存储器的分段:20 根地址线:地址范围00000H ~ FFFFFH (1MB)机器字长16位:仅能表示地址范围0000H ~ FFFFH (64KB)小段:每16个字节为一小段,共有64K个小段段起始地址:小段首地址段的大小:64K 范围内的任意字节五、存储器的逻辑分段优点:允许程序在存储器内重定位;允许实模式程序在保护模式下运行;有利于程序和数据的分离。
六、中央处理器8086/8088寄存器组:通用寄存器数据寄存器:AX,BX,CX,DX变址寄存器:SI、DI指针寄存器:SP、BP控制寄存器:IP、FLAGS段寄存器:CS、DS、SS、ES七、标志寄存器( FLAGS / PSW )条件标志位:OF 溢出标志SF符号标志ZF 零标志CF 进位标志AF 辅助进位标志PF奇偶标志控制标志位:DF 方向标志IF中断标志TF 陷阱标志八、寄存器与存储器的比较:寄存器:在CPU内部;访问速度快;容量小,成本高;用名字表示;没用地址存储器:在CPU外部;访问速度慢;容量大,成本低;用地址表示;地址可用各种方式形成第三章九、数据传送指令传送指令MOV CPU内部寄存器之间的数据传送指令格式:MOV DST, SRC 执行操作:(DST) ←(SRC)注意: *DST、SRC 不能同时为段寄存器MOV DS, ES ⨯* DST、SRC 不能同时为存储单元*立即数不能直接送段寄存器MOV DS, 2000H ⨯* DST 不能是立即数和CS*不影响标志位交换指令XCHG指令格式:XCHG OPR1, OPR2 执行操作:(OPR1) ↔(OPR2)例:XCHG BX, [ BP+SI ] XCHG AL, BH注意: * 两个操作数字长一致* 两个操作数都不能是段寄存器* 两个操作数都不能是立即数* 两个操作数不能同时是存储单元* 可以采用除立即寻址方式外的任何一种寻址方式。
* 不影响标志位地址传送指令LEA、LDS、LES1.有效地址送寄存器指令:LEA REG, SRC 执行操作:(REG) ← SRC2.指针送寄存器和DS指令:LDS REG, SRC 执行操作:(REG) ←(SRC)(DS) ← (SRC+2) 相继二字→寄存器、DS3.指针送寄存器和ES指令:LES REG, SRC 执行操作:(REG) ←(SRC)(ES) ←(SRC+2) 相继二字→寄存器、ES注意:* 源操作数必须为存储器操作数* 目的操作数必须是一个16位通用寄存器,不能是段寄存器* 源操作数可以是除立即寻址和寄存器寻址以外的任意一种寻址方式* 不影响标志位堆栈操作指令PUSH、POP1.进栈指令:PUSH SRC执行操作:(SP) ←(SP) – 2 ( (SP)+1, (SP) ) ←(SRC)出栈指令:POP DST执行操作:(DST) ←( (SP)+1, (SP) ) (SP) ←(SP) + 2堆栈:‘先进后出’的存储区,段地址存放在SS中,SP在任何时候都指向栈顶,进出栈后自动修改SP。
注意:* 堆栈操作必须以字为单位。
* 不影响标志位* 不能用立即寻址方式PUSH 1234H ⨯* DST不能是CS POP CS ⨯标志操作指令LAHF、SAHF、PUSHF、POPF 、CLC、STC、CMC、CLD、STD、LI、STI标志传送指令:1.标志送AH指令:LAHF 执行操作:(AH) ← (FLAGS的低字节)2.AH送标志寄存器指令:SAHF 执行操作:(FLAGS的低字节) ←(AH)注意: * LAHF不影响标志位* SAHF影响CF、PF、AF、ZF、SF标志进栈指令:PUSHF执行操作:(SP) ←(SP) - 2 ( (SP)+1, (SP) ) ←(FLAGS)标志出栈指令:POPF执行操作:(FLAGS) ← ( (SP)+1, (SP) ) (SP) ←(SP) + 2注意:PUSHF和POPF经常一起联用,完成保护、维护标志寄存器的内容或改变标志位的值。
标志位操作指令:清进位标志指令CLC CF ←0置进位标志指令STC CF ← 1进位标志取反指令CMC CF ←CF清方向标志指令CLD DF ←0置方向标志指令STD DF ← 1清中断允许标志指令CLI IF ←0置中断允许标志指令STI IF ← 1注意: * 只影响本指令指定的标志十、加减法指令:加法指令:ADD DST, SRC 执行操作:(DST) ←(SRC) + (DST)带进位加法指令:ADC DST, SRC 执行操作:(DST) ←(SRC) + (DST) + CF加1指令:INC OPR 执行操作:(OPR) ←(OPR) + 1注意: * 除INC指令不影响CF标志外,均对状态标志位有影响。
各加法指令对条件标志位的影响:SF=1,结果为负ZF=1,结果为0 CF=1,和的最高有效位有向高位的进位OF=1,两个操作数符号相同,而结果符号与之相反CF 位表示无符号数相加的溢出。
OF 位表示带符号数相加的溢出。
减法指令:SUB DST, SRC 执行操作:(DST) ←(DST) - (SRC)带借位减法指令:SBB DST, SRC 执行操作:(DST) ←(DST) - (SRC) - CF减1指令:DEC OPR 执行操作:(OPR) ← (OPR) - 1求补指令:NEG OPR 执行操作:(OPR) ←- (OPR)比较指令:CMP OPR1, OPR2 执行操作:(OPR1) - (OPR2)各减法指令对条件标志位(CF/OF/ZF/SF)的影响:CF=1,被减数的最高有效位有向高位的借位或CF=1减数转换为加法运算时无进位OF=1 两个操作数符号相反,而结果的符号与减数相同CF 位表示无符号数减法的溢出。
OF 位表示带符号数减法的溢出。
NEG 指令对CF/OF的影响CF=0,操作数为0 OF=1,操作数为-128(字节运算)或-32727(字运算十一、乘除运算指令无符号数乘法指令:MUL SRC 带符号数乘法指令:IMUL SRC执行操作:字节操作数(AX) ←(AL) * (SRC)字操作数(DX, AX) ←(AX) * (SRC)注意: * 目的操作数必须是累加器* AL (AX) 为隐含的乘数寄存器。
* AX (DX,AX) 为隐含的乘积寄存器。
* SRC不能为立即数。
* 除CF和OF外,对条件标志位无乘法指令对CF/OF 的影响:MUL指令: CF,OF =00乘积的高一半为零11否则IMUL指令: CF,OF =00乘积的高一半是低一半的符号扩展11否则例:(AX) = 16A5H,(BX) = 0611H(1) MUL BX ; (DX, AX) ←(AX) * (BX); 16A5*0611=0089 5EF5; (DX)=0089H (AX)=5EF5H CF=OF=1(2) IMUL BL ; (AX) ←(AL) * (BL); A5*11 ⇒ 5B*11=060B ⇒ F9F5; (AX) = 0F9F5H CF=OF=1无符号数除法指令:DIV SRC带符号数除法指令:IDIV SRC执行操作:字节操作(AL) ← (AX) / (SRC) 的商(AH) ← (AX) / (SRC) 的余数字操作(AX) ← (DX, AX) / (SRC) 的商(DX) ← (DX, AX) / (SRC) 的余数注意: * AX (DX,AX) 为隐含的被除数寄存器。
* AL (AX) 为隐含的商寄存器。
* AH (DX) 为隐含的余数寄存器。
* SRC不能为立即数。
* 对所有条件标志位均无定义。
十二、类型转换指令CBW AL → AX执行操作:若(AL)的最高有效位为0,则(AH)= 00H,若(AL)的最高有效位为1,则(AH)= FFH CWD AX → (DX,AX)执行操作:若(AX)的最高有效位为0,则(DX)= 0000H,若(AX)的最高有效位为1,则(DX)= FFFFH例:(AX) = 0BA45HCBW ; (AX)=0045H CWD ; (DX)=0FFFFH (AX)=0BA45H注意: * 无操作数指令* 隐含对AL 或AX 进行符号扩展* 不影响条件标志位十三、逻辑运算指令逻辑非指令:NOT OPR * OPR不能为立即数执行操作:(OPR) ←(OPR) * 不影响标志位逻辑与指令:AND DST, SRC 执行操作:(DST) ←(DST) ∧ (SRC)逻辑或指令:OR DST, SRC 执行操作:(DST) ←(DST) ∨ (SRC)异或指令:XOR DST, SRC 执行操作:(DST) ←(DST) ∀ (SRC)测试指令:TEST OPR1, OPR2 执行操作:(OPR1) ∧ (OPR2)十四、移位指令逻辑左移SHL OPR, CNT逻辑右移SHR OPR, CNT算术左移SAL OPR, CNT(同逻辑左移)算术右移SAR OPR, CNT循环左移ROL OPR, CNT循环右移ROR OPR, CNT带进位循环左移RCL OPR, CNT带进位循环右移RCR OPR, CNT注意: * OPR可用除立即数以外的任何寻址方式* CNT=1,SHL OPR, 1CNT>1,MOV CL, CNT SHL OPR, CL ; 以SHL为例* 条件标志位:CF = 移入的数值 1 CNT=1时,最高有效位的值发生变化0 CNT=1时,最高有效位的值不变移位指令:SF、ZF、PF 根据移位结果设置,AF无定义循环移位指令:不影响SF、ZF、PF、AF十五、控制转移指令:∙无条件转移指令JMP∙条件转移指令JZ / JNZ 、JE / JNE、JS / JNS、JO / JNO、JP / JNP、JB / JNB、JL / JNL、JBE / JNBE、JLE / JNLE、JCXZ∙循环指令LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE∙子程序调用和返回指令CALL、RET∙中断与中断返回指令INT、INTO、IRET十六、与转移地址有关的寻址方式:用来确定转移指令及转子指令的转向地址段内寻址段内直接寻址JMP NEAR PTR NEXT段内间接寻址JMP TABLE [ BX ]段间寻址段间直接寻址JMP FAR PTR NEXT段间间接寻址JMP DWORD PTR [ BX ]无条件转移指令:段内直接短转移:JMP SHORT OPR执行操作:(IP) ←(IP) + 8位位移量段内直接近转移:JMP NEAR PTR OPR执行操作:(IP) ←(IP) + 16位位移量段内间接转移:JMP WORD PTR OPR执行操作:(IP) ←(EA)段间直接远转移:JMP FAR PTR OPR执行操作:(IP) ←OPR 的段内偏移地址(CS) ←OPR 所在段的段地址段间间接转移:JMP DWORD PTR OPR执行操作:(IP) ←(EA) (CS) ←(EA+2)注意:* 不影响标志位十七、条件转移指令注意:* 只能使用段内直接寻址的8 位位移量* 不影响标志位(1) 根据单个条件标志的设置情况转移格式测试条件JZ(JE) OPR ZF = 1JNZ(JNE) OPR ZF = 0JS OPR SF = 1JNS OPR SF = 0JO OPR OF = 1JNO OPR OF = 0JP OPR PF = 1JNP OPR PF = 0JC OPR CF = 1JNC OPR CF = 0(2) 比较两个无符号数,并根据比较结果转移格式测试条件<JB (JNAE,JC) OPR CF = 1≥JNB (JAE,JNC) OPR CF = 0≤JBE (JNA) OPR CF∨ZF = 1>JNBE (JA) OPR CF∨ZF = 0* 适用于地址或双精度数低位字的比较(3) 比较两个带符号数,并根据比较结果转移* 适用于带符号数的比较格式测试条件<JL (JNGE) OPR SF∀OF = 1≥JNL (JGE) OPR SF∀OF = 0≤JLE (JNG) OPR (SF∀OF)∨ZF = 1>JNLE (JG) OPR (SF∀OF)∨ZF = 0(4) 测试CX 的值为0 则转移格式测试条件JCXZ OPR (CX)=0十八、循环指令注意:* CX 中存放循环次数* 只能使用段内直接寻址的8 位位移量* 不影响标志位LOOPLOOPZ / LOOPELOOPNZ / LOOPNE执行步骤:(1) (CX) ←(CX) – 1(2)检查是否满足测试条件,如满足则(IP) ←(IP) + 8位位移量,实行循环;不满足则IP 不变,退出循环循环指令:LOOP OPR测试条件:(CX) ≠ 0为零或相等时循环指令:LOOPZ(LOOPE) OPR测试条件:ZF=1 且(CX) ≠ 0不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR测试条件:ZF=0 且(CX) ≠ 0十九、例:求首地址为ARRA Y 的M 个字之和,结果存入TOTAL MOV CX, MMOV AX, 0MOV SI, AXAGAIN:ADD AX, ARRAY[SI]ADD SI, 2LOOP AGAINMOV TOTAL, AX二十、串处理指令∙串处理指令∙串重复前缀LODSB / LODSW REPSTOSB / STOSW REPE / REPZMOVSB / MOVSW REPNE / REPNZSCASB / SCASWCMPSB / CMPSWLODS 从串取指令:LODS SRCLODSB (字节)LODSW (字)执行操作:字节操作:(AL)←((SI)), (SI)←(SI)±1字操作:(AX)←((SI)), (SI)←(SI)±2注意: * LODS 指令一般不与REP 联用* 源串一般在数据段中(允许使用段跨越前缀来修改),目的串必须在附加段中* 不影响条件标志位STOS 存入串指令:STOS DSTSTOSB (字节)STOSW (字)执行操作:字节操作:((DI))←(AL), (DI)←(DI)±1字操作:((DI))←(AX), (DI)←(DI)±2MOVS 串传送指令:MOVS DST, SRCMOVSB (字节)MOVSW (字)例:MOVS ES: BYTE PTR [DI], DS: [SI]执行操作:(1) ((DI)) ←((SI))(2) 字节操作:(SI)←(SI)±1, (DI)←(DI)±1字操作:(SI)←(SI)±2, (DI)←(DI)±2方向标志DF=0 时用+ ,DF=1 时用- 。