指令系统及寻址方式.ppt
微机原理与汇编语言,第4章 8086指令系统及寻址方式 4.1 汇编语言的基本概念 4.2 寻址方式 4.3 指令集 4.4 伪指令 4.5 表达式与操作符,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念计算机语言的发展,#include stdafx.h#include stdio.h int main(int argc,char*argv)int a,b,c;a=1;b=2;c=a+b;printf(c=%dn,c);return 0;,例1 编程实现 c=a+b,并在屏幕上显示出结果。,编译后的目标文件达到3.59KB,data segmenta db?b db?c db?string db c=$data endscode segmentmain proc far assume cs:code,ds:data,es:datastart:push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax,mov a,1 mov b,2 mov al,a add al,b mov c,al lea dx,string mov ah,09 int 21h add c,30h mov dl,c mov ah,2 int 21h mov dl,0ah int 21h mov dl,0dh int 21h retmain endpcode ends end start,例 2.C=a+b,汇编后的目标文件只有638字节,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。指令:01010000电平脉冲:,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言程序员们将 0、1 数字编程的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。示例用8086CPU完成运算:S=768+12288 1280,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言S=768+12288-1280机器码:假如将程序错写成以下这样,请找处错误:,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言在显示器上输出“welcome to masm”。机器码看到这样的程序,你会有什么感想?如果程序里有一个“1”被误写为“0”,又如何去查找呢?,welcome to masm 机器码:,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言与汇编语言汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。汇编指令是机器指令的助记符。,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言与汇编语言机器指令:操作:寄存器BX的内容送到AX中汇编指令:MOV AX,BX这样的写法与人类语言接近,便于阅读和记忆。,汇编语言的特点 面向机器的低级语言,通常是为特定的计算 机或计算机系列专门设计的。保持了机器语言的优点,具有直接和简捷 的特点。可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。经常与高级语言配合使用,应用十分广泛。,汇编语言的应用系统程序、效率代码、I/O驱动程序 70%以上的系统软件是用汇编语言编写的。某些快速处理、位处理、访问硬件设备等 高效程序是用汇编语言编写的。高级绘图程序、视频游戏程序一般是用汇 编语言编写的。,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.1 汇编语言的基本概念机器语言与汇编语言计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.2 MASM汇编语言Assembly LanguageMASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开人员必须在Windows下进行开发。MASM版本至今在不断的更新,现有最高版本号为MASM32 12.0,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.3 汇编语言语句格式,第4章 MASM汇编基础及上机,4.1 MASM汇编语言基础4.1.4 语句类别汇编语言由以下3类组成:1、指令语句2、伪指令语句 3、宏指令语句宏指令就是基本汇编指令的某种特定集合,这意味着一串复杂而常用的汇编指令往往可以化为一条简单易懂的宏指令。汇编语言的核心是指令语句,它决定了汇编语言的特性。,第4章 8086指令系统及寻址方式,4.2 寻址方式操作数操作数:指令中的常数,代表常数的一个标识符或表达式,或者是存放操作数的地址。源操作数SRC:操作过程中保持不变,可使用累加器、寄存器、存储单元和立即数。目的操作数DST:操作后被源操作数替代,可使用累加器、寄存器和存储单元。操作数OPRD:可使用通用寄存器和存储单元。操作数Reg:必须是一个16位的通用寄存器表达式是操作数中的一种,它是由常量、变量、寄存器、标号与一些操作符相组合的序列,可以有数值表达式和地址表达式两种,第4章 8086指令系统及寻址方式,4.2 寻址方式当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式操作数的寻址方式用确定操作数地址的方式找到操作数。立即寻址寄存器寻址存储器寻址,第4章 8086指令系统及寻址方式,4.2 寻址方式1.立即寻址方式操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数成为立即数。立即寻址方式用来表示常数,经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。MOV AX,3064H,第4章 8086指令系统及寻址方式,4.2 寻址方式2.寄存器寻址方式操作数在寄存器中,指令指定寄存器号。这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以得到较高的运算速度。MOV AX,BX 指令执行前(AX)=3046H,(BX)=1234H 则指令执行后(AX)=1234H,(BX)=1234H,第4章 8086指令系统及寻址方式,4.2 寻址方式3.存储器寻址方式操作数在存储器中,需通过不同的方式求得操作数的地址,从而获得操作数。操作数的地址即为物理地址。寻址得到的地址为偏移地址。直接寻址方式:MOV AX,2000H默认在DS寄存器中,如果(DS)=3000H,则指令执行后(AX)=3050H,5 0,3 0,AX,32000,30000,3.存储器寻址方式,第4章 8086指令系统及寻址方式,4.2 寻址方式演示1、直接寻址演示2、寄存器间接寻址演示3、寄存器相对寻址演示4、基址变址寻址演示5、相对基址变址寻址,第4章 8086指令系统及寻址方式,4.3 指令集不同机器的指令系统各不相同,但是它们要执行的基本操作、寻址方式等,是共性的。数据传送类指令程序控制类指令标志处理和CPU控制类指令系统功能调用,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令1.数据通路与类型匹配(DSTSRC)通用寄存器通用寄存器通用寄存器段寄存器通用寄存器内存通用寄存器立即数段寄存器通用寄存器段寄存器内存内存通用寄存器内存段寄存器内存立即数,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令大多数指令必须遵守以下规则:SRC和DST的类型必须匹配(8位对8位,16位对16位)立即数不能作为DST,立即数不能送段寄存器SRC和DST不能同时为内存操作数(串指令除外)SRC和DST不能同时为段寄存器段寄存器CS不能作为DST,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令1.MOV指令:传送指令指令格式:MOV DST,SRC指令功能:DST(SRC),第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令1.MOV指令:传送指令表达方式:(1)将数据直接送入寄存器。MOV AX,20H(2)将一个寄存器中的内容送入另一个寄存器中。MOV AX,BX(3)将一个内存单元中的内容送入一个寄存器。MOV AX,1000H 其中,表示一个内存单元,1000H表示内存单元的偏移地址,段地址默认放在DS中。(4)将一个寄存器中的内容送入一个内存单元。MOV 1000H,BX(5)将一个段寄存器中的内容送入一个寄存器。MOV AX,DS,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令2.XCHG指令:数据交换指令指令格式:XCHG OPR1,OPR2指令功能:(OPR1)(OPR2)OPR表示操作数。不能同时都为内存操作数。任何一个操作数都不能为段寄存器。任何一个操作数不能为立即数。通用寄存器之间的数据交换XCHG DI,BX通用寄存器与存储器之间的数据交换XCHG BYTE_VALUE,BL,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令3.PUSH、POP、PUSHF和POPF指令堆栈指令使用规则:堆栈处于堆栈段中,因而其段地址存放于SS寄存器中。堆栈只有一个出口,所以只有一个堆栈指针寄存器SP。SP总指向当前的栈顶。这四条堆栈指令只能做字操作。PUSH和POP指令可以使用除立即数以外的其他寻址方式。PUSH和POP指令可以指定段寄存器作为操作数,但POP指令不允许使用CS寄存器。堆栈指令均不影响标志位。,push、pop指令,push和pop指令是可以在寄存器和内存之间传送数据的。栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。push和pop指令的格式(1)push 寄存器:将一个寄存器中的数据入栈pop寄存器:出栈,用一个寄存器接收出栈的数据例如:push ax pop bx,push和pop指令的格式(2)push 段寄存器:将一个段寄存器中的数据入栈pop段寄存器:出栈,用一个段寄存器接收出栈的数据例如:push ds pop espush和pop指令的格式(3)push内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)pop 内存单元:出栈,用一个内存字单元接收出栈的数据例如:push 0 pop 2 指令执行时,CPU 要知道内存单元的地址,可以在 push、pop 指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。,编程:将10000H1000FH 这段空间当作栈,初始状态是空的,将 AX、BX、DS中的数据入栈。,编程:(1)将10000H1000FH 这段空间当作栈,初始状态是空的;(2)设置AX=001AH,BX=001BH;(3)将AX、BX中的数据入栈;(4)然后将AX、BX清零;(5)从栈中恢复AX、BX原来的内容。,分析,结论从上面的程序我们看到,用栈来暂存以后需要恢复的寄存器中的内容时,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶,所以在恢复时,要最先出栈。,编程:(1)将10000H1000FH 这段空间当作栈,初始状态是空的;(2)设置AX=002AH,BX=002BH;(3)利用栈,交换 AX 和 BX 中的数据。,push、pop指令,我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:mov ax,1000H mov ds,ax mov ax,2266H mov 0,ax补全下面的代码,完成同样的功能:在10000H处写入字型数据2266H。_ _ _ mov ax,2266H push ax要求:不能使用“mov 内存单元,寄存器”这类指令,问题分析,我们看需补全代码的最后两条指令,将ax中的2266H压入栈中,也就是说,最终应由push ax将2266H写入10000H处。问题的关键就在于:如何使push ax访问的内存单元是10000H。Push指令是入栈指令。(注意执行过程)完成程序 mov ax,1000H mov ss,ax mov sp,0010H mov ax,2266H push ax,问题分析(续),结论push、pop 实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。同时,push和pop指令还要改变 SP 中的内容。我们要十分清楚的是,push和pop指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。执行push时:先改变SP,后向SS:SP处传送。执行pop时:先读取SS:SP处的数据,后改变SP。,注意,push、pop 等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为:0FFFFH。提供:SS、SP指示栈顶;改变SP后写内存的入栈指令;读内存后改变SP的出栈指令。这就是8086CPU提供的栈操作机制。,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令4.LEA、LDS和LES地址传送指令:把地址送到指定寄存器。LEA reg,src;将源操作数的偏移地址送入寄存器LDS reg,src;将源操作数中的双字内容送入寄存器及段寄存器DS中LES reg,src;将源操作数中的双字内容送入寄存器及段寄存器ES中,地址传送类指令,装入有效地址指令格式:LEA DST,SRC功能:将源操作数的有效地址传送到目标寄存器中说明:源操作数一定为存储器操作数,目的操作数为16位通用寄存器。例如:LEA BX,VALUEBX 如果(BX)=2000H,VALUE的偏移地址为1000H,则指令执行后(BX)=2000H+1000H=3000H,EA=VALUE+(BX)=1000H+2000H=3000HBX,0000H,3000H,34H12H,DS:2000H,地址传送类指令,装入地址指针指令格式:LDS DST,SRC LES DST,SRC功能:将段基值和偏移量分别送到DST和SRC说明:一个存储单元的逻辑地址是由16位段地址和16位偏移地址组成的,可用4个存储单元存放,其中段地址存放在两个高字节单元,偏移地址存放在两个低字节单元。DS中存放段地址,DST存放偏移地址。如果是LES指令,则段地址存放在ES段寄存器中。例如:LDS AX,2000H,若(DS)=2000H,则指令执行后,(DS)=5678H,(AX)=1234H。,偏移量,段基值,22000H,34H,12H,78H,56H,偏移量,段基值,32位地址指针,例:LEA BX,BX+SI+0F62H LDS SI,10H LES DI,BX,40 H00 H00 H30 H,TABLE(DS):1000H,MOV BX,TABLE;(BX)=0040HMOV BX,OFFSET TABLE;(BX)=1000HLEA BX,TABLE;(BX)=1000HLDS BX,TABLE;(BX)=0040H;(DS)=3000HLES BX,TABLE;(BX)=0040H;(ES)=3000H,注意:*不影响标志位*REG 不能是段寄存器*SRC 必须为存储器寻址方式,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令5.IN、OUT和XLAT累加器专用传输指令:OUT 和 IN 在汇编中是端口读写操作指令。端口是主机与外设进行数据交换使用的,分为数据端口,状态端口和控制端口三种。PC机给每一个端口分配了一个地址,所有端口成线性排列,形成一个独立于内存空间的I/O地址空间,一般用十六进制表示。8086中,端口地址的范围是0000H-FFFFH。例如:IN AL,21H 表示从21H端口读一个字节数据到AL;OUT 21H,AL 表示将AL持有的数据写入21H端口 需要注意的是:数据输入输出时的地址要放在DX中,数据以AX作传输媒介,具体需要根据传输位来决定是否选用AL、AH或DL、DH。,累加器专用传送指令(只限使用AX或AL)输入指令 IN(I/O CPU)长格式:IN AL,PORT(字节)IN AX,PORT(字)执行操作:(AL)(PORT)(字节)(AX)(PORT+1,PORT)(字)短格式:IN AL,DX(字节)IN AX,DX(字)执行操作:(AL)(DX)(字节)(AX)(DX)+1,(DX)(字),输出指令 OUT(CPU I/O)长格式:OUT PORT,AL(字节)OUT PORT,AX(字)执行操作:(PORT)(AL)(字节)(PORT+1,PORT)(AX)(字)短格式:OUT DX,AL(字节)OUT DX,AX(字)执行操作:(DX)(AL)(字节)(DX)+1,(DX)(AX)(字),注意:*不影响标志位*前256个端口号00HFFH可直接在指令中指定(长格式)*如果端口号 256,端口号 DX(短格式)例:IN AX,28H;表示从28H端口读一个字节数据到AX MOV DATA_WORD,AX例:MOV DX,3FCH IN AX,DX;表示从3FCH地址中取出的数字所代表的 端口读一个字节数据到AX 例:OUT 21H,AL;表示将AL持有的数据写入21H端口 例:测试某状态寄存器(端口号27H)的第2位是否为1 IN AL,27H TEST AL,00000100B JNZ ERROR;若第2位为1,转ERROR处理,第4章 8086指令系统及寻址方式,4.3 指令集4.3.1 数据传送类指令5.IN、OUT和XLAT换码指令XLAT:课本102页指令功能 将BX和AL内容之和指出的存储器字节单元的内容送到AL中,即(AL)(BX)+(AL)。指令格式:XLAT OPRXLAT说明:该指令的操作数是隐含的,目的操作数是AL,源操作数是用变址方法寻址的存储单元,即BX和AL的内容之和指定的存储单元。,第4章 8086指令系统及寻址方式,换码指令XLAT:该指令常用来实现查表操作,首先把表格存放在存储器中,表格首地址存放在基址寄存器BX中,待查元素在表格中的位置存放在AL中,然后执行指令,结果是将表格中查到元素的内容送入AL中。例如:DATA SEGMENTTABLE BD abcdefghijklmnopqrstuvwxyzDATA ENDSMOV BX,OFFSET TABLE;将变量TABLE的偏 移地址送BXMOV AL,05H;TABLE表中的第6项的位移 量05H送AL中XLAT;查表后,将f的ACX码66H送AL中,(BX)30 H F0040,31 H F0041,(AL)=3 32 H F0042,33 H F0043,TABLE,(DS)=F000H,换码指令:XLAT 或XLAT OPR执行操作:(AL)(BX)+(AL)例:MOV BX,OFFSET TABLE;(BX)=0040H MOV AL,03H XLAT TABLE 指令执行后(AL)=33H注意:*不影响标志位*字节表格(长度不超过256)首地址(BX)*需转换的代码位移量(AL),第4章 8086指令系统及寻址方式,4.3 指令集4.3.2 程序控制类指令(课本第6、7章),无条件转移指令 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 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 CFZF=1 JNBE(JA)OPR CFZF=0*适用于地址或双精度数低位字的比较,(3)比较两个带符号数,并根据比较结果转移*格式 测试条件 JL(JNGE)OPR SFOF=1 JNL(JGE)OPR SFOF=0 JLE(JNG)OPR(SFOF)ZF=1 JNLE(JG)OPR(SFOF)ZF=0*适用于带符号数的比较(4)测试 CX 的值为 0 则转移 格式 测试条件 JCXZ OPR(CX)=0,例:如果 X50,转到TOO_HIGH;否则|X-Y|RESULT,如果溢出转到 OVERFLOW,,;如果X大于Y,转到TOO_HIGH,;如果有溢出,转到OVERFLOW,;如果为正数,转到NONNEG,例:、是双精度数,分别存于 DX,AX 及 BX,CX 中,时转 L1,否则转 L2,CMP DX,BX JG L1 JL L2 CMP AX,CX JA L1L2:L1:,;如果DX中的值大于BX中的值时转 L1,;如果DX中的值小于BX中的值时转 L1,;如果AX中的值大于CX中的值时转 L1(无符号数),循环指令:LOOPLOOPZ/LOOPELOOPNZ/LOOPNE 执行步骤:(1)(CX)(CX)-1(2)检查是否满足测试条件,如满足则(IP)(IP)+8位位移量,实行循环;不满足则 IP 不变,退出循环。注意:*CX 中存放循环次数*只能使用段内直接寻址的8位位移量,循环指令:LOOP OPR测试条件:(CX)0为零或相等时循环指令:LOOPZ(LOOPE)OPR测试条件:ZF=1 且(CX)0不为零或不相等时循环指令:LOOPNZ(LOOPNE)OPR测试条件:ZF=0 且(CX)0,例:求首地址为 ARRAY 的 M 个字之和,结果存入 TOTAL,MOV CX,MMOV AX,0MOV SI,AX AGAIN:ADD AX,ARRAYSIADD SI,2LOOP AGAINMOV TOTAL,AX,子程序调用和返回指令:,code1 segmentmain proc far call far ptr subp retmain endpcode1 endscode2 segmentsubp proc far retsubp endpcode2 ends,段间调用和返回,code segmentmain proc far call subp retmain endpsubp proc near retsubp endpcode ends,段内调用和返回,CALL 调用指令段内直接近调用:CALL DST执行操作:PUSH(IP)(IP)(IP)+16位位移量段内间接近调用:CALL DST执行操作:PUSH(IP)(IP)(EA)段间直接远调用:CALL DST 执行操作:PUSH(CS)PUSH(IP)(IP)偏移地址(CS)段地址 段间间接远调用:CALL DST 执行操作:PUSH(CS)PUSH(IP)(IP)(EA)(CS)(EA+2),RET 返回指令段内近返回:RET执行操作:(IP)POP()段内带立即数近返回:RET EXP执行操作:(IP)POP()(SP)(SP)+16位位移量段间远返回:RET执行操作:(IP)POP()段间带立即数远返回:RET EXP执行操作:(IP)POP()(SP)(SP)+16位位移量,例:带立即数返回,(SP),堆栈段,code segmentmain proc far push ax push bx push cx call sub retmain endpsub proc near ret 6sub endpcode ends,(SP),中断指令:,类型0的(IP),类型0的(CS),类型1的(IP),类型1的(CS),类型N的(IP),类型N的(CS),类型255的(IP),类型255的(CS),00000,00004,4*N,003FC,中断向量表,注意:*TYPE(0255)是中断类型号,隐含的类型号为3*INT 指令还把 IF 和 TF 置0,但不影响其它标志位*IRET 指令执行完,标志位由堆栈中取出的值确定,第4章 8086指令系统及寻址方式,4.3 指令集4.3.3 标志处理和CPU控制类指令标志处理指令 CLC、STC、CMC、CLD、STD、CLI、STI CPU控制类指令 NOP、HLT、WAIT、ESC、LOCK,标志处理指令:CLC CF 0 进位位置0指令 CMC CF CF 进位位置求反指令 STC CF 1 进位位置1指令 CLD DF 0 方向标志位置0指令 STD DF 1 方向标志位置1指令 CLI IF 0 中断标志置0指令 STI IF 1 中断标志置1指令注意:*只影响本指令指定的标志,CPU控制类指令:NOP 无操作(机器码占一个字节)HLT 暂停机(等待一次外中断,之后继续执行程序)WAIT 等待(等待外中断,之后仍继续等待)ESC 换码 LOCK 封锁(维持总线的锁存信号,直到其后的指令 执行完)注意:*不影响条件标志,第4章 8086指令系统及寻址方式,4.3 指令集4.3.4 系统功能调用1.DOS功能调用DOS功能调用使用INT 21H指令,AH中存放功能号,表示需要完成的功能。调用方法:入口参数指定寄存器功能号AH(00H68H)INT 21H,MOV AX,4c00h INT 21h 等价于MOV AH,4CH INT 21H 作用:调用 INT 21H 的 4CH 号中断,该中断就是安全退出程序。,第4章 8086指令系统及寻址方式,4.3 指令集4.3.4 系统功能调用1.DOS功能调用常用的系统功能调用1号功能调用从键盘输入单个字符MOV AH,1INT 21H2号功能调用在显示器上显示输出单个字符MOV DL,41HMOV AH,2INT 21H,第4章 8086指令系统及寻址方式,4.3 指令集4.3.4 系统功能调用1.DOS功能调用常用的系统功能调用9号功能调用在显示器上显示输出字符串LEA DX,DTRINGMOV AH,9INT 21H10号功能调用从键盘输入字符串LEA DX,MAXLENMOV AH,10INT 21H,第4章 8086指令系统及寻址方式,4.3 指令集4.3.4 系统功能调用2.BIOS中断调用当DOS尚未启动或不允许采用DOS调用的情况下,采用ROM-BIOS功能调用。调用方法:入口参数指定寄存器功能号AH(00H68H)输入功能调用INT 16H输出功能调用INT 10H,第4章 8086指令系统及寻址方式,4.3 指令集4.3.4 系统功能调用2.BIOS中断调用0号功能调用从键盘输入一个字符MOV AH,0INT 16H1号功能调用判断键盘是否有输入MOV AH,01HINT 16HOEH功能调用输出字符,第4章 8086指令系统及寻址方式,指令与伪指令,第4章 8086指令系统及寻址方式,4.4 伪指令伪指令又称伪操作命令,伪指令知识提供给汇编程序一种操作,在汇编程序对汇编语言程序进行汇编时由汇编程序处理的操作,汇编结束,伪指令的使命也就结束了,它没有对应的机器码。伪指令是一种辅助操作,它使我们编写的汇编语言程序在机器上运行。主要功能有:符号定义,变量定义,数据定义及分配存储单元,程序分段,过程定义,程序模块定义与通信,指示程序的开始和结束等。,第4章 8086指令系统及寻址方式,4.4 伪指令1.数据定义及存储分配伪指令数据定义及存储分配伪指令可将其后跟着的数据存入指定的存储单元,或只分配存储空间而并不存入确定的数值。格式为变量名DB/DW/DD/DQ/DT操作数DB定义字节DW定义字DD定义双字DQ定义4个字DT定义10个字节DW和DD可以存储偏移地址或完整的地址,第4章 8086指令系统及寻址方式,4.4 伪指令2.表达式赋值伪指令给表达式赋予一个名字。格式为:名字 EQU 表达式3.符号定义伪指令定义一个变量或标号并指定其属性。格式为:名字 LABEL 类型当LABEL与变量连用时,类型为BYTE、WORD或DWORD当LABEL与标号连用时,类型为NEAR或FAR.,第4章 8086指令系统及寻址方式,4.4 伪指令4.段定义伪指令为存储器分段。格式为:段名 SEGMENT段名 ENDS5.程序开始和结束伪指令END,第4章 8086指令系统及寻址方式,4.4 伪指令完整的段定义格式,data segment;定义数据段 data ends;-extra segment;定义附加段 extra ends;-code segment;定义代码段 assume cs:code,ds:data,es:extrastart:mov ax,data mov ds,ax;段地址 段寄存器 code ends end start,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号常量:又叫常数,有时也叫立即数,即源程序中出现的固定值,在程序运行期间其值不会改变。数字常量二进制数:以字母B结尾的一串由0和1所组成的数字序列,如10110101B八进制数:以字母O结尾的由数字07所组成的数字序列,如176O十进制数:以字母D结尾的由数字09所组成的数字序列,如359D十六进制数:以字母H结尾的由数字09及字母AF组成的数字序列,如1A3CH,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号汇编程序默认的数为十进制数,所以在书写十进制常数时,可以省略结尾字母D;在书写十六进制常数时,如果第一个字符是字母AF时,应在其前面加上数字0,以免与标号或变量名发生混淆,如0FFFFH、0A6H为十六进制数,而FFFFH、A6F则为标号名或变量名。,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号常量字符串常量用单引号、或者双引号“”括起来的一个或多个ASC字符,如A1、B、5、GOOD汇编程序把字符串常量表示成一个字节序列,一个字节对应一个字符,并把该字符翻译成它的ASC码值进行存储。如5转换成ASC码值就是273527H,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号常量符号常量用一个符号代替常量,必须由伪指令EQU来定义,其值在其作用域内不可更改,也不可重新定义。,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号变量:在程序运行过程中,其值可以改变的量成为变量变量在除代码段之外的其他段中定义变量的定义后面不跟冒号“:”变量根据其在存储器中所占存储单元数的不同,可分为字节变量、字变量和双字变量等。如:在数据段中定义字变量ADATA SEGMENTA DW 5DATA ENDS同一个变量的定义,只能出现一次,即不允许定义同名变量变量经定义后,可以在程序中被引用,也可以通过其他指令修改其值。MOV AX,XMOV Y,AX,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号变量变量的三种属性段属性:定义该变量的段起始地址如在数据段中定义了变量A,则应将数据段的段起始地址存储在数据段寄存器DS中。偏移属性:定义该变量的偏移地址若想在当前段引用此偏移地址,可通过应用当前地址计数器的值$来实现。类型属性:定义该变量存储时所占的字节数BYTE、WORD、DWORD、DQ、DT,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号标号:标号在代码段中定义,后面紧跟冒号“:”,用来表示本语句的符号地址,也可以用EQU或LABEL伪指令来定义。标号还可以作为过程名来定义。标号经常在转移指令或CALL指令的操作数字段出现,表示转向地址。,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号标号:标号的三种属性段属性:定义标号的段起始地址标号是在代码段定义的,该地址必须在代码段寄存器CS中偏移属性:定义标号的偏移地址标号的偏移地址总在IP寄存器中类型属性用来指出该标号是在本段内引用还是在其他段中应用,即表明段内转移还是段间转移。段内转移属性为NEAR、段间转移属性为FAR,第4章 8086指令系统及寻址方式,4.5 表达式与操作符常量、变量、标号变量与标号的区别变量与标号都是出现在语句的名字项中,都可用来表示本语句的符号地址。标号是某条指令所存放单元的符号地址,而变量则是某个操作数所存放单元的符号地址。标号可有可无,只有当需要用符号地址来访问某个语句是,才为该语句赋予名字。,第4章 8086指令系统及寻址方式,4.5 表达式与操作符1.算术操作符主要的算术操作符有+、-、*、/、MOD。MOD是指除法运算后得到的余数。19/7的商是2;19 MOD 7则为5(余数)。VIDEO_BUF DB 25*80*2 DUP(?)算术操作符可用于数值表达式和地址表达式当用于地址表达式时,只有当其结果有明确的物理意义时才是有效的结果。,第4章 8086指令系统及寻址方式,4.5 表达式与操作符1.算术操作符两个地址相乘或相除无意义。两个不同段的地址相加减无意义。地址+数字量有意义SUM+1;SUM字节单元的下一个字节单元的地址ADD AX,BLOCK+2;符号地址常数 有意义 MOV AX,BX+1;MOV AX,BX+1;寄存器间接寻址,第4章 8086指令系统及寻址方式,4.5 表达式与操作符2.逻辑操作符逻辑操作符有AND、OR、XOR和NOT。逻辑操作符是按位运算的,只能用于数字表达式中。,第4章 8086指令系统及寻址方式,4.5 表达式与操作符3.关系操作符关系操作符用于对两个表达式进行比较。表达式一定是常数或同一段内的两个内存地址。计算的结果为逻辑值:结果为真时,值为0FFFFH结果为假时,值为0,第4章 8086指令系统及寻址方式,4.5 表达式与操作符4.数值回送操作符TYPE、LENGTH、SIZE、OFFSET和SEG。TYPE、LENGTH和SIZETYPE的操作对象是变量名和标号,所求出的值为用数值表示的类型值LENGTH仅用于变量名SIZE也只用于变量名SIZE=LENGTH*TYPEOFFSET和SEGOFFSET回送的是变量名、标号的偏移地址SEG回送的是变量名、标号的段地址,第4章 8086指令系统及寻址方式,4.5 表达式与操作符5.属性操作符PTRMOV WORD PTR BX,5THISTA EQU THIS BYTETD DW 1234HNEXT EQU THIS FARMOV AX,2段