




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、08嵌入式软件专业汇编考试复习资料(豆豆整理,翻版必究)汇编复习资料第一章 汇编语言基础(基础)1.十进制,二进制,八进制,十六进制之间的转化;2.位(b),字节(B),字(W),双字(DW)之间的关系;3.无符号数和有符号数的表示;有符号数原码,反码,补码之间的转换;补码的扩展(符号扩展);补码的运算(溢出的判断);4.存储器:数据组织(小端对齐),地址书写格式,读写操作(注意地址格式,字节地址,字地址,双字地址),存储器的分段(段基址,偏移地址,逻辑地址,物理地址之间的关系); 逻辑地址的表示:段基址:偏移地址; 物理地址=段基址*16+偏移地址;5.指令和程序:指令(机器指令,符号指令)
2、,机器指令(操作码,操作数);6.80x86寄存器:(1)数据寄存器:a.AX累加器:b.BX基址寄存器:存放数据,存放基址;c.CX计数寄存器:存放数据,存放重复操作的次数;d.DX数据寄存器:存放数据,存放32位数据的高16位,有时存放端口地址;(2)地址寄存器:a.SP堆栈指针:存放堆栈顶的偏移地址;b.BP基址指针:存放堆栈中数据的偏移地址;c.SI源变址寄存器:存放源数据区的偏移地址;d.DI目的变址寄存器:存放目的数据区的偏移地址;(3)段寄存器:a.CS代码段寄存器:存放当前正在执行的程序段的段基址; b.SS堆栈段寄存器:存放堆栈段的段基址;c.DS数据段寄存器:存放当前正在使
3、用的数据段段基址; d.ES附加段寄存器:存放另一个数据段的段基址;(4)专用寄存器:a.IP指令指针:存放即将执行指令的偏移地址;b.FLAGS标志寄存器:存放CPU的两类标志(状态标志,控制标志);a.状态标志:OF(溢出标志,1表示溢出,0表示没有溢出);CF(进位/借位标志,1表示有进位或借位,0表示没有);SF(符号标志,1表示最高位为“1”,0表示最高位为“0”);ZF(零标志,1表示运算结果为零,0表示不为零);AF(辅助进位标志);PF(奇偶标志,1表示运算结果的低8位中有偶数个“1”,0表示有奇数个);b.控制标志:IF(中断允许标志),TF(单步标志),DF(方向标志);(
4、了解)第二章 数据定义与传送1.数据:变量,常数,缓冲区2.数据段(保留字,汇编语句,注释的使用);3.数据段定义:DB:定义字节数据,每个数据占用1B的存储器;(1)有符号数用补码存储;(2)可以用单或双引号括起来的单个或多个字符,每个字符占1B,按他们出现的顺序用ASCII代码存储;(3)可以出现简单的可以求出值的表达式;(4)“?”表示一个尚未确定的值,在程序运行时写入,一般先用“0”来填充这个单元;(5)数据在一行写不下时,可以另起一行,但不能写相同的变量名;(6)DUP为重复定义符,表示定义若干个相同的数据;(7)汇编程序根据段定义分配存储空间,按序安排数据存放;DW:定义字数据,每
5、个数据占用2B的存储器,数据的高位存放在地址较大的单元里;数据部分的变量名代表该变量偏移地址;DD:定义双字数据,每个数据占用4B的存储器,数据的高位存放在地址较大的单元里;DQ,DT分别用来定义8B,16B的数据(了解);4.指令格式:标号: 操作码 操作数 ;注释操作数:目的操作数,源操作数;源操作数参与指令操作,但是不保存结果,内容不改变;目的操作数参与指令操作,保存指令操作结果,指令执行后,内容改变;5.操作数类型:寄存器操作数,立即数操作数,存储器操作数;(1)寄存器操作数:包括段寄存器和通用数据,地址寄存器;*寄存器IP/EIP和FLAGS/EFLAGS不能作为操作数出现在指令中,
6、但可间接对其操作;(2)立即数操作数:二进制,十进制,十六进制常数,可求职的表达式,字符,标号等都可以用作操作数;例:MOV BX,300或者MOV BX,150*2 正确但:X DW 150 MOV BX,X*2 错误原因:变量的值在程序运行期间可以随时改变,汇编程序无法对一个变化的值事先进行计算,变量的计算应该在用户程序执行时进行;*立即数不能用作目的操作数;(3)存储器操作数(后续理解)6.存储器操作数(段基址,偏移地址)大多数情况下指令使用DS寄存器的内容作为操作数的段基址,指令中不需要再指出段基址;有效地址:存储器操作数的偏移地址可以由几个部分组合而成,合成后得到的偏移地址;(1)直
7、接地址:指令中直接写出存储单元的偏移地址;*源操作数和目的操作数的类型要匹配,至少有一个操作数为明确类型;例:a.假设DATA段基址已装入DS,若要把变量(数组)A的前两个字节数据送BL,BH寄存器: MOV BL, A ; 也可以写作 MOV BL, A MOV BH, A+1 ; 或MOV BH, A+1 ,MOV BH, A1可否这样写:MOV BX, A ;把变量A送BL,变量A+1送BH 不可以b.假设已经定义:X DW150 MOV BX, X 正确,16位传送指令 MOV BL, X 错误,操作数类型不匹配c. MOV AL, 2100H 正确,8位传送指令,2100H是字节地址
8、MOV AX, 2100H 正确,16位传送指令,2100H是字地址*偏移地址外的方括号不能省略,否则程序会将其当成立即数对待;(2)间接地址(寄存器间接寻址):把存储单元的偏移地址事先装入某个寄存器,需要时通过寄存器找到存储单元;(OFFSET的使用)BX,BP,SI,DI四个寄存器可以用来间接寻址,使用BP寄存器时自动用SS的值作为段基址,使用其他寄存器时用DS的值作为段基址; 实地址模式下,偏移地址用16位二进制表示;例:已经定义:A DB 12, 34 将两个字节数据à(BX) MOVSI, OFFSET AMOVBL, SIMOVBH, SI+1 ;也可写作MOV BH,
9、1SI可否这样做:MOV BX,SI? 可以的7.程序段常见格式:CODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AX;其他指令MOVAX, 4C00HINT21HCODEENDSENDSTART*使用BX、SI、DI寻址,隐含对DS段进行操作;*为了对其他段内存储单元寻址,必须显式指明段地址;例:DATASEGMENTADB55DATAENDSEXTRASEGMENTXDB10EXTRAENDS ASSUME DS: DATA, ES: EXTRAMOV AX, DATAMOV DS, AXMOV AX, EXTRAMOV
10、 ES, AX变量A和X的偏移地址都是0000H。MOV AL, A ;按 MOV AL, DS:0000H 格式汇编,执行后(AL)=55,正确。MOV DL, X ; 按 MOV DL, ES:0000H 格式汇编,执行后(DL)=10 ,正确。但如果:MOV SI, OFFSET A ;A的偏移地址装入SIMOV DI, OFFSET X ;X的偏移地址装入DIMOV AL, SI ;取A的值送ALMOV DL, DI ;取X的值送DL执行的结果:(AL) = 55 正确,(DL) = 55 错误!9.完整的汇编语言源程序:处理器选择伪指令,数据段定义,代码段定义,程序结束伪指令;10.
11、基本传送指令(1)MOV(传送)指令MOV AX, BX ;源操作数BX的内容被复制到AX寄存器内,源操作数BX的内容保持不变,目的操作数AX的原内容被覆盖。源操作数可以是寄存器、存储器、立即数;目的操作数可以是寄存器、存储器。MOV指令的使用规则:a. 源/目的操作数必须类型匹配、明确;b. 源操作数与目的操作数可以是字节,字或双字,但必须具有相同的类型;c. 源操作数与目的操作数不能同时为存储器操作数;d. 目的操作数不能为立即数;e. FLAGS,EFLAGS,IP,EIP不能用作操作数;f. 对于段寄存器作为操作数的MOV指令: 源操作数与目的操作数不能同时为段寄存器; 目的操作数为段
12、寄存器时,源操作数只能是寄存器或存储器,不能是立即数; CS不能用作目的操作数;g. 操作数范围;例:a. 寄存器、寄存器操作数正确:MOVCL, DH ;字节传送指令,DH寄存器内容送入CLMOVAX, CS ;字传送指令,CS寄存器内容送入AXMOVSS, CX ;字传送指令,CX寄存器内容送入SS错误:MOVCL, DX ;操作数类型不匹配MOVCS , AX;CS不能作为目的操作数MOVDS, CS ;源操作数和目的操作数不能同时为段寄存器b. 立即数、寄存器操作数正确:MOVAL, 30H ;字节传送指令,执行后(AL)= 30HMOVAX, 30H ;字传送指令,执行后(AX)=
13、0030HMOVAL, -5 ;字节传送指令,执行后(AL)= 0FBHMOVAX, -5 ;字传送指令,执行后(AX)= 0FFFBH错误:MOV 30H, AL ;立即数不能用作目的操作数MOV AL, 300 ;源操作数超出范围c. 存储器、寄存器操作数正确:假设变量X_BYTE用DB定义,变量Y_WORD用DW定义MOVBP, BL ;字节传送指令,BL寄存器内容送SS:BPMOVBX, AX ;字传送指令,ALàDS:BX, AHàDS:BX+1错误:MOV DX, BL ;DX不能用于间址MOV X_BYTE, AX ;操作数类型不匹配d. 存储器、立即数操作数
14、正确:假设变量X_BYTE用DB定义,变量Y_WORD用DW定义MOVX_BYTE, -5 ;字节传送指令,-5(0FBH)送X_BYTEMOVY_WORD, -5 ;字传送指令,-5(0FFFBH)送Y_WORD错误:MOVX_BYTE, 300 ;源操作数超出范围MOVBX, 30H ;操作数类型不能确定*使用立即数作为源操作数时,该立即数会按照目的操作数的类型进行扩展,如果立即数本身没有符号,进行“零扩展”,如果立即数本身有符号,则进行“符号扩展”;*“ type PTR” : 指定或强行改变操作数类型;(2)LEA(装载有效地址)指令LEA REG16, MEM ;将MEM的偏移地址装
15、入16位数据寄存器,等效于:MOV REG16,OFFSET MEM11.其他传送指令 (1)扩展传送指令CBW,CWD操作:8位操作数扩展为16位,或把16位操作数扩展为32位,送目的RCBW:将AL寄存器内容符号扩展成16b,送AXCWD:将AX寄存器内容符号扩展成32b, 送DX(高16位)和AX(低16位)注意两点:1.符号扩展;2.隐含操作数;例:设有(AX)= 8060H CBW ;(AX)= 0060H CWD ;(DX)= 0FFFFH,(AX)= 8060H (3)交换指令XCHGXCHG REG/MEM,MEM/REG操作:交换源/目的操作数内容格式要求:与MOV指令相同
16、例: (AX)= 5678HXCHGAH, AL;(AX)= 7856H*两个操作数有相同的类型,而且不能同为存储器操作数;(4)换码(查表)指令XLAT格式:XLAT操作:ALDS: BX+AL结果:AL中原来位移量被MEM替换指令执行准备:表格的首地址事先存放在DS: BX中,换码单元位移量事先存放在AL中。12堆栈堆栈(STACK)是用户使用的存储器的一部分,用来存放临时性的数据和其他信息,数据结构较普通存储单元特殊;地址增大堆栈的段基址必须放在SS中,SP始终自动指向“栈顶”。(1)堆栈结构堆栈段的定义:SSEG SEGMENT STACK ;堆栈段开始 DW100 DUP(?);大小
17、为100个字SSEG ENDS ;堆栈段结束程序装入时,SSEG段址àSS,堆栈段字节数0C8HàSP;(2)堆栈段特点a.从较大地址开始分配和使用(其他段从较小地址开始分配和使用);b.数据入栈时,SP自减2,数据出栈时,SP自增2;c.SP始终自动指向“栈顶”,数据总是在“栈顶”压入或弹出(SP变化);d.先进后出(First In Last Out, FILO) 后进先出(Last In First Out, LIFO)(3)堆栈操作:以字为基本单位*SP的移动,逻辑地反应堆栈的变化,堆栈段物理结构不变;(4)8086CPU堆栈指令Intel8086是16位微处理器,
18、它的堆栈指令只支持2B操作数;a. PUSH(压栈)指令:把16b源操作数入栈;PUSH REG16/MEM16/SEG指令执行后,操作数的内容不变,该指令的执行不影响标志位;不支持立即数操作数;bPOP(出栈)指令:从堆栈栈顶弹出16b,存入目的操作数;POP REG16/MEM16/SEG指令执行后,操作数的内容被更新,该指令的执行不影响标志位;CS不能做操作数;13.操作数表达式(1)符号定义伪指令:a.汇编时,对EQU定义的符号名用对应的表达式进行替换;b.使用等号“=”定义符号名时,只能用常数表达式,而且对一个符号名可以多次定义,一个新的定义出现后,原来的定义自动终止;c.用EQU定
19、义的符号名不允许重复定义;(2)地址表达式:a. +,运算符对构成有效地址的各个分量进行“加”、“减”操作;b. “ ”称为“索引运算符”,用来组成有效地址的一个分量,各分量相加,得到最后的有效地址;(3)立即数表达式:a.立即数表达式在汇编源程序时计算,结果用作立即数操作数;b.表达式中运算对象必须“已知” ,否则无法进行计算;c.用于产生立即数操作数的表达式有4类运算符:算术运算符、逻辑运算符、关系运算符、地址运算符;算术运算符:+ (相加), (相减), * (相乘), / (整除运算), MOD(取余数)运算优先级从高到低依次为:(*,/)(MOD)(+,)逻辑运算符:SHR(右移)、
20、SHL(左移)、AND(逻辑与)OR(逻辑加)XOR(异或,半加)、NOT(逻辑非、取反) 运算优先级从高到低依次为:(SHL、SHR)(NOT) (AND) (OR、XOR)关系运算符:关系运算符用于两个数的比较,结果为“真(-1)”或“假(0)”GT(大于)、GE(大于或等于)、LT(小于)、LE(小于等于)、EQ(等于)、NE(不等于)地址运算符变量名、标号、地址表达式进行计算,得到作为立即数的运算结果a.SEG: 取地址表达式所在段的段基址例:变量LIST定义在DATA段,把DATA段的段基址装入AX: MOV AX, DATA ;DATA代表该段的段基址,立即数MOV AX, SEG
21、 DATA ;取DATA的段基址,立即数MOV AX, SEG LIST ;取LIST的段基址,立即数b.OFFSET:取地址表达式的偏移地址例:比较:MOV AX, LIST;取出变量LIST第一个元素送入AX MOV AX, OFFSET LIST ;取出变量LIST的偏移地址送入AXc.TYPE,LENGTH,SIZE这三个运算符仅仅对变量名,标号进行操作,分别用于取变量,标号的类型,取变量定义时的元素个数,取变量占用的字节数;*注意:所有的表达式都必须在汇编期间可以求值,“寄存器数表达式”的形式是不存在的; 例如:MOV AX, BX+2 ;错误 MOV AX,BX+2 ;正确14.汇
22、编语言上机操作(汇编工具:MASM宏汇编)(1) 编辑源程序:源程序文件要以.ASM为扩展名;(2) 汇编源程序(将源程序翻译成由机器代码组成的目标模块文件的过程)汇编格式:MASM show.asm 或 MASM show;如果源程序无语法错误,MASM将为程序自动生成目标模块文件(show.obj);否则报错。这时应根据错误信息修改源程序后,再进行汇编;(3) 连接目标程序连接格式:LINK show.obj 或 LINK show;如果无严重错误,LINK将生成可执行文件 show.exe;否则将报错。这时应根据错误信息重新修改源程序后再汇编、链接,直到生成可执行文件;(4) 调试可执行
23、程序调试格式:DEBUG show.exe ,后缀不可省;DEBUG.exe 是DOS提供的调试程序; DEBUG程序采用命令行方式;DEBUG主要命令:第三章 数据运算与输入输出1.算术运算指令的特点:a.加减法指令不区分有/无符号数;b.乘除法指令区分有/无符号数;c.算术运算指令执行结果对状态标志位有影响;2.加法指令(1)ADD:加法指令格式:ADD目的操作数,源操作数功能:目的操作数目的操作数+源操作数目的操作数:8/16/32位的寄存器数/存储器数源操作数:与目的操作数同类型的寄存器/存储器/立即数*容易出现的两种错误: ADD AL,BX ;类型不匹配ADD SI, 5 ;类型不
24、明确,如果目的操作数是字节单元,可以修改如下:ADDBYTE PTR SI, 5说明:a.加法指令执行后,CPU的状态标志CF,OF,ZF,SF,PF,AF按照运算结果被刷新;b.操作数可以是8位,16位或32位,源操作数与目的操作数应该有相同的类型,不能同时为内存操作数;(2)ADC:带进位的加法指令格式:ADC目的操作数,源操作数功能:目的操作数目的操作数+源操作数+CF目的操作数:8/16/32位的寄存器/存储器源操作数:与目的操作数同类型的寄存器/存储器/立即数说明:a.该指令对标志位的影响、对操作数的要求与ADD指令相同;b.用途:多字节数据分段相加时,高位的加法运算;*数据的扩展a
25、.对无符号数运算,需0扩展如:将无符号字节数20H扩展为16位 MOV AL,20H MOV AH,0 ;(AX) ß0020H,0扩展 b.有符号数以补码形式存储,需符号扩展如:对有符号数0FFH进行符号扩展 MOV AL,0FFH ;-1的8位补码CBW ;(AX)ß0FFFFH,-1的16位补码,符号扩展c.当需要扩展计算规模时,无符号数先分段计算或先扩展再计算均可,而有符号数只能先扩展,再计算;(3)INC:增量指令格式:INC目的操作数功能:目的操作数目的操作数+1目的操作数:8/16位寄存器/存储器说明:a.指令执行后,OF, ZF, SF, PF, AF按照运
26、算结果被刷新,但CF不受影响;b.增量指令常用于修改计数器的值或移动地址指针;3.减法指令(1)SUB:减法指令格式:SUB目的操作数,源操作数功能:目的操作数目的操作数-源操作数目的操作数:8/16位的寄存器数/存储器数源操作数:与目的操作数同类型的寄存器/存储器/立即数说明:对标志位的影响、对操作数的要求与ADD指令相同;(2)SBB:带借位的减法指令格式:SBB目的操作数,源操作数功能:目的操作数目的操作数-源操作数-CF目的操作数:8/16位的寄存器/存储器源操作数:与目的操作数同类型的寄存器/存储器/立即数说明:a.该指令对标志位的影响、对操作数的要求与ADD指令相同;b.用途:多字
27、节数据分段相减时,高位的减法运算;(3)DEC:减量指令格式:INC目的操作数功能:目的操作数目的操作数-1目的操作数:8/16位寄存器/存储器说明:a.指令执行后,OF, ZF, SF, PF, AF按照运算结果被刷新,但CF不受影响;b.减量指令常用于修改计数器和存储器指针的值;(4)NEG:求补指令,求相反数格式:NEG目的操作数功能:目的操作数0-目的操作数 目的操作数:8/16位寄存器/存储器数说明:指令执行后,除非目的操作数为零时,CF=0,其余情况均为1;4.乘法和除法指令(区分有/无符号数运算)(1)MUL:无符号数乘法格式:MUL 源操作数 ;此源操作数为乘数,另一源操作数(
28、被乘数)àAL/AX源操作数:8位/16位寄存器/存储器数功能:8位源操作数:AX(AL)×源操作数 16位源操作数:(DX, AX)(AX)×源操作数说明:a.两个N位操作数相乘,最多得到2N位的乘积;b.如果乘积高N位为0,则CF=OF=0,否则CF=OF=1,其余标志位无意义,可用来检测积的类型。(2)IMUL:有符号数乘法格式1:IMUL 源操作数源操作数:8位/16位寄存器/存储器数功能:8位源操作数时:AX(AL)×源操作数 16位源操作数时:DX, AX(AX)×源操作数说明:a.两个N位操作数相乘,得到2N位的乘积;b.如果乘积
29、高N位为低N位的符号扩展,则CF=OF=0,否则CF=OF=1,其余标志位无意义;c.相同数据分别用MUL和IMUL运算,可能得到不同结果;例:(AL) = 0FFH, (X) = 2MUL X;(AX) = 01FEH,(255×2 = 510) CF=OF=1IMUL X;(AX) = 0FFFEH,(1×2 = 2) CF=OF=0(3)DIV:无符号数除法格式:DIV源操作数 ;此为除数,另一源操作数(被除数)àAX/(DX,AX) 源操作数:8位/16位寄存器/存储器数功能:8位源操作数时: (AX)÷源操作数,AL商,AH余数16位源操作数时
30、:(DX, AX)÷源操作数,AX商,DX余数说明:a.两个N位无号操作数相除,先把被除数零扩展为2N位;b.如果(2N位)÷(N位)的商绝对值大于2N-1,会产生“除法溢出”错误;c.源操作数不能为立即数;(4)IDIV:有符号数除法格式:IDIV 源操作数 ;除数源操作数:8位/16位寄存器/存储器数功能: 8位源操作数时:(AX)÷源操作数,AL商,AH余数16位源操作数时:(DX, AX) ÷源操作数,AX商,DX余数说明:a.两个N位操作数相除,先把被除数符号扩展为2N位;b.两个有符号数相除,余数与被除数同号: 10 IDIV 3;商= 3,
31、 余数= 1 10 IDIV 3 ;商= 3, 余数= 1c.如果(2N位)÷(N位)的商大于2N-1-1或者小于-2N-1,会产生“除法溢出”错误。d.源操作数不能为立即数;5.表达式计算表达式计算应注意的问题:a.确定操作数类型(字节/字运算)b.确定运算顺序c.区分有/无符号数的运算d.合理分配寄存器的使用避免冲突 e.使用除法指令前,被除数规模扩展至除数2倍 6.循环(1)基本循环语句格式: 标号: ;循环体 LOOP 标号功能:CX(CX)1,若(CX) 0,转向“标号”处执行,否则执行后续指令;说明:a.LOOP可以改变指令执行次序,称为“控制指令或跳转指令”;b.循环体
32、重复执行,CX装载循环次数,因此称为 “计数器”;c.使用LOOP的前提是循环次数已知;例:MOVCX, 10L1: ;循环体 LOOP L1功能:将L1到LOOP L1之间的一段程序重复执行10次。指令“MOV CX, 10”称为“装载循环计数器”, 在循环之前完成,否则易形成死循环;(2)基本循环改用循环实现简化程序结构,须作一定的准备工作:a. 装载循环计数器CX;b. 设置地址指针,指向数组首址;循环处理过程:a. 每次循环将指针指向的单元内容清零;b. 地址指针移动,指向下一个单元,为下一次作准备;c. CX自减;(3)循环指令的使用方法:适用于对多个数据进行相同的操作;循环执行前须
33、做如下准备工作:a.计数器CX初始化;b.地址指针初始化;c.其他循环中应注意:a.执行要求的操作;b.移动地址指针;7.循环的应用(1)数据的累加求累加和循环程序的结构:a.循环准备:循环开始前,累加器、计数器、指针初始化,每条指令执行一次;b.循环体:数据累加、指针移动、循环计数控制,每条指令执行多次;c.结束处理:循环结束后,保存累加和,执行一次;(2)多项式计算准备工作:a. 简化考虑:假定多项式的值可用16b有号数存储;b. 循环次数= 多项式项数(按照降幂全部写出时);c. 地址指针初始化;8.逻辑运算(1)逻辑运算是位运算,各位之间没有相互进位的关系,逻辑运算指令执行后,CF、O
34、F被清0,SF,PF,ZF按结果设置;(2)AND 逻辑乘(逻辑与)指令格式:AND 目的操作数,源操作数 功能:源操作数和目的操作数进行逻辑乘(按位相与),结果送目的操作数;说明:a. 使用AND指令可以对操作数有选择地部分清零;b. 对操作数类型的要求与ADD指令相同。例: MOVAL,7;(AL) = 37HANDAL, 0FH ;(AL)=07H, 字符7转换成二进制数例:ANDCX, 0;(CX) = 0, 同时CF = OF = 0, ZF = 1(3)OR 逻辑加(逻辑或)指令格式:OR 目的操作数,源操作数 功能:将目的操作数和源操作数按位相或,结果送目的操作数;说明:a. 使
35、用OR指令可以有选择地将操作数的某些位置1;b. OR指令对操作数类型的要求与ADD指令相同;例: MOV AL, 7 ;(AL) = 07HOR AL, 30H ;(AL) = 37H,二进制数7转换成字符7 例:OR AX, AX ;AX的值不变,CF = OF = 0(4)XOR逻辑异或(半加)指令格式:XOR目的操作数,源操作数功能:将目的操作数和源操作数进行异或运算,结果送目的操作数;说明:使用XOR指令可以有选择地将操作数的某些位取反;对操作数类型的要求与ADD指令相同;例:MOV AL, 35H ;(AL)=35H XOR AL, 0FH ;(AL)=3AH,高4位不变,低4位取
36、反例:XOR AX, AX ;将AX清零,同时CF = OF = 0;等价于SUB AX,AX(5)NOT逻辑非(取反)指令格式:NOT目的操作数功能:将目的操作数按位取反。例:MOVAL, 35H ;(AL)= 35H=0011 0101B NOTAL ;(AL)= 0CAH=1100 1010B, 各位取反注意:NOT指令对标志位无影响9.控制台输入和输出(1)字符的输出向显示器输出信息有三种方法:a.通过DOS系统功能调用(INT 21H)输出;b.通过“基本输入输出系统(BIOS)” 输出(即BIOS显示功能 调用:INT 10H);c.把显示内容(ASCII代码)直接写入显存,由显示
37、器接口电路转换输出(直接写屏输出)。输出单个字符: DL 待输出字符的ASCII代码 AH 02H INT 21H简单的显示格式控制:a.代码为0DH的字符称为“回车(Carriage Return, CR)”,把光标移动到本行的第一个字符位置,b.代码为0AH的字符称为“换行(Line Feed, LF)”,把光标移动到下一行的相同位置上。输出一个字符串定义字符串时,以字符 “$” 为结束标志,该字符本身不输出。 DS: DX 待输出字符串的首地址AH 09HINT 21H说明:a.每一数位以ASCII码的形式按位输出;b.调整待输出数位的顺序;c.注意数、码之间的转换;(2)字符的输入AH
38、01INT 21H 键盘输入字符后返回,ASCII码自动存入AL中,同时回显。AH07INT 21H 键盘输入字符后返回,ASCII码在AL中,无回显。AH08INT 21H 键盘输入字符后返回,ASCII码在AL中,无回显。同时检测Ctrl+Break和Ctrl+C键的组合。(3)字符串的输入:字符串默认存于特定格式缓冲区中a. 指令格式:DS: DX输入缓冲区首地址AH0AHINT 21Hb.输入缓冲区格式:第一字节:定义字符存放区的大小;第二字节:输入完成后服务程序自动填入输入字符的实际个数,不含回车;第三字节之后:输入字符存放区,按序存放输入的字符和回车;说明:a.字符串输入时,缓冲区
39、定义的格式b.循环次数的取得方式: MOV CL,BUFFER+1 MOV CH,0 c.缓冲区首址的装载:LEA BX,BUFFER+2d.缓冲区容量不能超过255Be.数、码间的转换10.移位和处理器控制(1)移位指令(将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作)移位指令的操作数;a.移位指令的第一个操作数是被移位的操作数,可以是寄存器或存储单元;b.后一个操作数表示移位位数,该操作数为1,表示移动一位;当移位位数大于1时,则用CL装载移位次数;移位指令对标志位的影响:a.按照移入的位设置进位标志CF;b.根据移位后的结果影响SF、ZF、PF;c.对AF没有定义
40、;d.如果进行一位移动,则按照操作数的最高符号位是否改变设置OF:如果移位前后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。移位次数大于1时,OF不确定;*逻辑左移一位相当于无符号数乘以2,逻辑右移一位相当于无符号数除以2(2)循环移位指令(将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作)循环移位指令对标志位的影响:a.按照指令功能设置进位标志CF;b.不影响SF、ZF、PF;c.对AF无定义;d.如果进行一位移动,则按照操作数的最高符号位是否改变设置OF:如果移位前后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当
41、移位次数大于1时,OF不确定;第四章 选择和循环1.按照指令执行顺序,可将程序结构划分为三种基本结构:a.顺序结构:程序按编写顺序执行,每条指令只执行一次;b.循环结构:构成循环体的一组指令被反复地执行;c.选择结构:根据某个条件决定部分指令被执行,另一部分指令不执行,这样的程序称为“选择或分支结构”的程序;2.无条件转移指令格式:JMP 目的位置 ;执行JMP指令后,程序转移到新的“目的位置”执行JMP指令使程序无条件转至标号所指的目标地址处,从目标地址处开始执行那里的指令操作数label是要转移到的目标地址JMP指令分成4种类型(远近,寻址方式):a.段内转移、直接寻址b.段内转移、间接寻
42、址c.段间转移、直接寻址d.段间转移、间接寻址(1)目标地址的寻址方式直接寻址方式:转移地址像立即数一样,直接在指令的机器代码中,就是直接寻址方式;间接寻址方式:转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式;(2)目标地址的范围段内(近程):汇编程序将JMP指令汇编为如下格式:操作码(1B)+位移量位移量:目标地址与当前IP之差,也即代表转移的范围,位移量可正可负,以满足向前/向后转移的需要;段内转移短转移(short):转移范围(位移量)可用1B表达,在段内128B127B范围的转移;段内转移近转移(near):在当前代码段64KB范围内转移,不需要更改CS段地址,只要
43、改变IP偏移地址;段间(远程)汇编程序将JMP指令汇编为如下格式:操作码(1B)+段内偏址(2B)+段址(2B)执行后:段内偏址à(IP) 段址à(CS) 段间转移远转移(far):从当前代码段跳转到另一个代码段,可以在(整个内存)1MB范围内跳转;同时更改CS段地址和IP偏移地址;目标地址必须用32位数表达,叫做32位远指针,也即逻辑地址;3.比较和测试指令(1)CMP(Compare, 比较)指令指令格式:CMP 目的操作数,源操作数目的操作数:8位/16位/32位的寄存器/存储器操作数。源操作数:与目的操作数同类型的寄存器/存储器/立即数。功能:目的操作数-源操作数,
44、保留运算产生的标志位,不保留运算的差。用来比较两个有符号数或无符号数的大小。 *两个数的大小 对于有符号数:OFSF= 0, 目的操作数源操作数1. 同号相减。 2. 正数 负数。OFSF= 1, 目的操作数源操作数1. 同号相减。2. 负数-正数。对于无符号数:CF=0,目的操作数源操作数CF= 1, 目的操作数源操作数例:假设存储器变量(X)= 80H,指令“CMP X, 5”执行后:ZF=0(X) 5OF=1 SF=0 如果X视为有符号数,X<5CF=0 如果X视为无符号数,X>5(2)TEST(Test,测试)指令指令格式:TEST 目的操作数,源操作数目的操作数:8位/1
45、6位/32位的寄存器/存储器操作数。源操作数:与目的操作数同类型的寄存器/存储器/立即数。功能:TEST指令将目的操作数与源操作数进行逻辑乘运算,保留运算产生的各标志位,但是不保留结果。该指令用来测试目的操作数中某几位二进制的特征。4.条件转移指令条件转移指令格式:Jcclabel“J”:条件转移指令操作码的第一个字母“cc”:代表转移条件,13个字母“label”:目标地址标号。(1)根据两个有符号数比较结果的条件转移指令两个有符号数的比较结果通过OF,SF,ZF反映出来 G (Greater,大于) L (Less,小于) E (Equal,等于) N (Not,否)例: JG/JNLE
46、大于(不小于等于)则转移 JNL/JGE 不小于(大于或等于)则转移 JE/JZ 等于(为零)则转移根据有符号数比较结果的条件转移指令:(2)根据两个无符号数比较结果的条件转移指令 无符号数比较结果通过CF,ZF反映,代表转移条件的字母可有:A(Above,高于) B(Below,低于) E(Equal,等于)根据无符号数比较大小结果的条件转移指令(3)根据单个标志位的条件转移指令通过单独判断其他状态标志构成跳转条件:a.JZ/JE和JNZ/JNE:判断结果是否为零(或相等)b.JS和JNS:判断结果是正是负c.JO和JNO:判断结果是否溢出d.JP/JPE和JNP/JPO:判断结果低8位中“
47、1”的个数是偶是奇e.JC/JB/JNAE和JNC/JNB/JAE:判断结果是否进位或借位(4)根据CX寄存器值的条件转移指令指令格式:JCXZLabel;若CX=0,转移到Label,指令为短转移。5.选择结构程序(1)基本选择结构程序思路及要点:a.健壮性:对输入是否符合要求进行判断;即使输入符合要求,也要对前导/后继是否字符进行判断,是则输出,否则跳过;b.程序跳转方向;(2)单分支选择结构(基本选择结构的一个分支为“空”,双分支在一定条件下可转为单分支)(3)复合选择结构(选择结构一个分支的程序中又出现了选择结构)*每个分支结尾一定要使用JMP;(4)多分支选择结构(选择分支多于2个)
48、6.循环结构程序(1)循环结构一般由以下4个部分组成:a.初始化:循环准备:累加器清零,地址指针和计数器初始化等;b.工作部分:按照功能要求的具体指令执行;c.修改部分:修改指针、修改计数器的值,为下一次循环做准备;d.控制部分:判断循环条件,结束循环或继续循环。可前可后!(2)按照循环结束的条件,有以下两类循环:a.计数循环:循环次数事先已知,用一个变量(REG或MEM)记录循环次数(称为“循环计数器”);b.条件循环:循环的次数事先并不确定,每次循环开始时或结束后测试某个条件,根据这个条件是否满足决定继续循环与否;(3)两种结构的循环:a.WHILE循环:进入循环后,先判断循环结束条件,条
49、件满足则退出循环,否则继续循环(JMP),循环次数最少为0次;b.DO-WHILE循环:进入循环后,先执行,然后判断继续循环的条件,条件满足则继续循环,循环次数最少1次;(4)循环指令LOOPLabel ;先CXCX-1,若(CX)0,转移到LabelLOOPZ/LOOPE Label;先CXCX-1,若(CX)0且ZF=1,转移到LabelLOOPNZ/LOOPNELabel;先CXCX-1,若(CX)0且ZF=0,转移到Label循环指令采用相对寻址,Label距离IP必须在-128B+127B之内;可以用Jcc指令代替LOOP:DECCX ; CXCX-1JNZLabel ;若(CX)0
50、(也就是ZF=0),转移到Label*循环指令的执行不影响标志位;(5)计数循环(最简单、基本的循环组织方式,主要用循环计数器控制循环,有时也可以结合其它条件共同控制)(6)条件循环a.适用于循环次数未知 ;b.以某个条件是否满足作为继续或终止循环的条件;c.用条件转移指令进行跳转; d.计数循环是条件循环的特殊情况;*将计数循环改写为条件循环:逻辑标尺问题*转移条件设置指令应与条件转移指令相邻,否则出错;*对于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的循环,一般应在循环结束后用条件转移指令分开这两种情况,分别处理;第五章 子程序1.子程序把程序需要完成的任务分解为若干个“子任务”,每个“子任务”由一段相对独立的程序完成,称为“子程序”;调用子程序的程序称为“主程序”或者“主调程序”;子程序也称为“过程” 或“函数” ;子程序结构程序的优点:a.程序结构清晰,提高了程序的可阅读性和可维护性;b.每个子程序可以独立地进行调试,由于程序规模较小,降低了调试难度;c.每个子程序就是一个具有特定功能的独立的程序,提高程序的“可重用性”,提高了软件开发效率; 2.近程子程序a.与主调程序位于同一个代码段;b.调用和返回时只需要保存并改变IP;c.近程子程序的入口地址用16位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合作加工协议书合同
- 电视买卖合同
- 公积金贷款合同编号
- 山西劳动合同有几份
- 孩子家教服务合同
- 租房水电费合同协议书
- 手机维修协议合同
- 奶茶合同解约协议
- 煤矿合同到期补偿协议
- 免责协议模板合同
- GB/T 4857.22-1998包装运输包装件单元货物稳定性试验方法
- 2023年江苏信息职业技术学院高职单招(数学)试题库含答案解析
- 量化投资-统计套利
- GB/T 25074-2010太阳能级多晶硅
- GB/T 23842-2009无机化工产品中硅含量测定通用方法还原硅钼酸盐分光光度法
- GB/T 11047-2008纺织品织物勾丝性能评定钉锤法
- GB 18245-2000烟草加工系统粉尘防爆安全规程
- 特种陶瓷介绍课件
- 有机物污染(环境化学)课件
- 安全生产培训合格证书样本
- 绘制轴承座三视图课件
评论
0/150
提交评论