1、Click to edit Master text,Second level,Third level,Fourth level,Fifth level,*,Assembly,liuxzh,Assembly,Click to edit Master text,Second level,Third level,Fourth level,Fifth level,*,Assembly L,anguage,刘晓忠,学习汇编语言目的,学习汇编语言目的:,了解计算机底层的工作过程,硬件知识的上佳补充方法,系统开发的重要语言基础,学习汇编为系统程序开发重要阶段,硬件开发必不可少的知识,如:硬件驱动程序的开发
2、计算机安全技术中的重要手段,如:磁盘的加密与解密技术等,1.,机器语言与汇编语言,2.8088,、,8086,简介,3.,存储器的地址形成,4.,计算机内数据表示,Chapter One,预备知,识,5.,标志寄存器,1.,机器语言就是二进制代码组成的语言,机器语言,1.,机器语言与汇编语言,2.,每种计算机机器语言不同,3.,机器指令由操作码和操作数组成,1.,汇编语言就是机器语言的助记符,汇编语言,1.,机器语言与汇编语言,2.,汇编是低级语言,但也要“变成”机器语言,3.,汇编的源程序通过,Assembler,变成机器语言目标程序,4.,宏汇编就是加上宏命令与伪指令组成的汇编程序,5.
3、机器语言,汇编程序,宏汇编分别举例,1.,(,100,),50,这里,100,是地址,,50,是该单元内容,符号说明,1.,机器语言与汇编语言,2.,(,BX,),500,,寄存器,BX,的内容是,500,3.BX=50,BX,的内容是地址,而该地址的内容是,50,4.PA,代表物理地址,SA,代表段地址,,EA,代表偏移地址,5.OPD,代表目的操作数,,OPS,源操作数,,R,寄存器,1.,堆栈是一种数据存取方式。,采用“后进先出”的原则。使用堆栈段寄存器,SS,和,堆栈指示器,SP,构成堆栈操作地址,2.,压栈命令,PUSH,操作要点是,:,内容是字单位,,SP-2,连续在当前,SP,
4、位置存入,2,个字节,“高高,低,低”原则,出栈命令,POP,操作要点是,:,内容是字单位,连续在当前,SP,位置取出,2,个字节,“高高,低,低”原则,,SP+2,堆栈,3.,存储器的地址形成,1.,机器内,16,位寄存器形成,20,位物理,地址,必须,两个“加”起来。,2.,物理地址,段地址,16,偏移地址,代码地址:,PA=CS*16+IP,数据地址:,PA=DS*16+EA,或者:,PA=ES*16+EA,堆栈地址:,PA=SS*16+EA,3.,举例说明,从逻辑地址形成物理地址,3.,存储器的地址形成,1.,数值整数由补码表示:正数最高位为,0,,剩下表示绝对值。,负数最高位为,1,
5、剩下绝对值求反,再加,1,。,2.,给定字长,整数的表示范围:无符号与有符号的区别,如书,P21-,表,1.2,与,1.3,举例说明,整数数值数据,4.,计算机内数据表示,1.,BCD,码的意思是:用二进制表示十进制。,2.,分为:,4,位二进制表示一位十进制数(压缩型),8,位二进制表示一位十进制数(非压缩型),BCD,码,4.,计算机内数据表示,1.,字符在机内用,ASCII,码表示,2.,汇编内字符用 或“”标注,如:,X DB 3,Y DB 3,Z DB“ABC”,字符数据,4.,计算机内数据表示,1.,LAHF,将标志寄存器低,8,位送入,AH,2.,SAHF,将,AH,送入标志寄
6、存器低,8,位,标志位(,超连接,),5.,标志寄存器,1.,寄存器寻址,2.,寄存器间接寻址,3.,变址寻址,4.,基址加变址寻址,Chapter Two Addressing,5.,立即寻址,6.,直接寻址,7.,寻址问题讨论,8.,寻址综合举例,P43,1.,源操作数与目的操作数要匹配,操作数在寄存器中,1.,寄存器寻址,2.CS,不可作为目的操作数,3.,举例:,MOV AX,BX,MOV CH,DL,1.16,位中只可使用,BX,SI,,,DI,BP,之一,其它寄存器不得使用!,寄存器中内容是操作数地址,2.,寄存器间接寻址,2.,源操作数与目的操作数不可同时为寄存器间接寻址,3.,
7、举例并比较:,MOV AX,BX,MOV AX,BX,MOV SI,BX,MOV SI,BX,1.16,位中只可使用,BX,SI,,,DI,BP,之一,其它寄存器不得使用!,寄存器中内容是操作数地址,2.,寄存器间接寻址,2.,源操作数与目的操作数不可同时为寄存器间接寻址,3.,举例并比较:,MOV AX,BX,MOV AX,BX,MOV SI,BX,MOV SI,BX,1.16,位中只可使用,BX,SI,,,DI,BP,之一,其它寄存器不得使用!,寄存器加上位移量是操作数地址,3.,变址寻址,2.,几种写法:,MOV AX,2BX,MOV BX+2,CX,mov dx,bx+2,3.,举例并
8、比较:,MOV 2SI,ax,MOV SI,BX,MOV SI,BX,1.16,位中只可使用,BX,BP,与,SI,DI,配对使用,其它寄存器不得使用!,寄存器加上寄存器加位移量是操作数地址,4.,基址加变址寻址,2.,几种写法:,MOV AX,2BXSI,MOV BX+DI+2,CX,mov dx,bp+di,3.,举例并比较:,MOV BX+SI,Bx,MOV BP+SI,BX,1.,立即数就是常数,操作数就在代码中,5.,立即寻址,2.,目的操作数不可是立即数,3.,举例并比较:,MOV Bx,,,12,MOV bx,12,1.,直接地址形式,如:,MOV AX,20H,操作数在,”,内
9、存,”,中,6.,直接寻址,2.,变量形式,如:,MOV AX,X(X,是变量,),4.,举例并比较:,MOV Byte Ptr 100H,,,12,MOV Byte Ptr Y,12,MOV Byte Ptr Y+3,12,MOV Byte Ptr bx,12,Byte Ptr,作用是定义一个字节,3.,特别提醒:源与目的不可同时为“内存”不可以:,MOV Y,X(X,Y,是变量,),1.,无(隐含)操作数,如:,CBW,指令的操作数个数,7.,寻址问题讨论,2.,一个操作数,如:,INC AX,4.,寻址实际上就三种:寄存器、存储器和立即数,3.,两个操作数,如:,MOV AX,BX,5.
10、注意:,目的操作数不可是常数,存储器不可和存储器直接交换,段寄存器,只与通用寄存器或内存交换,代码段寄存器,CS,只能是源操作数,6.,段的问题:段的默认与跨段符号,CS:DS:ES:SS:,教科书,P43,例题,2.4,8.,寻址综合举例,1.,表达式,2.,常用机器指令,3.,伪指令语句,4.,常用,DOS,调用,Chapter Three Macro AL,5.MASM,功能,6.,7.,8.,寻址综合举例,P43,常量:翻译成目标程序时,确定的量就是常量,三种定义方法:,A1 EQU 55,MOV AX,A1,A2=54,MOV AX,A2,MOV AX,56,数值常量形式如书,P4
11、8,表,3.1,常量与数值表达式,1.Macro AL,中的表达式,2.,常数的数值表达式:,(,1),算术运算:,,*,,,/,,取余数,MOD,如:,MOV AX,7 MOD 5,则(,AX,),=2,(2,)逻辑运算:,and,or,not,xor,如:,MOV AX,5 AND 7,则(,AX,),=5,(3),关系运算,:EQ,NE,LT,GT,LE,GE,如:,MOV AX,5 EQ 7,则,(AX)=0,MOV AX,5 NE 7,则,(AX)=FFFFH,常量与数值表达式,1.Macro AL,中的表达式,1.,变量:变量就是存储单元地址的符号表示。,三个方面的信息:,地址属于
12、的段,地址的偏移量和变量的 类型(占几个字节),2.,变量定义:,DB,字节,,DW,字,,DD,双字,如:,A1 DB 23H,A2 DB 23H,24H,25H,A3 DW 1234H,2345H,A4 DD?(?,表示无确定值,只预留空间,),A5 DB abcde,A6 DB 6 DUP(34H),意思是,(Duplicate)6,个字节,,内容是,34H,,参考,P50,例题,1,和图,3.1,1.,变量,1.Macro AL,中的表达式,标号:标号就是机器语句地址的符号表示。,三个方面的信息:,地址属于的段,地址的偏移量和标号的 类型(,Near or Far,),如:,Begin
13、Mov Ax,1234h,这里,Begin,就是标号,S1 proc,这里,S1,是标号,限制在本段。,S2 proc far,这里,S2,是无限制的标号。,2.,标号,1.Macro AL,中的表达式,地址由运算符组合就构成地址表达式。,1),类型运算符,PTR(,有,Byte,Word,Near,Far,等类型,),如:,MOV Word Ptr 100h,100h,MOV Byte Ptr 200h,100h,Call Far Ptr Sub1(Sub1 Proc Far/Endp),2),跨段符号,CS:DS:ES:SS:,如:,MOV ax,ES:Bx,3,)取段地址的符号,Seg
14、如:,MOV AX,SEG A1,4),取偏移量的符号,OFFSET,如:,MOV AX,OFFSET A1,3.,地址表达式,1.Macro AL,中的表达式,1.,共有,6,类指令:,1,)数据传送,2,)算术运算,3,)位操作,4,)串操作,5,)控制转移,6,)处理机控制,2.,操作数分为:无、单、双操作数,3.,注意:目的操作数不能是立即数。,源与目的操作数不能同时为存储器。,段寄存器使用时的特殊性。,8088,、,8086,指令种类,2.,常用的机器指令,1,)数据传送:,MOV,目的操作数,源操作数(,注意,),2,)数据交换:,Xchg,目的操作数,源操作数,例如:,mov
15、 ax,1234h,Mov bx,4321h,Mov bx,ax,Xchg bx,ax,Mov bx,ax,1.,一般数据传送指令,3.2.1,数据传送指令,1,)偏移地址传送:,LEA,寄存器,存储器,2),偏移地址及数据段首地址传送:,LDS,寄存器,存储器,例如:,LEA bx,A1,Bx,得到是,A1,的偏移地址,等效,mov bx,offset A1,LDS bx,A1,Bx,得到是,A1,的偏移地址,,Ds,得到,A1,的段地址。等效,mov bx,offset A1,Mov ds,seg A1,2.,地址传送指令,3.2.1,数据传送指令,1,)加,1,指令,INC,目的操作数,
16、如:,INC AX,含义:,AX=AX+1,结果影响标志位,OF SF PF AF ZF,不影响,CF,如:,MOV AL,0FFh,INC AL,结果为:,AL=0,ZF=1,AF=1,SF=0,PF=1,OF=0,2),加法指令,ADD,目的操作数,源操作数,如:,ADD AX,BX,含义:,AX=AX+BX,结果影响标志位,OF SF PF AF ZF,CF,如:,MOV AX,7F7Fh,ADD AX,1000h,结果,AX=8f7fh,OF=1,SF=1,AF=0,ZF=0,CF=0,1.,加运算指令,3.2.2,算术运算指令,1,)减,1,指令,DEC,目的操作数,如:,DEC A
17、X,含义:,AX=AX-1,结果影响标志位,OF SF PF AF ZF,不影响,CF,如:,MOV AL,0,DEC AL,结果为:,AL=ffh,ZF=0,AF=1,SF=1,PF=1,OF=0,2),减法指令,SUB,目的操作数,源操作数,如:,SUB AX,BX,含义:,AX=AX-BX,结果影响标志位,OF SF PF AF ZF,CF,如:,MOV AX,8F7Fh,SUB AX,1000h,结果,AX=7f7fh,OF=1,SF=0,AF=0,ZF=0,CF=0,2.,减运算指令,3.2.2,算术运算指令,3,)求补指令,NEG,目的操作数,如:,NEG AX,含义:,AX=-A
18、X,结果影响标志位,OF SF PF AF ZF,CF,如:,MOV AL,0,NEG AL,结果为:,AL=0h,ZF=1,AF=0,SF=0,PF=1,OF=0,4),比较指令,CMP,目的操作数,源操作数,如:,CMP AX,BX,含义:,AX-BX,结果影响标志位,OF SF PF AF ZF,CF,如:,MOV AX,8F7Fh,CMP AX,1000h,结果,AX=8f7fh,OF=1,SF=0,AF=0,ZF=0,CF=0,2.,减运算指令,3.2.2,算术运算指令,1,)无符号乘指令,MUL,目的操作数,如:,MUL BH,含义:,AX=AL*BH(8,位,),MUL BX,含
19、义:,DX:AX=AX*BX(16,位,),2),有符号乘指令,IMUL,目的操作数,如:,IMUL BH,含义:,AX=AL*BH(8,位,),IMUL BX,含义:,DX:AX=AX*BX(16,位,),注意:,无符号与有符号结果不同,不能混。,如:(,8,位),mov al,b4h mov bl,11h mul bl,结果是:,b4*11=bf4(180*17=3060)ax=0bf4h,mov al,b4h mov bl,11h imul bl,结果是:-4,c*11=-50c (-76*17=-1292)ax=FAF4,3.,乘运算指令,3.2.2,算术运算指令,1,)无符号除指令,
20、DIV,目的操作数,如:,DIV BH,含义:商,AL=AXBH,余数,AH=AX MOD BH(8,位,),DIV BX,含义:商,AX=DX:AXBX,余数,DX=DX:AX MOD BX(16,位,),2),有符号除指令,IDIV,目的操作数,如:,IDIV BH,含义:商,AL=AXBH,余数,AH=AX MOD BH(8,位,),IDIV BX,含义:商,AX=DX:AXBX,余数,DX=DX:AX MOD BX(16,位,),4.,除运算指令,3.2.2,算术运算指令,该指令作用是将数值扩充时,其符号不变。,1,),CBW,将,AL,字节扩充成字,AX,如:,AL=7FH,扩成,A
21、X=007FH,AL=87H,扩成,AX=FF87H,2)CWD,将,AX,字扩充成双字,DX:AX,如:,AX=7FFFH,扩成,DX:AX=0000:7FFFH,AX=8777H,扩成,DX:AX=FFFF:8777H,5.,符号扩充指令,3.2.2,算术运算指令,1,),NOT,操作数 作用是每位求反,如:,BL=7FH NOT BL,则:,BL=80H,AND DX,AX,作用是两操作数相与。,TEST DX,AX,作用是两操作数相与,结果不变。,如:,AX=7777H,DX=8888H,结果分别是:,DX=0000,和,DX=8888H,3)OR BX,CX,作用是两操作数相或,如:
22、BX=7777H,CX=8888H,结果是:,BX=FFFFH,CX=8888H,4)XOR BH,CL,作用是两操作数相异或,如:,BH=77H,CL=34H,结果是:,BH=43H,CL=34H,1.,逻辑运算指令,3.2.3,位操作指令,移位格式与种类(,超连接,),使用注意问题:,1,)向左移位一次数值扩大一倍,2,)向右移位一次数值减小一倍,3,)移动次数超过一次时,必须将移动次数送入,CL,2.,移位指令,3.2.3,位操作指令,机器指令:是要执行的指令,是要转成目标程序的。,伪指令:是汇编时的说明,是不会转成目标指令的。,1.,伪指令与机器指令的区别,3.3,伪指令,DB,定义
23、字节类型,如:,DB X 1,2,”A”,”B”,DW,定义字节类型,如:,DW X 1,2,”A”,”B”,DD,定义字节类型,如:,DD X 1,2,”A”,”B”,DQ,定义字节类型,如:,DQ X 1,2,”A”,”B”,DT,定义字节类型,如:,DT X 1,2,”A”,”B”,2.,数据定义伪指令,3.3,伪指令,1,),EQU,定义符号常量,如:,A equ 1,2,),=(,等于号,),定义符号常量如:,B=2,两者差别是:可以重定义,而,equ,不可。,如:,B=2,B=5,则,取后面的,B,等于,5,3,),LABEL,定义符号,如:,P1 LABEL FAR,P2:LEA
24、 DX,BUF,则,语句,LEA DX,BUF,有了两个地址标号,P1,和,P2,再如:,B1 LABEL WORD,B2 DB 1,2,3,4,则:,B1,与,B2,同时属于数据,1,,,2,,,3,,,4,区变量,,类型分别为字和字节。,3.,常量定义伪指令,3.3,伪指令,1,),SEGMENT,段开始,格式如:,AA Segment,ENDS,段结束,格式如:,AA ENDS,这里,AA,是段名,必须前后一致,再例如:,Code Segment,Code ends,以上就是段的完整定义,,CODE,就是段名。,4.,段定义伪指令,3.3,伪指令,2,),ASSUME,指定可访问段,格式
25、如:,Assume CS:COD,DS:DAT,SS:STA,表示:,CS,可访问,COD,段,DS,可访问,DAT,段,SS,可访问,STA,段,再例如:,Code Segment,Assume CS:Code,DS:Code,Code ends,以上说明,CS,与,DS,都可访问,CODE,段。,4.,段定义伪指令,3.3,伪指令,3,),$,表示当前地址,如:,X db 345678,Count equ$-x,其中:,$-x,表示当前地址与,X,两地址相减,结果就是,6.,4)ORG,表示起始地址,如:,Org 100h,表示开始地址以,100h,为偏移量。,5,),end,汇编程序的结
26、束,如:,end begain,表示源程序编译结束,,begain,是程序开始的标号。,4.,段定义伪指令,3.3,伪指令,编写汇编程序时,可以调用操作系统的程序,以,方便程序的编写。这就是,DOS,功能调用。,1.DOS,功能调用的意义,3.4,常用,DOS,调用,1),键盘输入(,1,号调用),格式为:,MOV AH,1,Int 21H,键盘输入字符的,ASCII,码在,AL,寄存器中。,2,)单字符显示(,2,号调用),格式为:,MOV AH,2,MOV DL,K,Int 21H,显示字符的,ASCII,码在,DL,寄存器中。,2.,四个最常用,DOS,功能调用,3.4,常用,DOS,调
27、用,3),字符串显示(,9,号调用)格式为:,MOV AH,9,LEA DX,BUF,Int 21H,显示字符串,ASCII,码在,DS:DX,所指示的开始地址中,,以,$,作为字符串的结束。,4,)字符串输入(,10,号调用)格式为:,MOV AH,0Ah,LEA DX,BUF,Int 21H,输入的字符串的个数与内容在,DS:DX,所指示,的开始地址,.,如,:buf db 20,?,20 dup(?),2.,四个最常用,DOS,功能调用,3.4,常用,DOS,调用,1,)编写汇编源程序(产生,EXAMPLE.ASM,),2,)汇编源程序,(,产生,EXAMPLE.OBJ),3,)连接目标
28、程序,(,产生,EAMPLE.EXE),4,)执行与调试跟踪可执行程序,MASM,步骤,3.5,宏汇编的翻译与执行,1.,程序的三个结构,Chapter Four,程序设计基本方法,2.,顺序结构,3.,选择结构,4.,循环结构,5.,子程序,像高级语言一样,程序分为顺序、分支与循环结构。,概述,4.1,程序的三个结构,以直线方式逐行执行,这就是顺序程序。,P101,例题,4.2,顺序程序,1,)条件转移指令(,超连接,),简单条件转移:,JC/JZ/JS/JO,P103,例题,4.2,无符号条件转移:,JA,与,JB,有符号条件转移:,JG,与,JL,2),无条件转移指令,JMP,格式为:,
29、JMP,地址标号,JMP WORD PTR BX,JMP DWORD PTR BX,1.,转移指令,4.3,分支程序,P108,例题,4.3,P110,例题,4.4,2.,举例,4.3,分支程序,如:,MOV cx,5,A1:,Dec CX,JNZ A1,如:,MOV cx,5,A1:,LOOP A1,如:,MOV cx,5,A1:,dec cx,JCXZ A2,JMP A1,A2:,.,1.,计数控制法,(,用,CX,做计数器,),4.4,循环程序,当某种条件产生时,转移。,P115,例题是统计,AX,中,1,的个数。,P116-P1128,的例题练习,2.,条件控制法,4.4,循环程序,与
30、高级语言一样,汇编也有子程序,1.,概述,4.5,子程序,格式为:,子程序名,PROC NEAR,.,子程序名,ENDP,或者:,子程序名,PROC FAR,.,子程序名,ENDP,2.,子程序的定义,4.5,子程序,1,)调用格式为,(,段内,),:,CALL,子程序名,或者(段间):,CALL FAR PTR,子程序名,2,)返回指令:,RET,一般说来,调用指令出现在主程序内。,返回指令出现在子程序内。,3,)举例说明,3.,子程序的调用与返回,4.5,子程序,1,)在子程序开始对主程序中用到的寄存器或内存压栈,.,2,)在子程序结束时,返回指令前恢复这些值,.,如:,SUB1 PROC
31、PUSH AX,PUSH BX,POP BX,POP AX,RET,SUB1 ENDP,4.,子程序调用的现场保护,4.5,子程序,1,)用寄存器传送,2,)用内存变量传送,3,)用堆栈传送,分别举例说明,(,超连接,),5.,主程序与子程序的参数传递,4.5,子程序,6.,子程序举例(,P136-142,),4.5,子程序,1.,字符串操作,Chapter Five,程序设计其它方法和技术,2.,宏功能程序设计,3.,输入、输出指令,4.,中断(,Interrupt,),5.,上机操作,1,)指令,MOVSB,与,MOVSW,传送字节与字。,2,)重复前缀,REP,重复操作直至,CX=0,
32、格式:,REP,MOVS B,3),注意几点:,方向标志,DF=0(,地址增加,CLD),或,DF=1,(地址减少,STD,),DS:SI,为源地址,,ES:DI,为目的地址。,CX,的值代表要传送的字节或字数。,例题:,P152,1.,串传送指令,5.1,串操作指令,1,)指令,CMPSB,与,CMPSW,比较字节与字。,2,)重复前缀,REPE,重复操作直至,CX=0,或源目的不等于,0,格式:,REPE CMP,SB,3),注意几点:,方向标志,DF=0(,地址增加,CLD),或,DF=1,(地址减少,STD,),DS:SI,为源地址,,ES:DI,为目的地址。,CX,的值代表要传送的字
33、节或字数。,例题:,P154,2.,串比较指令,5.1,串操作指令,指令,LODSB,与,LODSW,从源中取字节与字。,含义:(,DS:SI),AL,或,DS:SI),AX,注意:,方向标志,DF=0(,地址增加,CLD),或,DF=1,(地址减少,STD,),例题:,P157,3.,从源中取数指令,5.1,串操作指令,指令,STOSB,与,STOSW,往目的中,字节与字。,含义:(,DS:SI),AL,或,DS:SI),AX,注意:,方向标志,DF=0(,地址增加,CLD),或,DF=1,(地址减少,STD,),例题:,P158,4.,往目的中存数指令,5.1,串操作指令,定义格式:,宏名
34、字,MACRO,形式参数,宏程序段,ENDM,如:,K1 MACRO,Mov ah,2,Mov dl,35h,Int 21h,endm,1.,宏定义,5.2,宏功能程序设计,调用格式:,宏名字,实际参数,如:,程序语句。,K1,程序语句。,例题:,P162-163,2.,宏调用,5.2,宏功能程序设计,格式:,IN AL,61h,;端口地址,61h,,内容,8,位,IN AX,81h,;端口地址,61h,,内容,16,位,IN AL,DX,;端口地址在,DX,中,(,超过,255),,内容,8,位,IN AX,DX,;端口地址在,DX,中,(,超过,255),,内容,16,位,1.,输入指令,IN,5.3,输入、输出指令,格式:,OUT 61h,AL,;端口地址,61h,,内容,8,位,OUT 81h,AX,;端口地址,61h,,内容,16,位,OUT AL,DX,;端口地址在,DX,中,(,超过,255),,内容,8,位,OUT AX,DX,;端口地址在,DX,中,(,超过,255),,内容,16,位,2.,输出指令,OUT,5.3,输入、输出指令,






