




已阅读5页,还剩116页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主要内容,2.1 常量、变量、标号、表达式 2.2 常量和变量的定义 2.3 数据寻址方式 2.4 基本指令 2.5 源程序的基本格式 2.6 汇编语言程序的上机调试,2.1 常量、变量、标号、表达式,指令和伪指令 常量 变量 标号和表达式,返回本节,硬指令和伪指令,硬指令使CPU产生动作、并在程序执行时才处理的语句,即处理器指令。 伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,也称指示性语句。例如,数据说明、变量定义等等 伪指令与具体的处理器类型无关,但与汇编程序的版本有关,返回,常量,常量是在程序运行期间固定不变的数。 用途:用作指令的立即数、寻址方式的偏移量以及变量定义时的初始化值。 各进制数 二进制常数:以基数说明符B(b)结尾。 十进制常数:以字母D(d)结尾。汇编语言源程序中默认为十进制数,可省略D。 八进制常数:以字母O(o)结尾。 十六进制常数:以字母H(h)结尾。对于以字母AF起头的十六进制数,必须在前边加一个数字0,以便与标识符区别开。在DEBUG中默认为十六进制数,可省略H。,常量,如何改变数的默认进制:RADIX伪指令 格式: RADIX n 其中,n为默认进制的基数。 例如 RADIX 16 实数:由整数、小数和指数3部分组成,通常以十进制数形式表示 字符串: 用单引号括起来的一个或多个字符。,返回,变量,变量:占固定长度的存储单元,在程序运行期间其值可变。 变量名:符号地址,是变量所占一组存储单元的起始地址。 变量的值:存储单元中的数据 变量的三种属性 段属性(SEG):是16位无符号数,表示变量所在段的段首地址。 偏移属性(OFFSET):是16位无符号数,表示从段首址单元到变量存储单元位置之间的位移量。 段属性和偏移属性就确定了一个变量的物理位置。 类型属性(TYPE):表示变量占用的内存存储单元的字节数,即确定了变量中数据的取值范围,但不能确定变量的操作。变量类型可以为字节、字、双字、四字或10字节 。,返回,标号,标号:指令所占据一组存储单元的符号地址标识, 存储单元中的数据是指令的操作码和操作数。 用途:在分支结构和子程序设计中,用标号表明程序执行流程将要转移的位置 表示: 标识符:指令 例如,定义和使用标号的代码如下: CMP AX,BX JNE NEXT ;(AX)不等于(BX)时,转移到NEXT标号指向的语句继续执行 NEXT:MOV AX,0 标号的三种属性 段属性(SEG):16位无符号数,标识指令代码段的段首地址。 偏移属性(OFFSET):16位无符号数,表示从段首址到标号位置之间的位移量,是指令的偏移地址。 段属性和偏移属性确定了标号所标识的指令的物理地址。 类型属性(TYPE):按照转移指令和转移到的位置是否在同一段内,标号的类型分为NEAR和FAR两种。NEAR类型将产生一个2字节的偏移地址,称为短指针或近指针 ;FAR类型则将产生一个包括段地址和偏移地址的4字节转移地址,称为长指针或远指针 。,返回,运算符和表达式,表达式:由寄存器名、常量、标号、变量和运算符按语法规则组合而成。在汇编期间计算表达式的值,并存于目标代码中。 运算符,常见运算符类型,运算符和表达式,运算符 算术运算符:+、-、*、和MOD 用途: 数值操作数,汇编后得到数值运算结果。 +、-运算也可用于地址操作数,但只能符合下面两种规则: 同一段内两个内储单元地址相减,得到两个内存单元之间相差的字数; 一个内存器单元地址可以加或减一个常量,产生其邻近单元的地址。 移位运算符:对常数进行逻辑右移和左移运算,汇编后得到一个新的常数。 格式: 表达式 移位运算符 移动的位数 例如,MOV AX,01001001B SHR 4 ;等效于MOV AX,0000 0100B SHL AX,00000101B SHR 2 ;等效于SHL AX,00000001B 关系运算符:双目运算符,用于比较两个表达式的大小。 说明: 表达式中的操作数必须是常数或同一段内的变量。 对于常数按无符号数比较,对于变量则比较它们的偏移量。 比较结果若为真,则关系表达式的值为-1;如果为假,则关系表达式的值为0。 例如,MOV AX,0FAH NE 00001110B;等效于MOV AX,-1,返回,运算符和表达式,运算符 逻辑运算符:实现按位相与、相或、异或、求反的逻辑运算 例如:用逻辑运算符进行运算。 MOV AL,34H AND 0FH ;04HAL MOV BL,05H OR 30H ;35HBL MOV CX,NOT 00FFH ;0FF00HCX MOV DX,789AH XOR 000FH ;7895HDX 提示:逻辑运算符只用于数值表达式中,对地址进行逻辑运算无意义。 分离运算符:单目运算符,用于提取数据的高位和低位字节或字。 HIGH:取字数据的高位字节 LOW取字数据的低位字节 HIGHWORD取双字数据的高位字 LOWWORD取双字数据的低位字。,返回,运算符和表达式,运算符的优先级,返回,2.2 常量和变量的定义,常量的定义 变量的定义 变量的属性运算,返回本节,常量的定义,符号常数是用一个标示识符来表示一个常数或常数型表达式。 优点:提高程序的可读性和通用性 符号定义伪指令 等价EQU伪指令(符号定义伪指令) 符号名 EQU 表达式 例1: R EQU 6 ;符号代表一个常数 D EQU 2*R ;符号代表一个数值表达式 提示:EQU伪指令还可表示存储单元、指令的助记符、指令、寄存器等 例2:CALLDOS EQU INT 21 ;符号代表一条指令 NUM EQU CX ;符号代表一个寄存器 OPR EQU ADD ;符号代表一个助记符 ZZ EQU ES:SI+4 ;符号代表一个内存单元 等号伪指令(=) EQU伪指令和等号伪指令的区别 EQU不允许重复定义,=允许重复定义 解除符号定义伪指令 PURGE ,符号定义 DosWriteChar equ 2 CarriageReturn = 13 CallDOS equ 符号应用(左边程序段等价右侧的符号形式) mov ah,2 ;mov ah,DosWriteChar mov dl,13 ;mov dl,CarriageReturn int 21h ;CallDOS,符号常数实例,返回,变量定义,变量定义(Define)伪指令为变量申请固定长度的存储空间,同时可进行初始化。变量的类型由数据定义伪指令确定,初值由表达式给定。 格式: 变量名 助记符 初值表 例如: a db 1,2,3,6/3,初值表 初值表是用逗号分隔的参数 主要由数值表达式、地址表达式、?或DUP组成 ?表示初值不确定,即未赋初值; DUP表示重复初值 地址表达式,示例,返回,DUP伪操作符,格式: 重复次数 DUP (初值1,初值2,初值n) 提示:DUP操作符可以嵌套定义 例: 使用DUP操作符定义一维数组和二维数组,定义时进行初始化。 答:一维数组和二维数组的定义如下: BUFl DB 10 DUP (?) BUF2 DB 100 DUP (0) BUF3 DB 3 DUP (1,2,3,4,5) BUF4 DB 3 DUP (5 DUP (?),变量定义伪指令助记符,变量定义伪指令根据申请的主存空间单位分类 DB定义字节伪指令 DW定义字伪指令 DD定义双字伪指令 DQ和DT 地址表达式只适用DW和DD两个伪指令 助记符,定义字节单元伪指令DB,DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值 初值表中每个数据一定是字节量(Byte),存放一个8位数据: 可以是0255的无符号数 可以是128127带符号数 也可以是字符串常数,Data segment;数据段 A DB 10,4,? B DB 10H,B-A C DB ABCD N DB $-B-2 Data ends,字节单元定义实例,提示:$为地址计数器,表示当前正在汇编指令或伪指令的偏移地址。,定义字单元伪指令DW,DW伪指令用于分配一个或多个字单元,并可以将它们初始化 初值表中每个数据一定是字(Word),一个字单元可用于存放任何16位数据: 一个段地址 一个偏移地址 两个字符 065535之间的无符号整数 3276832767之间的带符号整数,字单元定义实例 Data segment;数据段 A DB 10,4,? B DB 10H,B-A C DB ABCD N DB $-B-2 Data ends,定义双字单元伪指令DD,DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字(Double Word): 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针 例如: VARDD DD 0,?,12345678h FARPOINT DD 00400078h ADDR DW VARDD; 为VARDD的偏移地址 ADDRD DD VARDD ;为VARDD的偏移地址和段地址,DQ与DT伪指令,DQ伪指令可定义4个字的变量,常存放实型数,格式为: 变量名 DQ 例如, FLOAT DQ 2.545E+2 DT伪指令可定义10个字节的变量。常用于存放一个10字节的BCD码十进制数,也可以存放实型数,格式为: 变量名 DT 例如: TEN_BYTE DT 45.496E-6,例:数据定义综合应用,.model small .stack .data bvar DB 16 wvar DW bvar dvar DD 42949672 ;2321 qvar DB 1,2,3,4,5 abc DB a,b,c msg DB Hello,13,10,$ bbuf DB 12 DUP(month) dbuf DD 25 DUP(?) CALLDOS EQU .code .startup mov bl,bvar mov ax,word ptr dvar0 mov dx,word ptr dvar2 ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end,属性运算,分析运算符 得到变量或标号的某一属性(段、偏移、类型) 合成运算符和伪指令 也称为属性修改运算符,用于修改变量和标号的类型。 属性及其应用,返回,SEG运算符 OFFET运算符 TYPE运算符 LENGTH运算符 SIZE运算符,用于与内存有关的指令操作数中 格式: OFFSET 名字/标号 功能:返回名字或标号的偏移地址 例如: XP DW ? ARRAY DW 100 DUP(?) MOV SI,OFFSET XP MOV DI,OFFSET ARRAY,用于与内存有关的指令操作数中 格式:SEG 名字/标号 功能:返回名字或标号的段地址 例如: XP DW ? ARRAY DW 100 DUP(?) MOV BX,SEG XP MOV AX,SEG ARRAY,用于获得变量或标号的类型值 格式: TYPE 名字/标号 功能:返回表明名字或标号类型的一个数值 对字节、字和双字变量依次返回1、2和4; 对短、近和远转移依次返回ff01h、ff02h和ff05h 例如: w_var dw 2,3,4 mov ax,TYPE w_var;汇编结果为mov ax,2 mov ax,TYPE n_jump;汇编结果为 mov ax,0ff02h,用于获得变量的大小 格式:SIZE 变量名 功能:返回整个变量占用的字节数 即:SIZE LENGTH TYPE 例如: w_var dw 2,3,4 b_var db 3 DUP (?) mov ax,SIZE w_var;汇编结果为mov ax,2 mov ax,SIZE b_var;汇编结果为 mov ax,3,用于获得数组变量的长度 格式:LENGTH 变量名 功能:返回变量的数据项数,仅对DUP操作符定义的数组变量才有意义 例如: DATA SEGMENT A DB ABCDEF B DW 10 DUP(1,2 DUP(2) C DB 3,20 DUP(0) DATA ENDS MOV AX,LENGTH A ;1AX MOV BX,LENGTH B;10BX MOV CX,LENGTH C;1CX ,分析运算符,.date array db 45,45h .code mov ax,seg array mov ds,ax mov bx,offset array ;等价于 lea bx,array mov ax,es:2000h,实例,修改属性的运算符和伪指令,合成运算符 PTR运算符 THIS运算符 属性修改伪指令,使得同一存储单元地址可以作为不同类型的变量或标号使用,即临时改变名字或标号的类型。 格式:类型名 PTR 名字/标号 类型名:BYTE/WORD/DWORD/FWORD/QWORD/TBYTE 或者是NEAR/FAR 例如: w_var dw 10 dup(0);按字访问变量w_var b_var equ byte PTR w_var ;按字节访问变量b_var,但与w_var的地址相同 mov al,byte ptr w_var ;w_var是一个字变量 jmp far ptr n_label ;n_label是一个标号,在汇编时,当前逻辑地址具有指定的类型 格式: THIS 类型名 提示:一般与EQU同时使用 例如: b_var equ THIS byte ;按字节访问变量b_var,但与w_var的地址相同 w_var dw 10 dup(0);按字访问变量w_var f_jump equ THIS far ;用f_jump为段间转移(f_jump label far) n_jump: mov ax,w_var ;用n_jump为段内近转移,但两者指向同一条指令,在汇编时,当前逻辑地址具有指定的类型 LABEL伪指令的功能等同于“EQU THIS” 格式:名字 LABEL 类型名 例如: b_var LABEL byte ;按字节访问变量b_var,但与w_var的地址相同 w_var dw 10 dup(0);按字访问变量w_var f_jump LABEL far ;用f_jump为段间转移(f_jump label far) n_jump: mov ax,w_var ;用n_jump为段内近转移,但两者指向同一条指令,例:属性修改,设B1和A1、B2和A2表示相同内存单元的不同类型,找出错误 B1 LABEL WORD A1 DB 3 DUP (12H,? 1) N1 EQU $-A1 A2 DB 4 DUP(2,3 DUP(1,?),4) B2 EQU THIS WORD N2 EQU A2-A1,B2 EQU WORD PTR A2,.model small .stack .data v_byte equ this byte v_word dw 3332h,3735h target dw 5 dup(20h) crlf db 0dh,0ah,$ flag db 0 n_point dw offset s_label ;取得标号s_label的偏移地址 .code .startup mov al,byte ptr v_word dec al mov v_byte,al n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp short n_label ;进行短转移,例:属性及其应用1/2,s_label: cmp flag,2 jz next ;flag单元为2转移 inc flag jmp n_point;段内的存储器间接寻址,转移到s_label标号处 next: mov ax,type v_word ;汇编结果为mov ax,2 mov cx,length target ;汇编结果为mov cx,5 mov si,offset target w_again: mov si,ax ;对字单元操作 inc si ;SI指针加2 inc si loop w_again ;循环 mov cx,size target ;汇编结果为 mov cx,0ah mov al,? mov di,offset target b_again: mov di,al ;对字节单元操作 inc di ;DI指针加1 loop b_again ;循环 mov dx,offset v_word;显示结果:1357? mov ah,9 int 21h .exit 0 end,例:属性及其应用2/2,2.3 数据寻址方式,立即寻址 寄存器寻址 变量的寻址 1 直接寻址 2 寄存器间接寻址 一维数组的寻址 1 寄存器相对寻址 2 基址加变址寻址 3 比例变址寻址 4 基址比例变址寻址 二维数组的寻址 1 相对基址加变址寻址 2 相对基址比例变址寻址 跨段问题,返回本节,MOV指令的格式:MOV DST,SRC,立即寻址,立即寻址方式中,指令操作码和操作数都在存储器代码段中,紧跟在指令操作码的后面。 汇编格式: n n为立即操作数,是用8位或16位二进制补码表示的有符号数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中 图形表示: 注意:立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值,【例】,MOV AX,1024H MOV BL,41H MOV AL,A MOV DX,AB MOV EAX,123400FEH,返回本节,注意: 1、立即寻址不能用于单操作数指令 2、在双操作数指令中,立即寻址方式只能用于源操作数,不能用于目的操作数。 3、在双操作数指令中,用立即寻址表示的源操作数的长度应与目的操作数的长度一致。,寄存器寻址,寄存器寻址方式的操作数放在指令指明的寄存器中。 汇编格式:R 其中R表示寄存器名。 图形表示: R 指令操作数,【例】,下列程序执行后,(AX)=?,(BX)=? MOV AX,1234H ;目的操作数地址,为寄存器寻址方式 MOV BX,5678H ;目的操作数地址,为寄存器寻址方式 ADD AX,BX ;源地址和目的地址皆为寄存器寻址方式 图形表示: 执行: 1234HAX 5678HBX (AX)+(BX)AX 执行后:(AX)=68ACH,(BX)=5678H,返回本节,有效地址,若数据在主存中,则操作数的格式需指明数据在主存位置的存储器地址 有效地址(EA ):操作数所存放单元的偏移地址。 EA的组成: EA=基址+变址*比例因子+位移量 位移量:8/16/32位地址 基址:存于基址寄存器(BX、BP)中,指向数据段中一组数据的首址 变址:存于变址寄存器(SI、DI)中,指向数据段中某一数据的首址 比例因子:变址*比例因子=变址 (比例因子为1、2、4、8) 寻址方式中默认段寄存器选择 若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。,返回本节,1 直接寻址,格式: 含有变量的地址。 段寄存器名:EA 功能:指令下一字单元的内容是操作数的偏移地址EA。 图形表示:,【例】,【例】寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=1245H。 执行指令:MOV AX ,BUF 执行后:(AX)=? 图形表示: 执行:(32000H)AX 执行后:(AX)=1245H,1245H,返回本节,BUF,例:MOV BL,NUM MOV AX,1000H MOV 1000H,A,2 寄存器间接寻址,寄存器间接寻址方式中,操作数放在存储器中,寄存器的内容为操作数的偏移地址EA。 汇编格式:R 功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。,偏移地址EA计算方法如下:,对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器,执行指令:MOV AX ,BP 执行后:(AX)=?,(BP)=?,(SS)=?,(20030H)=? 图形表示如下:,寄存器和存储器内容分别为:(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H,【例】,MOV DI,XY MOV BX,BH,应用,通常用于访问存储器中的数据表 例:在2000H开始的十个单元中依次放入从1开始的10个自然数。 MOV BX,2000H MOV CX,10 MOV AL,1 L: MOV BX,AL INC AL LOOP L,返回本节,1 寄存器相对寻址,寄存器相对寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。 汇编格式:XR(X表示位移量,是8位或16位二进制补码表示的有符号数) 功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。 图形表示如下:,偏移地址EA计算方法如下:,对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器,【例】,设执行前: (AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H 执行指令:ADD 6BX,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=? 图形表示如下:,例如 MOV BL,DI+100 MOV ARRAYSI,CL,应用,用于表达一维数组中的数据 例:在2000H开始的十个单元中依次放入从1开始的10个自然数。 MOV CX,10 MOV BX,1 L: MOV 2000HBX,BL INC BX LOOP L,返回本节,2 基址加变址寻址,基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容2项之和,操作数在存储器中。 汇编格式: BR+IR 功能:操作数存放在存储器,BR的内容加IR的内容是操作数的偏移地址EA。 图形表示:,操作数偏移地址EA计算方法如下,对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器,【例】,设执行前: (BX)=0040H,(DI)=0030H, (AX)=0040H ,(DS)=2000H,(20070H)=0050H 执行指令:ADD BXDI,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20070H)=? 图形表示如下:,返回本节,用途:表达一维数组中的数据,1 相对基址加变址寻址,基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量三项之和,操作数在存储器中。 汇编格式:X BR+IR 功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。 图形表示:,操作数偏移地址EA计算方法如下,【例】,设执行前: (BX)=0040H,(DI)=0030H, (AX)=0040H ,(DS)=2000H,(20076H)=0050H 执行指令:ADD 6BXDI,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20076H)=? 图形表示如下:,返回本节,例如: MOV BX+DI+100H,BL MOV ARRAYBP+DI,AX MOV ARRAYBXSI,AL,应用:表达二维数组中的数据,对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器,3 比例变址寻址(386以上的机型),比例变址寻址方式中,操作数的偏移地址EA是指令中32位变址寄存器内容*比例因子+位移量,操作数在存储器中。 汇编格式:X R32*d 功能:操作数存放在存储器,R的内容乘以d加位移量X是操作数的偏移地址EA。 图形表示:,操作数偏移地址EA计算方法如下,【例】,设执行前: (EBX)=00000010H,(AX)=0040H ,(DS)=2000H,(20048H)=0050H 执行指令:ADD 8EBX*4,EAX 执行后:(AX)=?,(BX)=?,(DS)=?,(20048H)=?,执行:(20048H)+(AX) 20048H 执行后: (AX)=0040H,(EBX)=40H,(DS)=2000H,(20048H)=0090H。,返回本节,应用:表达存取多字节数据的一维数组元素,4 基址比例变址寻址,基址比例变址寻址方式中,操作数的偏移地址EA是指令中32位变址寄存器内容*比例因子+ 32位基址寄存器内容,操作数在存储器中。 汇编格式:BRIR*d 功能:操作数存放在存储器,IR的内容乘以d加BR的内容是操作数的偏移地址EA。 图形表示:,BR,操作数偏移地址EA计算方法如下,EA=BR+IR*d,【例】,设执行前: (ESI)=00000010H,(AX)=0040H , (EBX)=8,(DS)=2000H,(20048H)=0050H 执行指令:ADD EBXESI*4,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20048H)=?,执行:(20048H)+(AX) 20048H 执行后: (AX)=0040H,(ESI)=40H,(DS)=2000H,(20048H)=0090H。,返回本节,例如: MOV EAX,EBX+ECX*4 MOV AX,ARRAY2*EDI,应用:表达存取多字节数据的一维数组元素,2 相对基址比例变址寻址,相对基址比例变址寻址方式中,操作数的偏移地址EA是指令中32位变址寄存器内容*比例因子+ 32位基址寄存器内容+位移量,操作数在存储器中。 汇编格式:BRIR*d+位移量 功能:操作数存放在存储器,IR的内容乘以d加BR的内容加位移量是操作数的偏移地址EA。 图形表示:,操作数偏移地址EA计算方法如下,EA=BR+IR*d+X,【例】,设执行前: (ESI)=00000010H,(AX)=0040H , (EBX)=8,(DS)=2000H,(20050H)=0050H ,SA=8 执行指令:ADD SAEBXESI*4,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20050H)=?,执行:(20050H)+(AX) 20050H 执行后: (AX)=0040H,(ESI)=40H,(DS)=2000H,(20050H)=0090H。,返回本节,应用:表达存取多字节数据的二维数组元素,跨段问题,按前述规定:若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。 汇编格式:段寄存器名:操作数地址。 功能:段寄存器名指明操作数属哪个段。,【例】跨段前缀示例。,MOV AX,DS:BP MOV CX,SS:SI 该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为: PA1 =(DS)左移4位+BP PA2 =(SS)左移4位+SI,小结:,表示某一内存单元 直接寻址: 数值或变量名或变量名或变量名数值 寄存器间接寻址: 寄存器 表示一维数组的某个单元 以字节为单位: 寄存器相对寻址:X寄存器或寄存器+X 基址变址寻址: 基址寄存器变址寄存器或基址寄存器+变址寄存器 以字、双字等为单位: 比例变址寻址:X寄存器*比例因子 基址比例变址寻址:基址寄存器变址寄存器*比例因子 表示二维数组的某个单元 以字节为单位: 相对基址变址寻址: X基址寄存器变址寄存器或基址寄存器+变址寄存器+ X 或X基址寄存器+变址寄存器 以字、双字等为单位: 相对基址比例变址寻址:X基址寄存器变址寄存器*比例因子,返回本节,2.4 基本指令,通用数据传送指令 地址传送指令 简单算术运算指令,返回本节,通用数据传送指令,传送指令MOV 数据交换指令XCHG 查表转换指令 XLAT,返回本节首页,传送指令MOV,语句格式:MOV OPD,OPS 功能:将源操作数传送入目的地址,源地址内容不变.即(OPS)OPD 下图描述了MOV指令在传送数据时允许传送的路径及类型。,传送指令MOV,【例】存储器与寄存器间数据传送。 MOV AX,BUF MOV BH,byte ptr DI MOV DI,ES:3SI MOV BP,3BX+SI MOV BUFA,DL MOV BP,AX MOV DS:BP,DL MOV BUF,DS MOV ES ,BUF,返回本节,若源操作数的内存单元大小小于目的操作数的寄存器时,提示警告错误,可以忽略;若源操作数的内存单元大小大于目的操作数的寄存器时,提示错误,必须修改。,数据交换指令XCHG,语句格式:XCHG OPD,OPS 功能:将源地址与目的地址中的内容互换。即(OPD)OPS,(OPS)OPD。 【例】寄存器与存储器之间数据交换。 MOV AX,5678H ;(AX)=5678H MOV BX,0FFFFH ;(BX)=0FFFFH XCHG AX,BX ;(AX)=0FFFFH ,( BX)=5678H,返回本节,查表转换指令 XLA,语句格式:XLAT OPS或XLAT 功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即(BX+AL)AL。 例:利用查表的方式求任一数的平方 SQR DB 0,1,4,9,16,25,36,49,64,81,MOV AX,SEG SQR MOV DS,AX MOV AL,3 LEA BX,SQR=MOV BX,OFFSE SQR XLAT,返回本节,地址传送指令,传送偏移地址指令 LEA 传送偏移地址及数据段首址指令LDS 传送偏移地址及附加数据段指令LES,返回本节首页,传送偏移地址指令 LEA,语句格式: LEA REG16,MEM 功能:将MEM的偏移地址送入指定寄存器。 即OFFSET MEMOPD。 【例】主存偏移地址的获取。 MOV BX,0100H ;(BX)=0100H MOV SI, 0410H ;(SI) =0410H LEA BX,1434BX+SI ;(BX)=1944H,返回本节,传送偏移地址及数据段首址指令LDS,语句格式:LDS REG16,MEM 功能:将MEM的2个相继字单元的内容送入指定寄存器和DS寄存器。 即(MEM)16REG16,(MEM+2)DS 。 【例】 LDS BX,10H,返回本节,DS:0010,BX,DS,传送偏移地址及附加数据段指令LES,语句格式:LES REG16,MEM 功能:将MEM的2个相继字单元的内容送入指定寄存器和ES寄存器。 即(MEM)16REG16,(MEM+2)DS 【例】 LES BX,10H,返回本节,算术运算类指令,加法运算 减法运算 乘法运算 除法运算 综合练习,返回本节首页,加法运算,加1指令 INC 加指令ADD 带进位加指令ADC 交换并相加,返回,加1指令 INC,语句格式:INC OPD 影响的标志:AF、ZF、SF、PF、OF,不影响CF 功能:将目的操作数加1,结果送目的地址。 即(OPD)+1OPD。 INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。 提示:加1指令可用于对计数器和地址指针进行调整,而不是用于算术运算,所以不影响CF。 例如: INC BX;即(BX)+1BX。 INC BYTE PTR SI,返回本节,加指令ADD,语句格式:ADD OPD, OPS 影响的标志:AF、ZF、SF、PF、OF、CF 功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。 即(OPD)+(OPS)OPD。 源操作数可是立即数、寄存器、存储器;目的操作数可是寄存器、存储器,例:求在NUM和NUM+1单元字节数据的和 MOV AL,NUM ADD AL,NUM+1 例:累加ARRAY数组中第3、5、7个数组元素。设数组元素为字数据 MOV BX,OFFSET ARRAY ADD BX,2*2 MOV AX,BX ADD BX,2*2 ADD AX,BX ADD BX,2*2 ADD AX,BX,返回本节,若采用基址变址寻址方式应如何写代码? 若采用寄存器相对寻址方式呢?,语句格式:ADC OPD,OPS 影响的标志:AF、ZF、SF、PF、OF、CF 功能:将目的操作数加源操作数再加低位进位,结果送目的地址。即(OPD)+(OPS)+CF OPD。 源操作数可是立即数、寄存器、存储器;目的操作数可是寄存器、存储器 ADC指令主要与ADD配合,实现多精度加法运算 【例】无符号双字加法运算。 MOV AX,4654H ;(AX)=4654H ADD AX,0F0F0H ;(AX)=3744H,CF=1 MOV DX,0434H ;(DX)=0434H ADC DX,0F0F0H ;(DX)=0F525H,CF=0,3带进位加指令ADC,返回本节,4交换并相加指令XADD,语句格式:XADD OPD,OPS 影响的标志:AF、ZF、SF、PF、OF、CF 功能:将目的操作数加源操作数结果送临时存储单元,目的操作数送源地址,存储单元的内容送目的地址。即(OPD)+(OPS) TEMP (OPD) OPS , (TEMP) OPD 。 源操作数和目的操作数可是寄存器、存储器,例: MOV BL,12 MOV DL,2 XADD BL,DL;BL=14,DL=12,返回本节,加法指令,减法运算,减1指令DEC 减指令SUB 带借位减指令 SBB 求补指令NEG 比较指令 CMP,返回,减1指令DEC,语句格式:DEC OPD 影响的标志:AF、ZF、SF、PF、OF,不影响CF 功能:将目的操作数减1,结果送目的地址。即(OPD)1OPD。 DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。 减1指令DEC一般用于对计数器和地址指针的调整。 例如: DEC CX;即(CX)1CX。 DEC BYTE PTR BXDI,返回本节,减指令SUB,语句格式:SUB OPD,OPS 影响的标志:AF、ZF、SF、PF、OF、CF OF=1被减数与减数符号相反,差与减数符号相同。表示有符号数溢出。 功能:目的操作数减源操作数,结果存于目的地址,源地址内容不变。即(OPD)(OPS)OPD 源操作数可是立即数、寄存器、存储器 ;目的操作数可是寄存器、存储器 【例】减法运算。 MOV AX ,5678H ;(AX)=5678H SUB AX ,1434H ;(AX)=4244H,返回本节,带借位减指令 SBB,语句格式:SBB OPD,OPS 功能:目的操作数减源操作数再减低位借位CF,结果送目的地址。 即(OPD)-(OPS)-CF OPD 影响的标志:AF、ZF、SF、PF、OF、CF 源操作数可是立即数、寄存器、存储器 ;目的操作数可是寄存器、存储器 SBB指令主要与SUB配合,实现多精度减法运算,例:双字减法 mov ax,4652h ;ax=4652h sub ax,0f0f0h ;ax=5562h,CF=1 mov dx,0234h ;dx=0234h sbb dx,0f0f0h ;dx=1143h,CF=1,返回本节,求补指令NEG,语句格式:NEG OPD 功能:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。 即0FFFFH-(OPD)+1OPD。 影响的标志:AF、ZF、SF、PF、OF、CF 【例】 求补运算。 MOV AX,2 NEG AL SUB AL,9DH NEG AX DEC AL NEG AX,返回本节,【例】 将DX:AX的内容求补,CODE SEGMENT ASSUME DS: CODE ,SS: CODE ,CS:CODE BEGIN: MOV AX,0FFECH MOV DX,A988H MOV AX,4C00H INT 21H CODE ENDS END BEGIN,NEG AX NEG DX,NOT AX NOT DX ADD AX,1 ADC DX,0,INC AX,比较指令 CMP,语句格式:CMP OPD,OPS 功能:目的操作数减源操作数,结果只影响标志位,不送入目的地址。 即(OPD)(OPS)。 对于无符号数,当CF=1时,则(OPD)(OPS);当OF、SF不同时,则(OPD)=50,( AL)50AL INC AH ;(AH)+1AH BELOW: ,返回本节,减法指令,乘法运算,无符号数乘法指令MUL 有符号乘指令IMUL 只影响CF和OF,返回,无符号数乘法指令MUL,语句格式: MUL OPS 功能: 字节乘法:(AL)* (OPS8) AX 字乘法: (AX) * (OPS16) (DX,AX) 双字乘法:(EAX)*(OPS32) (EDX,EAX) 标志:CF、OF用于判断乘积是字节、字、双字 CF=OF=0积的高一半全为0 CF=OF=1积的高一半不全为0 【例】无符号数0A3H与11H相乘。 MOV AL,0A3H ;(AL)=0A3H MOV BL, 11H ;(BL)=11H MUL BL ;(AX)=0AD3H,返回本节,有符号乘指令IMUL1,语句格式:IMUL OPS 功能 字节乘法:(AL)*(OPS)AX 字乘法:(AX)*(OPS)(DX,AX) IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。 标志:CF、OF用于判断乘积是字节、字、双字 CF=OF=0积的高一半是低一半的符号扩展 CF=OF=1积的高一半不是低一半的符号扩展 注意:因为结果的长度是因数长度的2倍,所以即使OF=1结果也正确 【例】有符号数0B4H与11H相乘。 MOV AL,0B4H ;(AL)=B4H MOV BL,11H ;(BL)=11H IMUL BL ;(AX)=0FAF4H,有符号乘指令IMUL2,语句格式:IMUL REG,SRC 功能 字乘法:(REG16)*(SRC16)(REG16) 双字乘法:(REG32)*(SRC32) (REG32) 注意:源操作数可是8、16、32位立即数。 语句格式:IMUL REG,SRC,IM 功能 字乘法:IM*(SRC16)(REG16) 双字乘法:IM*(SRC32) (REG32) 注意:源操作数可是8、16、32位立即数。 标志:CF、OF 注意:OF=1结果溢出,不正确,返回本节,除法运算,无符号除指令DIV 符号扩展指令和有符号除指令IDIV,注意 除运算指令不影响标志位。 若商超出AL/AX/EAX的范围,则产生除法错误异常,这时商和余数都无意义。,返回,无符号除指令DIV,语句格式:DIV OPS 功能: 字节除法:(AX)/(OPS) AL(商)、AH(余数) 字除法:(DX、AX)/(OPS) AX(商)、DX(余数) 【例4.47】写出实现无符号数0400H / 0B4H运算的程序段。 MOV AX,0400H ;(AX)=0400H MOV BL,0B4H ;(BL)=0B4H DIV BL ;商(AL)=05H,余数(AH)=7CH,返回本节,符号扩展指令,CBW;字节转换成字。即符号扩展(AL)AX CWD ;字转换成双字。 即符号扩展(AX)DX,AX CWDE;字转换成双字,即符号扩展(AX)EAX CDQ ;双字转换成4字。 即符号扩展(EAX)EDX,EAX,返回本节,有符号除指令IDIV,语句格式:IDIV OPS 功能: 字节除法: (AX)/(OPS) AL(商)、AH(余数) 字除法: (DX,AX)/(OPS) AX (商)、DX(余数) 【例4.48】写出实现有符号数0400H /0B4H运算的程序段。 MOV AX,0400H ;(AX)=0400H CWD MOV BX,0B4H ;(BX)=0B4H IDIV BX ;(DX,AX)/(BX) 除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出,返回本节,除法错中断,当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断除法错中断 对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出 对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,则发生除法溢出,习题,设X、Y、Z、V均为16位带符号数,分别存放在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?,X Y Z V,65 F3 02 00 24 E0 05 00,mov ax,X imul Y mov cx,ax mov bx,dx mov ax,Z cwd add cx,ax adc bx,dx,sub cx,540 sbb bx,0 mov ax,V cwd sub ax,cx sbb dx,bx idiv X,结果:,DX.AX(V(XYZ540)X,返回,2.4 源程序的基本格式,指令的格式-行格式 段格式 程序设计,返回本节,CPU的指令格式,l 双操作数指令的格式 大多数数据传送类指令、算术运算类指令、位操作类指令及串操作类指令,其双操作数指令有相同的语句格式和操作规定。 格式:标号: 操作符 OPD, OPS ;注释 l 单操作数指令的格式 算术运算和位操作类指令的部分是单操作数指令,它们有相同的语句格式和操作规定。 格式:标号: 操作符 OPD ;注释
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文化旅游演艺项目成功案例解析与运营模式创新报告
- 2025年深远海风电场规划与海上风能资源评估技术引进与自主创新能力提升报告
- 2025年新能源商用车辆市场新能源汽车充电桩市场智能化应用:市场需求与应用场景报告001
- 山东省枣庄市第三十九中学2024-2025学年上学期阶段性诊断检测七年级数学试题(无答案)
- 网络商城和公司转让居间合同
- 四年级 党规党章进课堂教学计划
- 2025年AI应用市场洞察分析报告
- 岩石矿产与课件
- 岩土勘察测量培训课件
- 小黄鹂鸟课件
- 2025-2030中国铝合金门窗行业发展分析及投资前景与战略规划研究报告
- 矿泉水定制合同协议
- 临床技术操作规范麻醉学分册
- CNAS-CC121-2017 环境管理体系审核及认证的能力要求
- 电力工程项目中八大员的具体职责
- 纪念九·一八:致敬那场永不妥协的抗争-主题班会课件
- 铂耐药复发性卵巢癌诊治中国专家共识(2025年版)解读课件
- 《人工智能基础与应用-(AIGC实战 慕课版)》全套教学课件
- 2025年护士执业资格考试题库(社区护理学专项)-社区护理护理法律法规试题
- 第一单元 从感知到物联 第2课传感之古今未来 教学设计2024-2025学年 人教版新教材 初中信息技术八年级上册
- 2024年同等学力申硕《英语》试题真题及答案
评论
0/150
提交评论