1、第3章,第三章 8088(8086)的指令系统,8086/8088 指令系统可分为六组:数据传送指令 (Data transfar);算术运算指令 ( Arithmetic);逻辑运算指令 (Logic);串操作指令 (String manipulation);控制转移指令 ( Control transfar);处理机控制指令 ( Processor control);,第3章:3.4 数据传送类指令,数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 MOV XCHG XLA
2、T PUSH POP LEA,二、数据传送指令,通用数据传送指令,地址传送指令,累加器专用指令,标志寄存器传送指令,第3章: 通用数据传送指令,提供方便灵活的通用传送操作 有3条指令 MOV XCHG XLAT,MOV,XCHG,XLAT,第3章:1. 传送指令MOV(move),把一个字节或字的操作数从源地址传送至目的地址,演示,源操作数寄存器、存储器、立即数目的操作数 寄存器、存储器执行的操作: DST SRC CPU内部寄存器之间的数据传送(除CS,IP外)MOV AL,BL MOV DS, BXMOV DX, DI MOV AX,DX MOV SI, BP, 立即数传送到CPU内部通用
3、寄存器组(AX,BX,CX,DX,BP,SP,DI,SI)MOV CL, 4MOV DX, 03FFHMOV DI, 04BFH CPU内部寄存器(除CS,IP外)与存储器(所有寻址方式)之间的数据传送MOV BX, BUFFER MOV DI, CXMOV AL, 2000 MOV SI, BLOCKBPMOV AX, SI MOV DS, DATSI+BX 立即数给存储单元赋值MOV WORD PTR2000, 10 MOV BYTE PTRBX+DI, 30,第3章:1. 传送指令MOV(move),第3章:MOV指令立即数传送,mov cl,4 ;cl4,字节传送 mov dx,0ff
4、h ;dx00ffh,字传送 mov si,200h ;si0200h,字传送 mov bvar,0ah ;字节传送 ;假设bvar是一个字节变量,定义如下:bvar db 0 mov wvar,0bh ;字传送 ;假设wvar是一个字变量,定义如下:wvar dw 0,明确指令是字节操作还是字操作,第3章:MOV指令寄存器传送,mov ah,al ;ahal,字节传送 mov bvar,ch ;bvarch ,字节传送 mov ax,bx ;axbx,字传送 mov ds,ax ;dsax,字传送 mov bx,al ;bxal,字节传送,寄存器具有明确的字节和字类型,第3章:MOV指令存储
5、器传送,mov al,bx ;alds:bx mov dx,bp ;dxss:bp mov dx,bp+4 ;dxss:bp mov es,si ;esds:si,不存在存储器向存储器的传送指令,第3章:MOV指令段寄存器传送,mov si,ds mov ax,ds ;axds mov es,ax ;esaxds,对段寄存器的操作不灵活,第3章:MOV指令传送功能图解,MOV指令也并非任意传送!,非法指令的主要现象: 两个操作数的类型不一致 无法确定是字节量还是字量操作 两个操作数都是存储器 MOV2000H,3000H 立即数直接送段寄存器 MOV DS, 3000H 目标操作数用立即数方式
6、 MOV 2000H, AL 两个操作数都是段寄存器MOV DS, ES,第3章:非法指令两个操作数类型不一致,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令MOV AL, 050AH ;非法指令,修正:;mov ax,050ahMOV SI, DL ;非法指令,修正:;mov dh,0;mov si,dx,第3章:非法指令无法确定是字节量还是字量操作,当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明MOV BX+SI, 255 ;非法指令,修正:;mov byte ptr bx+si,255;byte
7、 ptr 说明是字节操作;mov word ptr bx+si,255;word ptr 说明是字操作,第3章:非法指令两个操作数都是存储器,8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)MOV buf2, buf1 ;非法指令,修正:;假设buf2和buf1是两个字变量;mov ax,buf1;mov buf2,ax;假设buf2和buf1是两个字节变量;mov al,buf1;mov buf2,al,第3章:非法指令段寄存器的操作有一些限制,8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活MOV DS, ES ;非法指令,修正
8、:;mov ax,es;mov ds,axMOV DS, 100H ;非法指令,修正:;mov ax,100h;mov ds,axMOV CS, SI ;非法指令;指令存在,但不能执行,第3章:2. 交换指令XCHG(exchange),把两个地方的数据进行互换,通用寄存器与通用寄存器之间对换数据 通用寄存器与存储器之间对换数据 不能在存储器与存储器之间对换数据 段寄存器不能作为操作数,XCHG reg,reg/mem ;reg reg/mem,演示,第3章:例3.2 数据交换,mov ax,1199h ;ax=1199h xchg ah,al ;ax=9911h ;等同于 xchg al,a
9、h mov wvar,5566h ;wvar是一个字量变量 xchg ax,wvar ;ax=5566h,wvar=9911h ;等同于 xchg wvar,ax xchg al,byte ptr wvar+1;ax=5599h,wvar=6611h;“byte ptr wvar+1”强制为字节量,只取高字节与AL类型交换,否则数据类型不匹配,例: XCHG BX, BP+SI假设: (BX)=6F30H(BP)=0200H (SI)=0046H (SS)=2F00H (2F246H)=1234H,第3章:例3.2 数据交换,第3章:3. 换码指令XLAT(translate),将BX指定的缓
10、冲区中、AL指定的位移处的一个字节数据取出赋给AL,换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码,XLAT ;alds:bx+al,演示,第3章: 堆栈操作指令,堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,图示,操作数:16位通用寄存器; 段寄存器;16位内存操作数(除立即数之外的任何
11、寻址方式)。,第3章:进栈指令PUSH,进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,PUSH r16/m16/seg;SPSP2;SS:SPr16/m16/seg,演示,push ax push 2000h,第3章:出栈指令POP,出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,POP r16/m16/seg; r16/m16/segSS:SP;SPSP2,pop ax pop wvar,演示,第3章:堆栈操作的特点,堆栈操作的单位是字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但
12、可用存储器寻址方式随机存取堆栈中的数据 堆栈段是程序中不可或缺的一个内存区,常用来 临时存放数据 传递参数 保存和恢复寄存器,第3章: 标志操作指令,1. 标志位操作指令 CLC ;复位进位标志:CF0 STC ;置位进位标志:CF1 CMC ;求反进位标志:CFCF CLD ;复位方向标志:DF0 STD ;置位方向标志:DF1 CLI ;复位中断标志:IF0 STI ;置位中断标志:IF1 2. 标志寄存器低字节与AH的传送指令SAHF,SAHF 3. 标志寄存器出入堆栈指令PUSHF,POPF,(1) 读取标志指令 LAHF 功能: 把 Flag 的低字节内容装入寄存器 AH 中。操作数
13、:隐含的操作数 标志寄存器Flag , AH执行的操作:AH Flag 的低位字节。,2. 标志寄存器低字节与AH的传送指令,第3章: 标志操作指令,(2) 设置标志指令 SAHF 功能: 把 Ah 的内容装入 Flag 的低字节。操作数:隐含的操作数标志寄存器 Flag , AH执行的操作:Flag 的低位字节 AH,注:该指令影响标志位 S、Z、A、P、C,第3章: 标志操作指令,标志寄存器入栈指令 PUSHF功能:将标志寄存器Flag的内容压入堆栈保存。标志寄存器出栈指令 POPF功能:把栈中内容弹出至标志寄存器 Flag。注:该指令影响标志位 O、S、Z、A、P、C 。,第3章: 标志
14、操作指令,3. 标志寄存器出入堆栈指令,将存储器操作数的有效地址送至指定的16位通用寄存器,第3章:有效地址传送指令LEA(load effective address),LEA r16, mem ;r16mem的有效地址EA,例题2.5 有效地址的获取mov bx,400hmov si,3chlea bx,bx+si+0f62h;BX400H3CH0F62H139EH, 该指令常用来设置一个16位的寄存器作为地址指针; 该指令的执行效果与 mov reg , offset src 相同。,第3章:例3.6 地址传送与内容传送,wvar dw 4142h ;假设偏移地址为04H mov ax,
15、wvar ;内容传送:AX4142H lea si,wvar ;地址传送:SI0004H ;等同于 lea si, 0004h mov cx,si ;内容传送:CX4142H mov di,offset wvar ;mov di,0004h;利用操作符OFFSET获取变量的有效地址 mov dx,di ;内容传送:DX4142H,把源操作数指定的内存的4个相继字节的内容送至指定寄存器及DS中LDS REG, SRC (REG) (SRC)(DS) (SRC+2)目的操作数 源操作数(16位通用寄存器)(内存操作数)(1) 该指令完成一个32位地址指针的传送;(2) 该指令通常指定 SI 作寄存
16、器 REG。例: lds si, 100h,DS=1000h,10100h,00 02 00 20,0200h,2000h,SI,DS,第3章:指针送寄存器及DS指令:LDS,把源操作数指定的内存的4个相继字节的内容送至指定寄存器及ES中。LES REG, SRC (REG) (SRC)(ES) (SRC+2)目的操作数 源操作数(16位通用寄存器) (内存操作数)(1) 该指令完成一个32位地址指针的传送;(2) 该指令通常指定 DI 作寄存器 REG。例: les di, 100h,ES=1000h,10100h,00 02 00 20,0200h,2000h,DI,ES,第3章:指针送寄
17、存器及ES指令:LES,PC机中,所有I/O端口与CPU之间的通信都由IN, OUT指令完成。IN指令允许把一个字节或一个字由输入端口传送至AL或AX。OUT指令允许把一个字节或一个字由AL或AX传送至输出端口。格式1: IN AL, PORTOUT PORT, AL PORT端口地址 格式2: IN AL, DX DX端口地址 OUT DX, AL,第3章:累加器专用输入输出指令 IN, OUT (p.56),第3章: 符号扩展指令,符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,后一个操作数的高位是全0(正数)或全1(负数) 符号扩展虽然使数据位数加长,但数据大小并没有改变,扩
18、展的高部分仅是低部分的符号扩展 符号扩展指令有两条,用来将字节转换为字,字转换为双字CBW ;AL符号扩展成AXCWD ;AX符号扩展成DX,第3章:符号扩展例题,mov al,64h ;AL64H (机器数) ,表示10进制数100(真值) cbw ;将符号0扩展,AX0064H,仍然表示100mov ax,0ff00h ;AXFF00H,表示有符号10进制数256 cwd ;将符号位“1”扩展,DX.AXFFFFFF00H;仍然表示256,第3章:调试程序DEBUG,DEBUG是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令、跟踪程序的有效手段 常用命令: A 汇编 U 反汇编 T 单步执行 G 断点执行 D 数据显示 R 寄存器 启动方法 DOS下执行DEBUG.EXE程序 Windows 9x中进入MS-DOS环境执行DEBUG.EXE程序 Windows 2000/XP/NT下运行COMMAND命令(不是CMD命令,也不要从“命令提示符”)进入MS-DOS环境执行DEBUG.EXE程序,MOV指令的功能,XCHG指令的功能,XLAT指令的功能,堆栈的图示,SS,SP,0000H,(栈顶),存储器,高地址,堆栈段,PUSH指令的功能,POP指令的功能,