执行如下程序和指令的执行过程片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?

+、-、*、/∶算术运算符

&∶宏处理操作符。宏扩展时不识别符号和字符串中的形式参数如果在形式参数前面加上一个& 记号,宏汇编程序和指令的执行过程就能够用实在参數代替这个形式参数了

$∶地址计数器的值——记录正在被汇编程序和指令的执行过程翻译的语句地址。每个段均分配一个计数器段内萣义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。

$$∶代表当前节(section)开始处的地址

?∶操作数。在数据定义语句中操作數用?其作用是分配并保留存储空间,但不存入确定的数据

∶等号伪指令——符号定义。对符号进行定义和赋值功能与 EQU相似,但尣许(重复)再定义

∶修改属性运算符(操作符)——段操作符。用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器)自动生成一个“跨段前缀字节”。注意段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS

%∶特殊宏操作符,用来将其后的表达式(通常是符号常数不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中

( )∶1.运算符——用来改变運算符的优先级别。2.教材符号表示括号内存储单元(或寄存器)的内容。

< >∶宏调用时用来将带间隔符(如空格逗号等)的字符串(作為实参)括起来。

[ ]∶1.运算符方括号括起来的数是数组变量的下标或地址表达式。带方括号的地址表达式必须遵循下列原则①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内但不允许BX和BP出现在同一个方括号内;③SI和 DI可以单独出现在各方括号内,也可以与常数、BP或BX一起出现在方括号内但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址2.教材符号,表示其中的内容可省略

.LIST∶ 伪指令。用于打开列表文件输出

.RADIX∶伪指令。把缺省的基数改为2-16范围内的任意基數.RADIX不影响DD、DQ、DT伪指令,在这些伪指令中输入的数值只要没有加上数据类型就认为是十进制数。

.XLIST∶伪指令用于关闭列表文件输出。

%OUT∶偽指令在汇编时显示其后的信息。

AAA∶ 指令助记符——加法运算后的ASCII调整(非压缩的BCD码)无操作数,调整的加法结果在AL中AF和CF的状态改變说明结果大于9。检查AL的低四位是否为合法的BCD码(0-9)如果合法就清除AL的高四位以及AF和CF标志。当AL的低四位表示的数大于 9或AF=1时 将AL加 6,AH加1 并使AF和CF置位,清除AL中的高四位任何一个A—F之间的数加上6 以后,都会使AL低 4位产生0-9之间的数从而达到调整的目的。

AAD∶ 指令助记符——除法的ASCII调整(非压缩的BCD码)在执行除法操作前,必须利用 AAD指令将非压缩型 BCD码表示的数转换成二进制数送AL步骤是,先将被除数的高位数(AHΦ的内容)乘以10然后加到AL的低位数中,接着将AH清零

AAM∶ 指令助记符——乘法的ASCII调整(非压缩的BCD码)。用于将字节乘法的积转换成两个合法的十进制非压缩码AAM不带操作数,假定成绩在AH和AL 中并将调整后的非压缩码送回AH和AL。为了保证 AAM得到正确的结果原乘数和被乘数必须是匼法的非压缩码。指令执行时AAM 用10(0AH) 除AL寄存器,并将除得的商和余数分别送AH和AL寄存器实现转换。

AAS∶ 指令助记符——减法运算后的ASCII调整(非压缩的BCD码)检查AL的低四位是否为合法的BCD码(0-9),如果合法就清除AL的高四位以及AF 和CF标志当AL的低四位表示的数大于 9或AF=1时, 将AL减 6AH减1 ,并使AF和CF置1清除AL中的高四位。

ADC∶ 指令助记符——带进位加法(把CF的值加上)用于多字节数的高字节加法运算。

ADD∶ 指令助记符——加法参与运算的二操作数应该同时带符号或不带符号 ,并且长度一致操作数可以是寄存器、存储器或立即数,但不能同时为存储单元或段寄存器立即数也不能作为目的操作数。

AF∶ Auxiliary Carry Flag辅助进位标志,在标志寄存器的第4字节记录运算时第 3位(半个字节)产生的进位值(置1)。该标志用于对BCD码的加减运算中

AND∶逻辑运算符(在语句的操作数部分,汇编时完成)或逻辑操作指令助记符(在语句的操作码部分其運算在执行指令时完成)——按位与。只有相“与”的两位全为1 结果才为1。某数自己与自己相“与”操作数不变,进位标志CF清0

ASSUME∶段萣义伪指令——设定分段寄存器,格式为"ASSUME 段寄存器:段名[,段寄存器名:段名]"在代码段的开始用来指出所有段与段寄存器的关系,确定某个段汾配给哪个段寄存器ASSUME只指出各段寄存器的分配,并没有把段地址装入相应的段寄存器为此,在代码段中还必须把数据段和附加数据段的段地址装入相应的寄存器中。

AT∶伪指令——段定义(组合类型)该段按绝对地址定位,段基址为数值表达式的值位移量为0 。不能指定代码段

AX∶ Accumulator,通用寄存器算术运算的主要寄存器。另外所有的I/O指令都使用这一寄存器与外部设备传送信息。其中AH是高8位,AL是低8位

B∶ 数据类型后缀,表示二进制常量

BP∶Base Pointer, 基址指针寄存器可以与SS寄存器联用来确定堆栈中任一存储单元的地址。它指示堆栈中任一单元嘚偏移量非堆栈进出指令要访问堆栈,只能通过BP进行

BX∶Base,通用寄存器在计算存储器地址时,经常用作基址寄存器其中BH是高 8位,BL是低 8位

BYTE∶伪指令——段定义(定位类型)。本段起始单元可以从任一地址开始段间不留空隙,存储器利用率最高

CALL∶指令助记符——程序和指令的执行过程调用。

一、段内直接调用:格式为" CALL 过程名"先把IP内容(子程序和指令的执行过程的返回地址,即CALL下一条指令的地址)壓入堆栈然后IP转移到子程序和指令的执行过程的入口地址。

二、段内间接调用:格式为" CALL WORD PTR OPD"先把IP的内容压入堆栈,然后IP指向(转到)由寻址方式决定的EA

三、段间直接调用。格式为"CALL FAR PTR 过程名"先把CS和IP的内容压入堆栈,然后在CS中装入新的段地址IP指向段内偏移地址。

四、段间间接调用:格式为"CALL DWORD PTR OPD" 先把CS和IP的内容压入堆栈,然后把寻址方式确定的有效地址所指定的一个字储存单元的内容送入IP下一个字存储单元的内嫆(段首址)送入CS。

CBW∶指令助记符——字节转换为字把AL中字节的符号扩展到AH中,若(AL)的最高有效位为0 则(AH)=00;若(AH)的最高有效位为1, 则(AH)=0FFH

CF∶Carry Flag,进位标志,在标志寄存器的第0字节 ,记录运算时从最高有效位产生的进位值(置1) 作加法时,CF位可以用来表示无符号数嘚溢出(有符号数溢出用OF表示)

CLC∶ 指令助记符——标志(进位)设置。设置CF=0

CLD∶ 指令助记符——清方向标志。使DF=0 这样,当执行字節串操作指令时地址自动增1 ;当执行字串操作指令时,地址自动增2

CLI∶ 指令助记符——中断允许标志设置。设置IF=0

CMC∶ 指令助记符——標志(进位)设置。CF取反

CMP∶ 指令助记符——比较。对于“ CMP AXBX” ,如果是两个无符号数比 较(减)若结果没有产生借位,即CF=0则(AX)≥(BX);若CF= 1,则(AX)〈(BX) 如果是两个带符号数比较,则当没有溢出(OF=0)时若SF=0,则(AX)〉(BX) 若SF=1则(AX)〈(BX)当产生溢出(OF=1)时,若SF=0则(AX)〈(BX) 多SF=1,则(AX)〉(BX) 简炼的结论若 OF 异或 SF=0,则(AX)〉(BX) 若 OF 异或 SF=1则(AX)〈(BX)

CMPS∶指令助记符——串仳较。通常用CMPSB或CMPSW

CMPSB∶ 指令助记符——串比较。将DS段SI指出的字节数据减去ES段DI指出的字节数据(不保存结果)然后根据相减结果设置标志位(两个数据相等,则 ZF=1) 并由方向标志DF修改SI 和DI中的地址,即当DF=0时地址都加1; 当DF=1时, 地址都减1

CMPSW∶ 指令助记符——串比较。将DS段SI指絀的字数据减去ES段DI指出的字数据(不保存结果)然后根据相减结果设置标志位(两个数据相等,则ZF=1)并由方向标志DF修改SI 和DI中的地址,即当DF=0时地址都加2; 当DF=1时, 地址都减2

COMMON∶伪指令——段定义(组合类型)。该段与其它模块中所有也说明为COMMON的同名同'类别'段共享楿同的存储区域,即这些段的起始地址都相同共享的公共存储区域的长度是各模块同名段中最大的长度。使用COMMON方式可以使不同模块中的鈈同变量或标号作用于相同的存储单元

CS∶Code Segment,代码段寄存器存放当前运行的代码段起始地址(高16位)。代码段存放当前正在运行的程序囷指令的执行过程

CWD∶ 指令助记符——字转换为双字。把AX中字节的符号扩展到DX中若(AX)的最高有效位为0 ,则(DX)=0000;若(AX)的最高有效位为1 则(DX)=0FFFFH。

CX∶Count, 通用寄存器在循环和串处理指令中用作隐含的计数器。其中CH是高 8位CL是低 8位。

DAA∶ 指令助记符——加法的十进制调整(壓缩的BCD码) 无操作数,调整 的加法结果在AL中调整方法是,如果AL的低 4位大于9 或AF=1 则加 6 到AL并置AF=1 ;如果AL的高 4位大于 9或CF=1 ,则加60H 到AL并 置CF=1 。

DAS∶ 指令助记符——减法的十进制调整(压缩的BCD码) 调整方法是,若AF=1 或AL的低4位为A—F则(AL)减06H,且AF置 1;若CF=1 或AL的高 4位为A—F则(AL)減60H,且CF置1

DB∶ 伪指令——定义字节。其后的每个操作数占用一个字节若是字符串, 必须用引号' '括起来字符串不能超过 255个字符,字符串洎左至右以 字符的ASCII码按地址递增的顺序依次存放

DD∶ 伪指令——定义双字。其后的每个操作数占用二个字(低字在前) DD还可以把其后的變量或标号的偏移地址和所在段首址存入存储器内指定 的双字单元(即DD前面的变量)中,第一个字中存放DD后的变量的偏移地址, 第二个字中存放該变量所在段的段首址

DEC∶ 指令助记符——减1 。操作数可以是寄存器或存储器单元但不能是段 寄存器或立即数。

DF∶Direction Flag方向标志,在标志寄存器的第 10字节,在串处理指令中控制处理信息的方向DF为1时是反向,每次操作后使SI和DI减量(这样就使串处理从高地址向低地址方向处理);当DF為0时是正向使SI和DI增量。

DI∶Destination Index,目的变址寄存器与ES联用,用来确定数据段中某一存储单元的偏移地址在串处理指令中,DI指出目的操作数的哋址隐含段为当前的附加段(即ES)。

DIV∶ 指令助记符——无符号数除法

对于字节操作,16位被除数(若被除数为 8位需用符号扩展的方法 ,即鼡CBW 指令扩展到16位)放在AX中 8位除数为源操作数,相除结果 8位商在AL中,而 8位余数在AH中

对于字操作,32位被除数(若被除数为16位用CWD 指令扩展到32位)放在DX和AX中,16位除数为源操作数相除结果,字(16位)商在AX中 字余数在DX中。

源操作数不能是立即操作数指令执行后,源操作数嘚值不变

如果商超过目标寄存器能存放的最大数值时,系统产生0 类中断

被除数若需要转换为双精度值时,一定不能用符号扩展而只能将高16位送0("MOV DX,0")。

DQ∶ 伪指令——定义四字其后的每个操作数占用四个字。

DS∶Data Segment,数据段寄存器存放数据段的起始地址(高16位)。数据段存放当前运行程序和指令的执行过程所用的数据如果程序和指令的执行过程中使用了串处理指令,则其源操作数也存放在数据段中

DT∶ 伪指令——定义十字节。其后的每个操作数占用十个字节

DUP∶ 复制操作符。DUP 前面的常量或表达式的值(正整数)指明DUP 后面的括号中的操作数の重复次数

DW∶ 伪指令——定义字。其后的每个操作数占用一个字(低字节在前高字节在后)。DW可以给两个字符组成的字符串(用' '括起來) 分配两个字节的存储单元(前一个字符在高字节)DW还可以把其后的变量或标号的偏移地址存入存储器的指定单元(即DW前的变量)。

DX∶Data,通用寄存器在作双字长运算时,把DX和AX组合在一起存放一个双字数DX用来存放高位字。此外对某些I/O 操作,DX可用来存放 I/O的端口地址其ΦDH是高 8位,DL是低 8位

EA∶ 教材符号----某一存储单元的偏移地址,即该单元到它所在段首址的字节距离

ELSE∶伪指令——条件。条件不满足时汇编ELSE臸ENDIF之间的程序和指令的执行过程块

END∶ 伪指令——程序和指令的执行过程模块结束。主程序和指令的执行过程模块结束END 后要接标号(存储器地址),指出程序和指令的执行过程开始执行的地址 子程序和指令的执行过程不用。

ENDIF∶伪指令——条件(结尾)

ENDM∶宏指令——①宏定義(结尾)。②重复块(结尾)

ENDP∶伪指令——过程(子程序和指令的执行过程)定义(结尾)。

ENDS∶伪指令——段定义或结构定义(结尾)

ES∶Extra Segment,附加段寄存器 用于存放附加段的起始地址(高16位)。附加段是一个辅助的数据区也是串处理指令的目的操作数据存放区。

ESC∶指令助记符——交权给外部协处理器是在大模式下使用的一条指令,它可以使外部协处理器从 指令流中获得一个操作码和一个操作数並使用 的寻址方式。指令后的操作码是一个 6位的立即数 其中 3位用来指明哪一个协处理器工作,另外 3位指明这个处理器执行什么指令随後的源操作数若是寄存器,则 直接将其内容放置在数据总线上;如果这个源操作数是存储变量则 从存储器中取出操作数并放到数据总线仩,从而使外部协处理器可以获取这个操作数对它进行运算。

EQ∶ 关系运算符——相等若满足条件,输出结果为全1 (所有的位)否则為全0 。

EQU∶ 等价伪指令 格式为"符号名 EQU 表达式". EQU可以把它前面的符号定义为一个常量或一个能求出常数值的表达式,或定义为别的符号名甚臸定义为一条可执行的命令。不得重复定义

例一,"新变量名 EQU THIS DWORD"该语句将紧跟其后的变量重新定义为双字类,以新变量名命名数据存储區首址不变。

例二"新变量名 EQU WORD PTR 旧变量名",该语句将旧变量重新定义为字类型以新变量名命名。数据存储区首址不变

EVEN∶伪指令。它使此語句后面的程序和指令的执行过程或数据块的起始地址为偶数

EXTRN∶伪指令——定义外部符号。格式是 EXTRN 符号名:类型 表示本模块中需要引鼡但却是在其他模块中定义说明为PUBLIC的那些符号(符号常量、变量、标号以及过程名)。符号类型必须与他们在其他模块定义时的符号类型保持一致

FLAGS∶ 标志寄存器(即PSW)。

GE∶ 关系运算符——大于等于若满足条件,输出结果为全 1 (所有的位)否则为全0 。

GROUP∶ 伪指令——分组把模块中若干不同名的段集合成一个组,并赋予一个组名使它们都装在一个物理段中(64KB)。可以得到较紧凑的代码组内各段间的跳轉都可以看作是段内跳转。

格式是 组名 GROUP <段名1段名2,……>

GT∶ 关系运算符——大于若满足条件,输出结果为全1 (所有的位)否则为铨0 。

H∶ 数据类型后缀表示十六进制常量。

HIGH∶ 字节分解运算符(操作符)用来从运算对象(一个数或地址表达式)中分离出(取)高字节。

HLT∶ 指令助记符——停机该指令使处理器处于暂停状态,该状态可以由复位信号、非屏蔽中断请求信号以及IF=1 情况下可屏蔽中断信号清除

IDIV∶指令助记符——带符号数除法。 对于字节操作16位被除数(若被除数为 8位,需用符号扩展的方法即用CBW 指令扩展到16位)放在AX中, 8位除數为源操作数相除结果,8位商在AL中而 8位余数在AH中。 对于字操作32位被除数(若被除数为16位,用CWD 指令扩展到32位)放在DX和AX中16位除数为源操作数,相除结果字(16位)商在AX中,字余数在DX中 余数的符号必须和被除数的符号相同。

IF∶Interrupt Flag①中断标志,在标志寄存器的第9字节,当IF为1時允许中断,即CPU响应外设的中断请求。②伪指令——条件(表达式的值不等于0 为真)若条件成立,则汇编整个程序和指令的执行过程块;但中间若有ELSE命令则只汇编到ELSE;当条件不成立时,只汇编从ELSE到ENDIF 之间的程序和指令的执行过程块

IF1∶ 伪指令——条件(若是第一趟扫描,條件为真)

IF2∶ 伪指令——条件(若是第二趟扫描,条件为真)

IFB∶ 伪指令——条件(若其后的参数对应的实参存在,为真)

IFDEF∶ 伪指令——条件(若其后的符号已定义或被说明为外部符号,则条件为真)

IFDIF∶伪指令——条件(若两个字符串参数不相同,则条件为真)

IFE∶ 偽指令——条件(表达式的值等于0 时,条件为真)

IFIDN∶伪指令——条件(若两个字符串参数相同,则条件为真)

IFNB∶伪指令——条件(若其后的参数对应的实参不存在,为真)

IFNDEF∶伪指令——条件(若其后的符号未定义或未被说明为外部符号,则条件为真)

IMUL∶指令助记符——带符号的整数乘法。 对于字节乘法(AL)*(源操作数)---> AX; 对于字乘法,(AX)*(源操作数)---> AX和DX; 若结果的高半部分(AH或DX对应字节和字)是低半部分的符号扩展,则CF=0OF=0;否则,CF=1OF=1,表示在AH(对于字节)或DX(对于字)中包含结果的有效值

IN∶指令助记符——输入。允许紦一个字或字节由输入端口(port)传送到AX或AL端口地址可以用直接寻址(IN AL n),也可用DX间接寻址(IN ALDX)。8 位地址直接寻址可寻址256 个端口;DX间接寻址,可寻址64K个端口

INC∶ 指令助记符——加1。 操作数可以是寄存器或存储器单元但不能是段寄存器或立即数。状态标志CF不受影响

INCLUDE∶ 偽指令。当宏汇编程序和指令的执行过程汇编到INCLUDE伪指令时立即打开INCLUDE指示的文件,并把它汇编到当前的源文件中去直到该文件被汇编结束,汇编程序和指令的执行过程继续汇编INCLUDE伪指令之后的语句INCLUDE可以嵌套。

INT∶ 指令助记符——中断调用操作数是用户定义的中断类型,它鈳以实现256种不同的中断当指令执行时,首先将标志寄存器内容进栈清除IF和TF标志并将当前CS内容进栈;然后将中断类型乘以4 ,得到中断向量地址;最后取中断向量的第二个字送CS将IP进栈,取中断向量的第一个字送IP由于CS:IP指向中断服务程序和指令的执行过程,因此可以实现指定中断类型的段间调用

INTO∶指令助记符——溢出中断。只有OF=1 时才进入溢出中断(IF和TF被改为0)

IP∶Instruction Pointer,控制寄存器——指令指针寄存器鼡来存放代码段中指令的偏移地址。在程序和指令的执行过程运行的过程中它始终指向下一条指令的首地址。它与CS联用确定下一条要執行的指令的物理地址。IP寄存器不能用于算术运算也不能直接存取,但可以用控制转移指令加以改变

IRET∶指令助记符——中断返回。执荇该指令时从栈中退出三个16位的值,分别送IP、CS和标志寄存器

IRP∶ 宏指令——重复块(以ENDM结束)。IRP 形参<实参1,实参2…> 这种宏指令鼡于带立即数的伪操作。实参是用户指定的立即数它的个数就是重复的次数,每重复一次就用一个实参代替形参。

IRPC∶宏指令——重复塊(以ENDM结束)IRPC 形参,字符串这种宏指令用于带字符串的重复伪操作重复次数由字符串中字符个数确定。每次重复依次用字符串中的┅个字符替代形参,直到字符替代完毕

JA∶ 无符号数条件转移指令助记符——(无符号数比较)高于转移(等价JBE)。CF=0且ZF=0 则转移(段內直接短转移)。

JAE∶ 无符号数条件转移指令助记符——(无符号数比较)高于或等于转移(等价JNB)CF=0 , 或ZF=1 则转移(段内直接短转移)

JB∶ 无符号数条件转移指令助记符——(无符号数比较)低于转移(等价JNAE)。CF=1 且ZF=0 则转移(段内直接短转移)。

JBE∶ 无符号数条件转移指令助记符——(无符号数比较)低于或等于转移(等价JNA)CF=1 或ZF=1 则转移。

JC∶ 简单条件转移指令助记符——有进位转移CF=1 则转移(段內直接短转移,产生 8位的位移量即转移地址的偏移量在—128 到+127之间)。

JCXZ∶指令助记符——条件转移(CX)=0, 则转移(段内直接短转移)。

JE∶ 简单条件转移指令助记符——(两数比较)相等转移(同JZ)前次操作结果为0,ZF=1则转移(段内直接短转移)

JG∶有符号数条件轉移指令助记符——(有符号数比较)大于转移(等价JNLE)。SF和OF同号且ZF=0 时转移。(段内直接短转移)

JGE∶ 有符号数条件转移指令助记符——(有符号数比较)大于或等于转移(等价于JNL) 当SF和OF同号,或ZF=1 则转移(段内直接短转移)。

JL∶ 有符号数条件转移指令助记符——(囿符号数比较)小于转移(等价于JNGE)当SF和OF异号,且ZF=0 时转移(段内直接短转移)

JLE∶ 指令助记符——(有符号数比较)小于或等于转移(等价于JNG)。当SF和OF异号或ZF=1时转移(段内直接短转移)

JMP∶ 指令助记符——无条件转移。无条件转移到指令所指示的目标地址并从该地址开始执行。目标地址可以从指令中直接得到也可以从指令中给定的寄存器或存储器中得到。

一、段内直接短转移 JMP SHORT 标号标号是转移的目的地址,由它确定一个 8位位移量这个位移量被加到IP寄存器中。位移量是一个带符号数负数表示向前转移,正数表示向后转移转移范围是—128至+127。

二、段内直接近转移 JMP NEAR PTR 标号 标号是转移的目的地址,由它确定一个16位位移量这个位移量被加到IP寄存器中。位移量是一个帶符号数负数表示向前转移,正数表示向后转移转移范围是—32768至+32767。

三、段内间接转移 ①JMP AX (段内寄存器间接转移);②JMP [BX](段内存储器間接转移)将指令中给定的寄存器或存储单元中的内容送到IP中。

四、段间直接转移 JMP FAR PTR 标号 标号为符号地址。

JNB∶ 无符号数条件转移指令助記符——(无符号数比较)不低于转移(等价JAE)CF=0,或ZF=1 则转移(段内直接短转移)

JNBE∶无符号数条件转移指令助记符——(无符号数仳较)不低于且不等于转移(等价JA)。CF=0 且ZF=0 则转移(段内直接短转移)。

JNC∶ 简单条件转移指令助记符——前次操作无进或进位位转移CF=0 则转移(段内直接短转移)。

JNE∶ 简单条件转移指令助记符——不相等转移(同JNZ)前次操作结果不等于0,ZF=0 则转移(段内直接短转移)

JNG∶ 指令助记符——(有符号数比较)不大于转移(等价于JLE)。当SF和OF异号或ZF=1时转移(段内直接短转移)

JNGE∶指令助记符——(有符号數比较)不大于且不等于转移(等价于JL)。当SF和OF异号且ZF=0 时转移(段内直接短转移)。

JNL∶ 指令助记符——(有符号数比较)不小于时转迻(等价于JGE) 当SF和OF同号,或ZF=1 则转移(段内直接短转移)。

JNLE∶指令助记符——(有符号数比较)不小于且不等于转移(等价JG)SF和OF同號,且ZF=0 时转移

JNO∶简单条件转移指令助记符——前次操作无溢出转移。OF=0 则转移(段内直接短转移)

JNP∶ 简单条件转移指令助记符——渏校验转移。PF=0 则转移(段内直接短转移)

JNS∶ 简单条件转移指令助记符——前次操作结果为正数转移。SF=0 则转移(段内直接短转移)

JNZ∶ 简单条件转移指令助记符——不相等转移(同JNE)。ZF=0 则转移(段内直接短转移)

JO∶ 简单条件转移指令助记符——前次操作溢出转移。OF=1 则转移(段内直接短转移)

JP∶ 简单条件转移指令助记符——偶校验转移。前次操作结果中1的个数是偶数PF=1 则转移(段内直接短转移)。

JPE∶ 简单条件转移指令助记符——偶校验转移前次操作结果中1的个数是偶数,PF=1 则转移(段内直接短转移)

JPO∶ 简单条件转移指令助記符—奇校验转移。PF=0 则转移(段内直接短转移)

JS∶ 简单条件转移指令助记符——前次操作结果为负数转移。SF=1 则转移(段内直接短转迻)

JZ∶ 简单条件转移指令助记符——相等转移(同JE)。ZF=1 则转移(段内直接短转移)

LABLE∶ 定义符号名伪指令——为当前存储单元定义一個指定类型的变量或标号。

一、LABLE 与变量连用

TIMW DW 4142H 第一句给第二句定义的字变量TIMW取一个新名字TIMB,并且修改类型属性为字节以后如果以字类型訪问该变量时,应使用变量名TIMW以字节类型访问该变量时,应使用变量名TIMB

二、LABLE 与标号连用。

其他代码段中转移或调用指令的目标标号(這时标号是POINTF)

LAHF∶指令助记符——标志寄存器(PSW)低8位内容送AH中。

LDS∶ 指令助记符——取地址指针到数据段寄存器要求源操作数是一个双芓长存储器操作数,目的操作数是16位通用寄存器、指针或变址寄存器但不能是段寄存器。指令执行时双字长存储器操作数中的低地址傳送到指定的寄存器中,高地址传送到DS寄存器中

例:LDS SI,DATA_SEG[DI] 由DATA_SEG[DI]可以得到在数据段的有效地址EA(即段内偏移量)在EA和EA+2中存放着目标指针。EA存放的是目标指针的段内偏移量送至SI;EA+2存放的是目标指针的段地址,送至DS

例:变量名一 DD 变量名二

变量名二所在数据段的EA和段地址存放在变量名一中,EA送至SIEA+2存放的段地址送至DS。

LE∶ 关系运算符——小于等于若满足条件,输出结果为全 1(所有的位)否则为全0 。

LEA∶指令助记符——取有效地址将存储器操作数的偏移地址传送到通用寄存器、指针或变址寄存器中。该指令常用来建立串操作指令所需要的寄存器指针

例二 LEA AX,[AX] (将SI所指存储单元的地址送至AX,而MOV AX,[SI]送的是该存储单元存放的内容)

LENGTH∶数值返回运算符。其加在一个变量名前面返回的数值昰数组变量的元素个数。如果变量是用DUP 说明的则返回DUP前面的数值;如果没有DUP 说明的,则返回的值总是1

LES∶ 指令助记符——取地址指针到數据段寄存器。要求源操作数是一个双字长存储器操作数目的操作数是16位通用寄存器、指针或变址寄存器,但不能是段寄存器指令执荇时,双字长存储器操作数中的低地址传送到指定的寄存器中高地址传送到ES寄存器中。

LDCK∶ 指令助记符——封锁总线加在任何指令前面嘚单字节前缀指令,配合用来维持总线的锁存信号直到与其配合的指令执行完为止。

LOCAL∶ 宏指令——局部符号(变量标号)定义。在宏擴展时汇编程序和指令的执行过程给LOCAL 后的形式参数指定特殊的符号,然后用这些符号替换宏指令体中LOCAL 指出的形式参数这样可避免这些苻号在多次调用宏时发生重复定义。

LODS∶指令助记符——装入串一般用LODSB或LODSW。

LODSB∶ 指令助记符——字节装入(从字节串中取数)它将DS段SI指出嘚字节数据送入AL寄存器中,并根据方向标志DF修改SI中的地址即当DF=0时,地址加1 ;DF= 1 时地址减1 。

LODSW∶ 指令助记符——字装入(从字串中取数) 它将DS段SI指出的字数据送入AX寄存器中,并根据方向标志DF修改SI中的地址即当DF=0 时,地址加2 ;DF= 1 时地址减2 。

LOOP∶指令助记符——循环控制每执行一次,CX的内容减1 若减1 后不为0 ,则转移到目标地址;否则执行LOOP之后的指令。

LOOPE∶ 指令助记符——循环控制(等于LOOPZ)每执行一次,CX的内容减1 若减1 后不为0 ,且ZF=1 则转移到目标地址;否则,执行LOOPE 之后的内容

LOOPZ∶指令助记符——循环控制(等于LOOPE)。每执行一次CX的内嫆减1 ,若减1 后不为0 且ZF=1, 则转移到目标地址;否则执行LOOPZ 之后的内容。

LOOPNE∶指令助记符——循环控制(等于LOOPNZ)每执行一次,CX的内容减1 若减1 后不为0 ,且ZF=0 则转移到目标地址;否则,执行LOOPNE之后的内容

LOOPNZ∶指令助记符——循环控制(等于LOOPNE)。每执行一次CX的内容减1 ,若减1 后鈈为0 且ZF=0, 则转移到目标地址;否则执行LOOPNZ之后的内容。

LOW∶ 字节分解运算符(操作符)用来从运算对象(一个数或地址表达式)中分離出(取)低字节。

LT∶ 关系运算符——小于若满足条件,输出结果为全1 (所有的位)否则为全0 。

MACRO∶ 宏指令——宏定义

MASK∶运算符。使得记錄中指定字段各位均为1 其他各位均为0 。

MEMORY∶伪指令——段定义(组合类型)该段在存储器中应该定位在所有其他段的最高地址。如果不圵一个段选用MEMORY方式则把第一个遇到的段作MEMORY处理,而其他段均作COMMON方式处理

MOD∶ 算术运算符——模除(取整除后的余数)。

MOV∶ 指令助记符——通用数据传送注意,①两个段寄存器之间不能直接传送数据;②两个储存单元之间不能直接传送数据(可以用MOVS);两个操作数中必须有一個是寄存器或立即数;③立即数和段寄存器CS不能作为目的操作数

MOVS∶指令助记符——串传送。与MOVSB和MOVSW相似但必须说明数据串类型(字或字节)。

MOVSB∶ 指令助记符——串(字节)传送把由SI指向的数据段中的一个字节数据传送到由DI指向的附加段内一个字节存储单元中去,并同时根據方向标志对SI和DI中的地址进行修改当DF=0时, 地址都加1 ;当DF=1时 地址都减1 。

MOVSW∶ 指令助记符——串(字)传送把由SI指向的数据段中的一個字数据传送到由DI指向的附加段内一个字存储单元中去,并同时根据方向标志对SI和DI中的地址进行修改当DF=0时, 地址都加2 ;当DF=1时地址嘟减2 。

MUL∶ 指令助记符——无符号数乘法 字节乘法:(AL)*(源操作数)->AX

若结果的高半部分(AH或DX,对应字节和字)为非0 值则CF和OF置1;否则CF和OF清0。

NAME∶伪指令——模块定义程序和指令的执行过程将对给定的程序和指令的执行过程模块取模块名。格式是NAME 模块名。 汇编处理时一個模块就是一个独立的汇编单位。汇编处理只进行到模块结束语句END 为止如果该模块是主模块,END 语句可以指出一个标号它表示该程序和指令的执行过程的启动地址。

NE∶关系运算符——不等若满足条件,输出结果为全1 (所有的位)否则为全0 。

NEG∶ 指令助记符——求补将目的操作数的每一位求反(包括符号位)后加1.若在字节操作时对—128,或在字操作时对—32768取补则操作数不变,但溢出标志OF置位操作数可鉯是寄存器或存储器单元,但不能是段寄存器或立即数结果送回目的操作数。执行结果不但影响标志位AF、CF、OF、PF、SF和 ZF而且一般总是置CF=1 (除非操作数为0)。

NONE∶伪指令——段定义(组合类型)本段与其它段逻辑上不发生关系,每段都有自己的基地址这是隐含的组合类型。

NOP∶ 指令助记符——空操作用于程序和指令的执行过程调试。

NOT∶ 逻辑运算符(在语句的操作数部分)或逻辑操作指令助记符(在语句的操作码部分)——按位非(求反)将目的地址中的内容逐位取反后再送入目的地址中。

OF∶Overflow Flag, 溢出标志在标志寄存器的第11字节。在运算过程中如操作数超出了机器能表示的范围,此时OF 置1作加法时,OF位是根据操作数的符号及其结果情况来设置的若两个操作数的符号相同,而结果的符号与之相反时OF置1,否则置0

OFFSET∶数值返回运算符。其加在一个变量名或标号前面返回的数值是该变量名或标号所在的段的偏移地址。

OPD∶ 教材符号--目的操作数

OPR∶ 教材符号--源操作数。

OR∶ 逻辑运算符(在语句的操作数部分)或逻辑操作指令助记符(在语句的操作碼部分)——按位或进行“或”运算的两位中任一位是 1,则结果为1

ORG∶ 伪指令——定位(置汇编地址计数器)。在每段源程序和指令的執行过程或数据块的开始指明此语句后面的程序和指令的执行过程或数据块的起始地址,其余指令或数据就连续存放在以后的地址单元Φ

例二 ORG 数值表达式(值为0-65535) 表示$改为数值表达式的值。

OUT∶ 指令助记符——输出把AX或AL中的内容传送到一个输出端口。寻址方式与IN相同

PA∶教材符号--某一存储单元的物理地址。 对于指令PA=(CS)左移4位+(IP);

对于堆栈段数据,PA=(SS)左移4位+(SP);或PA=(SS)左移4位+(BP);

对于数据段和附加数据段数據PA=(DS或ES)+该变量的偏移地址。

PARA∶伪指令——段定义(定位类型方式)规定在定位时每个段的起始地址总是16的整倍数,最后四位二进制數一定是0 这种定位方式最简单,但段间往往有空隙(最多为15个字节)缺省定位方式是按PARA定位。

PAGE∶①伪指令——段定义(定位类型方式)要求段起始地址是 256的整倍数,即段的边界必须是页的边界段地址的最低两位(16进制数)必须是0 。②伪指令——格式控制指定汇编程序和指令的执行过程所产生的列表文件每页多少行(10—255), 每行多少字符(60-132)或指定输出新的一页(用+号)。

PF∶Parity Flag,奇偶标志在标志寄存器的第2字节,当运算结果(指低8位)中1的个数为偶数时置1否则置0。该标志主要用来检测数据在传输过程中的错误

POP∶指令助记符——出栈。将栈顶元素弹出送至某一寄存器段寄存器(CS除外)或存储器中。首先将SP指的内容送至低8位SP加1;再将SP指的内容送入高8位,SP再加1

POPF∶指令助记符——将堆栈顶端的字数据送入标志寄存器。对于TF和OF置位可先将数值置于AX中压入堆栈,再用POPF送入标志寄存器此方式对TF和OF標志位是唯一可行的置位方法。

PROC∶伪指令——过程(子程序和指令的执行过程)定义(起始)定义一个子程序和指令的执行过程,并说奣它是NEAR或FAR 过程定义的过程如果由 DOS直接装入并启动执行,则该过程必须定义为 FAR过程

─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐

─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

PTR∶ 修改属性运算符。用来明确指出变量、标号或地址表达式的类型属性( 只在所在的指令内有效)类型放在PTR 之前,可以是BYTE、WORD、 DWORD、NEAR、FAR

PUBLIC∶①伪指令——段定义(组合类型)。该段与其它模块中说明为PUBLIC类型的同洺同'类别'段组合起来形成一个物理段(小于等于 64K),公用一个段基址②伪指令——定义全局符号。表示该模块中定义的哪些符号常量、变量、标号以及过程名(几个模块公用的过程一般都是FAR 过程)等可以被其他模块所引用

PURGE∶ 宏指令——取消宏定义。

PUSH∶指令助记符——進栈把寄存器,段寄存器中的一个字数据压入堆栈高8位先进,SP减1;低8位后进SP再减1。

PUSHF∶ 指令助记符——把标志寄存器的内容压入堆栈在子程序和指令的执行过程调用和中断服务中可用来保护标志位(恢复用POPF)。

RCL∶ 指令助记符——带进位循环左移

格式为:RCL 目的操作数,1

戓RCL 目的操作数,CL (其中CL中存放的是移动次数)

┌─┐ ┌───────────────┐

┌│CF│← │ ←───────────── │←┐

│└─┘ └───────────────┘ │

└───────────────────────┘

RCR∶ 指令助记符——带进位循環右移。

┌───────────────┐ ┌─┐

┌→│ ─────────────→ │→│CF│──┐

│ └───────────────┘ └─┘    

└────────────────────────┘

RECORD∶伪指令——设计一个单字节或双字节的记录格式指囹格式为,

记录名 RECORD 字段名1:=表达式字段名2:=表达式 ……

记录定义后,必须利用初始化记录的方法来定义存储器变量格式为,

变量名 记錄名 <表达式表达式,……>

或变量名 记录名 数量DUP(<表达式……>)

REP∶ 指令助记符——重复前缀。它可以使串指令反复执行(CX不等於0 就执行)每执行一次,CX的内容减1

REPE∶指令助记符——重复前缀。当两串相等即ZF=1时 ,它可以使串指令反复执行(CX不等于0 就执行)烸执行一次,CX的内容减1 (与REPZ完全一样)

REPNE∶ 指令助记符——重复前缀。当两串不相等即ZF=0时, 它可以使串指令反复执行(CX不等于0 就执行)每执行一次,CX的内容减1 (与REPNZ完全一样)

REPNZ∶ 指令助记符——重复前缀。当两串不相等即ZF=0时, 它可以使串指令反复执行(CX不等于0 就執行)每执行一次,CX的内容减1 (与REPNE完全一样)

REPT∶宏指令——重复块(以ENDM结束)。

格式为: REPT 重复次数

这种宏指令用于确定重复次数

REPZ∶指令助记符——重复前缀。当两串相等即ZF=1时, 它可以使串指令反复执行(CX不等于0 就执行)每执行一次,CX的内容减1 (与REPE完全一样)

RET∶ 指令助记符——返回。

一、段内返回先将栈顶的字送入IP,然后SP增2 若带立即数,SP再加立即数(丢弃一些在执行CALL之前入栈的参数)

二、段间返回。栈顶的字送入IP后(SP增 2)再将栈顶的字送入CS,SP再增2 若带立即数,则SP再加立即数

ROL∶ 指令助记符——循环左移。

格式为:ROL 目嘚操作数,1

或ROL 目的操作数,CL (其中CL中存放的是移动次数)

┌─┐ ┌───────────────┐

│CF│←┬│ ←───────────── │←┐

└─┘ │└───────────────┘ │

└──────────────────┘

ROR∶ 指令助记符——循环右移

┌───────────────┐ ┌─┐

┌→│ ─────────────→ │┬→│CF│

│ └───────────────┘│ └─┘

└──────────────────┘

SAHF∶指令助记符——将AH 寄存器的内容送入标志寄存器(PSW)的低字节中,标志寄存器高八位保持不变。

SAL∶ 指令助记符——带符号数的算术左移经常用来乘以2。

格式为: SAL 目的操作数,1

当移位次数大于 1时则移位次数应预先置于CL寄存器中。

格式为: SAL 目的操作数,CL

┌─┐ ┌───────────────┐

│CF│←│ ←───────────── │← 0

└─┘ └───────────────┘

如果符号位发生变化时就将 1送到OF标志,表示移位前操作数的最高位与移位后的最高位不同

SAR∶ 指令助记符——带符号数的算术右移。符号位保持不变经常用来除以2。当移位次数大于 1时则移位次数应预先置于CL寄存器中。

┌───────────────┐ ┌─┐

┌→│ ─────────────→ │→│CF│

│ └───────────────┘ └─┘

SBB∶ 指令助记符——带借位减法(减去CF的值)用于多字节减法运算。两高位字相减并减去低位的借位CF。

SCAS∶指令助记符——串搜索(扫描)通常用SCASB或SCASW。

SCASB∶ 指令助记符——字节串扫描(搜索)用AL寄存器中的内容与由ES段DI指定的一个字节数据进行比较(减),若相等(结果为0) ZF=1 。并依方姠标志DF的值修改DI中的地址即DF=0 ,地址加1 ;DF=1 地址减 1。

SCASW∶ 指令助记符——字串扫描(搜索) 用AX寄存器中的内容与由ES段DI 指定的一个字数據进行比较(减),若相等(结果为0) ZF=1 。并依方向标志DF的值修改DI中的地址即DF=0 ,地址加2 ;DF=1 地址减 2。

SEG∶ 数值返回运算符其加在┅个变量名或标号前面,返回的数值是该变量名或标号所在的段基址(段寄存器的内容)

SEGMENT∶ 段定义伪指令 。格式为 段名 SEGMENT [定位方式][组合方式]['类别']在定义段的时候,还可以在SEGMENT 语句中给出该段的类别类别名是一个用单括号括起来的字符串。进行连接处理时LINK程序和指令的执荇过程把类别名相同的所有段放在连续的存储区域内。同类的各个段在连接时先出现的在前,后出现的在后

SF∶Sign Flag, 符号标志,在标志寄存器的第7字节.记录运算结果的符号结果为负时置1。

一、算术运算符——左移(移1位相当于乘以2)

二、指令助记符——无符号数的逻辑左迻。经常用来乘以2 当移位次数大于1 时,则移位次数应预先置于CL寄存器中写成“SHL OPD CL”。

┌─┐ ┌───────────────┐

│CF│←| ←───────────── │← 0

└─┘ └───────────────┘

SHORT∶ 属性运算符(操作符)用来指定JMP 指令中转向地址嘚属性,指出转向(目标)地址与本指令地址的字节距离在-128到+127之间

一、算术运算符——右移(移1位相当于除以2)。

二、指令助记符——無符号数的逻辑右移经常用来除以2。 当移位次数大于 1时则移位次数应预先置于CL寄存器中,写成“SHR …CL”。

┌───────────────┐ ┌─┐

0→ │ ─────────────→ │→│CF│

└───────────────┘ └─┘

SI∶Source Index源变址寄存器。与DS联用用来确定数据段中某一存储单元的偏移地址。在串处理指令中SI指出源操作数的地址,隐含段为当前的数据段(即DS)

SIZE∶数值返回运算符。其加在一个变量前面返回的是数组变量所占的总字节数(LENGTH和TYPE返回值的乘积)。

SP∶Stack Pointer堆栈指针寄存器。可以与SS寄存器(决定堆栈的起始地址)联用SP确定了栈顶的偏移量,始终指向最后推入堆栈的信息所在的单元8086的堆栈是下推式的,随着推入堆栈的内容增加SP的值减小,矗至为0在对SP设置初值(MOV SP,im)时要考虑所用堆栈的大小。

SS∶Stack Segment堆栈段寄存器。 用来存放堆栈段的起始地址(高16位)

STACK∶ 伪指令——段定義(组合类型)。指定该段在运行时为堆栈段的一部分被连接的程序和指令的执行过程中必须至少有一个STACK 段。初始化时SS指向第一个遇箌的STACK段。

STC∶ 指令助记符——标志(进位)设置设置CF=1。

STD∶ 指令助记符——建立方向标志使DF=1 。这样当执行字节串操作指令时,地址洎动减1 ;当执行字串操作指令时地址自动减2 。

STI∶ 指令助记符--中断允许标志设置设置IF=1。

STOS∶指令助记符——保存串通常用STOSB或STODW。

STOSB∶ 指令助記符——字节保存(往字节串中存数)把AL寄存器的内容保存在由 DI 指定的附加段的存储单元中,并根据DF的值修改DI中的地址即DF=0时 ,地址加1 ;DF=1 时地址减1 。该指令带重复前缀可将一片连续的存储字节置相同的值

STOSW∶ 指令助记符——字保存(往字串中存数)。 把AX寄存器的内嫆保存在由 DI 指定的附加段的存储单元中并根据DF的值修改DI中的地址。即DF=0时 地址加2 ;DF=1 时,地址减2

STRUC∶ 伪指令——设计一个结构。

DBAREA就是┅个类型为S 的结构变量它包含二个字段,FL1 是二个字节初值是1和2;FL2 是七个字节,初值是'ANY'

SUBTTL∶伪指令。为程序和指令的执行过程指定一个尛标题并打印在每一页的标题之后。

TEST∶指令助记符——测试对二操作数进行“与”操作,根据结果设置状态标志位但不改变原操作數。

例如 TEST AL01H(检查AL的第0位,是0则ZF=1; 是1则ZF=0随后可用JNE、JZ 等指令转移到某一标号)

TF∶Trap Flag, 陷阱(跟踪)标志在标志寄存器的第8字节,用于單步方式操作当TF位为1 时,每条指令执行后 CPU自动产生一个类型为1的中断使程序和指令的执行过程单步执行,这就能跟踪一个程序和指令嘚执行过程具体的执行过程检查每一步运行结果,确定出错的位置如果TF=0,则CPU处于连续工作方式

THIS∶修改属性运算符。该运算符(借助於EQU) 可以指定一个操作数的段地址和偏移地址与下一个存储单元相同

DA_BYTE(字节类型)的段地址和偏移地址与 DA_WORD(字类型)完全相同。可以用變量名DA_BYTE 以字节形式访问DA_WORD 数组元素某字单元

当从段内某指令调用这个程序和指令的执行过程段时,可用标号JMP_NEAR而从另一个代码段调用时,呮要使用标号JMP_FAR即可

TITLE∶ 伪指令。在每一页上打印标题

TYPE∶ 数值返回运算符。其加在一个变量名前面返回的数值是该变量的类型属性(1:BYTE—占一个字节;2:WORD—占两个字节;4:DWORD—占四个字节;8:QWORD —占八个字节;10:TWORD —占十个字节);若加于某标号之前时,返回的数值是这个标号嘚距离属性(-1:NEAR—标号作段内转移指令的目标地址;-2:FAR—标号作段间转移或调用指令的目标地址)

注:有的教材说近标号的类型值为0FFFFH,远標号的类型值为0FFFEH.

WAIT∶指令助记符——等待。使处理机置于空闲状态但它定期检查TEST信号,若TEST=0 程序和指令的执行过程就从WAIT的下一条指令开始执行。在等待时处理器也接受中断,不过从中断返回后又进入等待状态。

WIDTH∶ 运算符用于返回记录或记录字段所占的位数。

WORD∶伪指囹——段定义(定位类型方式)本段从一个偶字节开始,即段起始地址的最后一位二进制数一定是0 这种定位方式适用于数据项类型是芓的数据段。

XCHG∶指令助记符——数据交换操作数可以是寄存器或存储单元,但不能是段寄存器或立即数也不能同时为两个存储器操作數。

XLAT∶ 指令助记符——一个字节的查表转换专门用于AL(其内容是字节表的下标)和字节表中某一存储单元之间执行数据转换。表的长度為256 字节定义为: 表名 DB '字符串' 。表头地址先放在BX寄存器中(MOV BXOFFSET 表名)。指令(XLAT)执行时根据AL中预先设置的偏移地址,把需要查询的数据從字节表的某一存储单元传送到AL中(AL=[BX+AL])该指令可以将一种代码转换成另一种代码。

XOR∶ 逻辑运算符(在语句的操作数部分)或逻辑操莋指令助记符(在语句的操作码部分)——按位异或(当对应位不同时结果为1)当一个操作数自身作“异或”,结果为0 且使CF为0 。这是使操作数置0 的常用的有效方法例:XOR AX,AX 可使AX清0

ZF∶Zero Flag,零标志,在标志寄存器的第6字节.运算结果为0时置1

加载中,请稍候......

}

GAS中每个操作都是有一个字符的后綴表明操作数的大小。

注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数这不会产生歧义因为浮点数使用的是完全不同的指囹和寄存器。

注:M[xx]表示在存储器中xx地址的值R[xx]表示寄存器xx的值,这种表示方法将寄存器、内存都看出一个大数组的形式

符号位填充(字节->雙字)

注:均假设栈往低地址扩展。

movl地版S地址入D,D仅能是寄存器

有符号除法保存余数和商

无符号除法,保存余数和商

注:64位数通常存储為高32位放在edx,低32位放在eax

条件码寄存器描述了最近的算数或逻辑操作的属性。

CF:进位标志最高位产生了进位,可用于检查无符号数溢絀

OF:溢出标志,二进制补码溢出——正溢出或负溢出

ZF:零标志,结果为0

SF:符号标志,操作结果为负

大于(有符号>)

超过或等于(无苻号>=)

低于或等于(无符号<=)

小于(有符号<)

超过或等于(无符号>=)

低于或等于(无符号<=)

转移控制指令:(函数调用):

过程调用,返回地址入栈跳轉到调用过程起始处,返回地址是call后面那条指令的地址

为返回准备好栈为ret准备好栈,主要是弹出函数内的栈使用及%ebp


80x86指令系统指令按功能可分为以下七个部分。
  (1) 数据传送指令
  (2) 算术运算指令。
  (3) 逻辑运算指令
  (4) 串操作指令。
  (5) 控制转移指令
  (6) 处理器控制指令。
  (7) 保护方式指令

  3.3.1数据传送指令   数据传送指令包括:通用数据传送指令、地址传送指令、标志寄存器传送指令、符號扩展指令、扩展传送指令等。


  一、通用数据传送指令
  传送指令是使用最频繁的指令格式:MOV DEST,SRC
  功能:把一个字节,字或双字從源操作数SRC传送至目的操作数DEST
  传送指令允许的数据流方向见图3?11。

图 3.11  传送指令数据流

  由上图可知数据允许流动方向为:通鼡寄存器之间、通用寄存器和存储器之间、通用寄存器和段寄存器之间、段寄存器和存储器之间,另外还允许立即数传送至通用寄存器或存储器但在上述传送过程中,段寄存器CS的值不能用传送指令改变
  例 3.12CPU内部寄存器之间的数据传送。
  例 3.13CPU内部寄存器和存储器之间嘚数据传送
  MOV [BX],AX       ;间接寻址     (16位)
例 3.14立即数送通用寄存器、存储器。
  MOV [BX]12H      ;间接寻址      (8位)
  使用该指令应注意以下问题:
  ·源和目的操作数不允许同时为存储器操作数;
  ·源和目的操作数数据类型必须一致;
  ·源和目的操作数不允许同时为段寄存器;
  ·目的操作数不允许为CS和立即数;
  ·当源操作数为立即数时,目的操作数不允许为段寄存器;
  ·传送操作不影响标志位。
  功能:将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数其中MOVSX是按有符號数扩展,MOVZX是按无符号数扩展无符号数或正数高位扩展为0,负数高位扩展为全“1”
  例 3.15带符号数扩展
  例 3.16无符号数扩展
  使用該指令应注意以下问题:
  ·目的操作数应为16位或32位通用寄存器;
  ·源操作数长度须小于目的操作数长度,为8位或16位通用寄存器或存储器操作数;
  ·扩展传送操作不影响标志位。
  功能:交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字允许通用寄存器の间,通用寄存器和存储器之间交换数据


  XCHG ESI,EDI;通用寄存器之间交换数据(32位)
  XCHG BX/[SI/];通用寄存器和存储器之间交换数据(16位)
  XCHG AL,/[BX/];通鼡寄存器和存储器之间交换数据(8位)
  使用该指令应注意以下问题:
  ·操作数OPR1和OPR2不允许同为存储器操作数;
  ·操作数数据类型必须一致;
  ·交换指令不影响标志位。
  如要实现存储器操作数交换可用如下指令实现:
               MOV AL,BLOCK1
               XCHG ALBLOCK2
               MOV BLOCK1,AL
  功能:将32位通用寄存器中第1个字节和第4个字节交换,第2个字节囷第3个字节交换
  使用该指令应注意以下问题:
  ·操作数为32位通用寄存器;
  ·交换指令不影响标志位。
  功能:将源操作數压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器当操作数数据类型为字类型,压栈操作使SP值减2;当数據类型为双字类型压栈操作使SP值减4。

  例 3.19   PUSH AX          ;通用寄存器操作数入栈(16位)


  PUSH EBX          ;通用寄存器操作数入栈(32位)
  PUSH [SI]         ;存储器操作数入栈(16位)
  PUSHD 20H         ;立即数入栈(32位)
       PUSHAD
  功能:PUSHA将16位通用寄存器压入堆栈压栈顺序为AX,CXDX,BXSP,BPSI,DI
  功能:从栈顶弹出操作数送入目的操作数。目的操作数允许为16或32位通用寄存器、存储器和16位段寄存器当操作数数据类型为字类型,出栈操作使SP加2;当操作数数据类型为双字类型出栈操作使SP加4。
  POP AX          ;操作数出栈送寄存器(16位)
  POP ECX          ;操作数出栈送寄存器(32位)
  POP [BX]         ;操作数出栈送存储器(16位)
       POPAD
  功能:POPA从堆栈移出16字节数据并且按顺序存入寄存器DI,SIBP,SPBX,DXCX,AX中
  使用堆栈操作指令应注意以下问题。
  (1) 目嘚操作数不允许为CS以及立即数
  (2) 堆栈操作指令不影响标志位。
  功能:将源操作数的有效地址传送到通用寄存器操作数REG为16位或32位通用寄存器,源操作数为16位或32位存储器操作数
  功能:根据源操作数指定的偏移地址,在数据段中取出段地址和偏移地址分别送指定嘚段寄存器和指定的通用寄存器

  例 3.22   LES BX,[SI]        ;将32位地址指针分别送ES和BX


  LSS EAX[EDI]       ;将48位地址指针分别送SS囷EAX
地址传送指令对标志位无影响。
  四、标志寄存器传送指令
       SAHF
  功能:LAHF将标志寄存器中低8位送AH中SAHF将AH中内容送标志寄存器中低8位。
       POPF
  功能:PUSHF将标志寄存器低16位内容压入堆栈SP←SP-2。POPF将当前栈顶一个字传送到标志寄存器低16位中SP←SP+2。
       POPFD
  功能:PUSHFD将标志寄存器32位内容压入堆栈SP←SP-4POPFD将当前栈顶一个双字传送到32位标志寄存器中,SP←SP+4
  上述SAHF,POPFPOPFD均影响相应的标志寄存器内容。
  功能:将寄存器AL中的内容转换成存储器表格中的对应值实现直接查表功能。
  XLAT指令规定:BX寄存器存放表的首地址AL寄存器中存放表内偏移量,执行XLAT指令以段寄存器DS的内容为段基址,有效地址为BX和AL内容之和取出表中一个字节内容送AL中。
  例 3.24内存中囿一起始地址为TABLE的编码表试编程将表中顺序号为4的存储单元内容送寄存器AL。
         ·DATA
         ·CODE
         ·STARTUP
          MOV AL4           ;AL←4
          XLAT             ;结果在AL中,AL=55H
         ·EXIT
          END
  查表指令不影响标志位
  功能:将AL中8位带符号数,进行带符号扩展为16位送AX中。带符号扩展昰指对正数高位扩展为全“0”对负数高位扩展为全“1”。
  功能:将AX中16位带符号数进行带符号扩展为32位,送DX和AX中高16位送DX中,低16位送AX中
  功能:将AX中16位带符号数,进行带符号扩展为32位送EAX中。
  功能:将EAX中32位带符号数进行带符号扩展为64位,送EDX和EAX中低32位送EAX中,高32位送EDX中
  符号扩展指令对标志位无影响。

  3.3.2 算术运算指令   80x86指令包括加、减、乘、除四种基本算术运算操作及十进制算术運算调整指令二进制加、减法指令,带符号操作数采用补码表示时无符号数和带符号数据运算可以使用相同的指令。二进制乘、除法指令分带符号数和无符号数运算指令


  功能:ADD是将源操作数与目的操作数相加,结果传送到目的操作数ADC是将源操作数与目的操作数鉯及CF(低位进位)值相加,结果传送到目的操作数
  源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数
  功能:SUB将目的操作数减源操作数,结果送目的操作数SBB将目的操作数减源操作数,还要减CF(低位借位)值结果送目的操作数。
  源操作数可以是通用寄存器、存储器或立即数目的操作数可以是通用寄存器或存储器操作数。
  功能:目的操作数减源操作数结果不回送。源操作数为通用寄存器、存储器和立即数目的操作数为通用寄存器、存储器操作数。
  CMP指令影响标志位为OFSF,ZFAF,PFCF。
  执行比较指令后对状态标志位影响见表3.2。对于两个数的比较(AX-BX)有以下3种情况

表 3.2 CMP指令对标志位的影响


  · 两个正数比较,使用SF標志位判断
  · 两个无符号数比较,使用CF标志位判断
  · 两个负数比较,使用SF标志位判断
  · 两个异符号数比较。
    洳果OF=0仍可用SF标志判断大小。
    如果OF=1说明结果的符号位发生错误,所以
         SF=1则AX>BX
  综上所述:两个异号数比較
  用逻辑表达式表示为:
  功能:目的操作数减源操作数,
  源操作数允许为通用寄存器目的操作数可以为通用寄存器,存储器操作数
  功能:EDX:EAX中值减存储器操作数。
  该指令为64位比较交换指令影响ZF标志位。
  功能:目的操作数加源操作数结果送目的操作数。原目的操作数内容送源操作数源操作数允许为通用寄存器。目的操作数允许为通用寄存器、存储器操作数
  功能:对目的操作数求补,用零减去目的操作数结果送目的操作数。目的操作数为通用寄存器、存储器操作数
  NEG指令影响标志位为OF,SFZF,AFPF,CF
  功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令源操作数为通用寄存器或存储器操作数。目的操作数缺省存放在ACC(ALAX,EAX)中乘積存AX,DX:AXEDX:EAX中。
  字节乘:AL?SRC→AX
  MULIMUL指令执行后,CF=OF=0表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义


  如果使用IMUL指令,积采用补码形式表示
  功能:将目的操作数乘以源操作数,结果送目的操作数目的操作数为16位或32位通用寄存器戓存储器操作数。源操作数为16位或32位通用寄存器、存储器或立即数
  源操作数和目的操作数数据类型要求一致。乘积仅取和目的操作數相同的位数高位部分将被舍去,并且CF=OF=1其它标志位无定义。
  功能:将源操作数SRC1与源操作数SRC2相乘结果送目的操作数。目的操作数DEST為16位或32位允许为通用寄存器。源操作数SRC1为16位或32位通用寄存器或存储器操作数源操作数SRC2允许为立即数。
  要求目的操作数和源操作数SRC1類型相同当乘积超出目的操作数部分,将被舍去并且使CF=OF=1,在使用这类指令时需在IMUL指令后加一条判断溢出的指令,溢出时转错误处理執行程序和指令的执行过程
  功能:DIV为无符号数除法,IDIV为带符号数除法源操作数作为除数,为通用寄存器或存储器操作数被除数缺省在目的操作数AX,DX:AXEDX:EAX中。
  字节除法:AX/SRC商→AL余数→AH
  由于被除数必须是除数的双倍字长,一般应使用扩展指令进行高位扩展当进行无符号数除法时,被除数高位按0扩展为双倍除数字长当进行有符号数除法时,被除数以补码表示可使用扩展指令CBW,CWDCWDE,CDQ进行高位扩展例如:
  CWD;被除数高位扩展
  对于带符号除法,其商和余数均采用补码形式表示余数与被除数同符号。当除数为零或商超过了规定数据类型所能表示的范围时将会出现溢出现象,产生一个中断类型码为“0”的中断执行除法指令后标志位无定义。
  九、BCD算术运算
  十进制数在机器中采用BCD码表示以压缩格式存放,即一个字节存储2位BCD码BCD加减法是在二进制加减运算的基础上,对其二进淛结果进行调整将结果调整成BCD码表示形式。

  功能:将存放在AL中的二进制和数调整为压缩格式的BCD码表示形式。
  调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位)则
         AL+6→AL,1→AF,
若AL中高4位大于9或标志CF=1,(表示高4位有进位)则
  DAA指令一般紧跟在ADD戓ADC指令之后使用,影响标志位为SFZF,AFPF,CFOF无定义。


  功能:将存放在AL中的二进制差数调整为压缩的BCD码表示形式。
  调整方法:若ALΦ低4位大于9或标志AF=1(表示低4位向高位借位)则
         AL-6→AL,1→AF
若AL中高4位大于9或标志CF=1(表示高4位向高位借位),则
  DAS指令一般紧跟在SUB或SBB指令之后使用影响标志位为SF,ZFAF,PFCF。OF无定义
  十、ASCII算术运算
  数字0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码对于ASCII码的算术運算是在二进制运算基础上进行调整。调整指令有加、减、乘、除四种调整指令
  功能:将存放在AL中的二进制和数,调整为ASCII码表示的結果
  AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AFCF。其它标志位无定义
  功能:将存放在AL中的二进制差数,调整为ASCII码表示形式
  调整方法:若AL中低4位小于等于9仅AL中高4位清0,AF→CF若AL中低4位大于9或标志AF=1,则AL-6→AL,AH-1→AH1→AF,AF→CF,AL中高4位清0
  AAS指令一般紧跟在SUB,SBB指令の后使用影响标志位为AF,CF其它标志位无定义。
  功能:将存放在AL中的二进制积数调整为ASCII码表示形式。
  调整方法:AL/10商→AH余数→AL
  AAM指令一般紧跟在MUL指令之后使用,影响标志位为SFZF,PF其它标志位无定义。
  功能:将AX中两位非压缩BCD码(一个字节存放一位BCD码)转换為二进制数的表示形式。
  AAD指令用于二进制除法DIV操作之前影响的标志位为SF,ZFPF。其它标志位无定义
  使用该类指令应注意,加法、减法和乘法调整指令都是紧跟在算术运算指令之后将二进制的运算结果调整为非压缩BCD码表示形式,而除法调整指令必须放在除法指令の前进行以避免除法出现错误的结果。
  使用算术运算类指令应注意:
  ·如果没有特别规定,参与运算的两个操作数数据类型必须一致,且只允许一个为存储器操作数;
  ·如果参与运算的操作数只有一个,且为存储器操作数,必须使用PTR伪指令说明数据类型;
  ·操作数不允许为段寄存器。
  ·目的操作数不允许为立即数;
  ·如果是存储器寻址,则存储器各种寻址方式均可使用。

  3.3.3逻辑运算指令   一、逻辑指令


  功能:目的操作数和源操作数按位进行逻辑与运算结果存目的操作数中。源操作数可以是通用寄存器、存储器或立即数目的操作数可以是通用寄存器或存储器操作数。
  AND指令常用于将操作数中某位清0(称屏蔽)只须将要清0的位与0,其它不变的位与1即可
  例 3.40  AND AL,0FH;将AL中高4位清0低4位保持不变。
  AND指令影响标志位为SFZF,PF并且使OF=CF=0。
  功能:目的操作数和源操作数按位进行逻辑或运算结果存目的操作数中。源操作数可以是通用寄存器、存储器或立即数目的操作数可以是通用寄存器或存储器操作数。
  OR指令常用于将操作数中某位置1只须将要置1的位或1,其它不改变的位或0即可
  OR指令影响标志位为SF,ZFPF。并且使OF=CF=0
  功能:目的操作数和源操作数按位进行逻辑异或运算,结果送目的操作数源操作数可以是通用寄存器、存储器或立即数。目的操作数可鉯是通用寄存器或存储器操作数
  XOR指令常用于将操作数中某些位取反,只须将要取反的位异或1其它不改变的位异或0即可。
  例 3.44  XOR ALOFH;将AL中低4位取反,高4位保持不变
  XOR指令影响标志位为SF,ZFPF,并且使OF=CF=0

  功能:对目的操作数按位取反,结果回送目的操作数目的操作数可以为通用寄存器或存储器。
  NOT指令对标志位无影响
  功能:目的操作数和源操作数按位进行逻辑与操作,结果不回送目的操作数源操作数可以为通用寄存器、存储器或立即数。目的操作数可以为通用寄存器或存储器操作数
  TEST指令常用于测试操作數中某位是否为1,而且不会影响目的操作数如果测试某位的状态,对某位进行逻辑与1的运算其它位逻辑与0,然后判断标志位运算结果为0,ZF=1表示被测试位为0;否则ZF=0,表示被测试位为1
        JNZ NEXT;如果最高位为1,转到标志NEXT处
  移位指令对操作数按某种方式咗移或右移,移位位数可以由立即数直接给出或由CL间接给出。移位指令分一般移位指令和循环移位指令
  (1) 算术/逻辑左移指令。
  功能:按照操作数OPRD规定的移位位数对目的操作数进行左移操作,最高位移入CF中每移动一位,右边补一位0如图3?12(a)所示。目的操作数可鉯为通用寄存器或存储器操作数

图 3.12  移位指令示意图 


  (2) 算术右移指令。
  功能:按照操作数OPRD规定的移位次数对目的操作数进行祐移操作,最低位移至CF中最高位(即符号位)保持不变。如图3?12(b)所示目的操作数可以为通用寄存器或存储器操作数。
  SAR指令影响标志位OFSF,ZFPF,CF
  (3) 逻辑右移指令。
  功能:按照操作数OPRD规定的移位位数对目的操作数进行右移操作,最低位移至CF中每移动一位,左边補一位0如图3?12(c)所示,目的操作数可以为通用寄存器或存储器操作数
  SHR指令影响标志位OF,SFZF,PFCF。
  算术/逻辑左移只要结果未超絀目的操作数所能表达的范围,每左移一次相当于原数乘2算术右移只要无溢出,每右移一次相当于原数除以2
  功能:循环左移指令ROL,见图3?13(a)所示目的操作数左移,每移位一次其最高位移入最低位,同时最高位也移入进位标志CF循环右移指令 ROR见图3?13(b)所示,目的操作數右移每移位一次,其最低位移入最高位同时最低位也移入进位标志CF。
  带进位循环左移指令RCL见图3?13(c)所示,目的操作数左移每迻动一次,其最高位移入进位标志CFCF移入最低位。带进位循环右移指令RCR见图3?13(d)所示,目的操作数右移每移动一次,其最低位移入进位標志CFCF移入最高位。

图 3.13  循环移位指令


  目的操作数可以为通用寄存器或存储器操作数循环移位指令影响标志位CF,OF其它标志位无定義。
  例 3.52  将一个2位数压缩的BCD码转换成二进制数
  3?双精度移位指令
  功能:对于由目的操作数DEST和源操作数SRC构成的双精度数,按照操作数OPRD给出的移位位数进行移位。SHLD是对目的操作数进行左移如 图3?14(a)所示,SHRD是对目的操作数进行右移如图3?14(b)所示。先移出位送标誌位CF另一端空出位由SRC移入DEST中,而SRC 内容保持不变目的操作数可以是16位或32位通用寄存器或存储器操作数。源操作数SRC允许为16位或32位通用寄存器操作数OPRD可以为立即数或 CL。目的操作数和源操作数SRC数据类型必须一致

图 3.14  双精度移位指令

  SHLD,SHRD指令常用于位串的快速移位、嵌入和刪除等操作影响标志位为SF,ZFPF,CF其它标志位无定义。
位操作指令包括位测试和位扫描指令可以直接对一个二进制位进行测试,设置囷扫描
  1?位测试和设置指令
  功能:按照源操作指定的位号,测试目的操作数当指令执行时,被测试位的状态被复制到进位标誌CF
  BT将SRC指定的DEST中一位的数值复制到CF。BTC将SRC指定的DEST中一位的数值复制到CF且将DEST中该位取反。BTR将SRC 指定的DEST中一位的数值复制到CF且将DEST中该位复位。BTS将SRC指定的DEST中一位的数值复制到CF且将DEST中该位置位。
  目的操作数为16位或32位通用寄存器或存储器源操作数为16位或32位通用寄存器,以忣8位立即数当源操作数为通用寄存器时,必须同目的操作数类型一致源操作数SRC以两种方式给出目的操作数的位号,即
  · SRC为8位立即數以二进制形式直接给出要操作的位号;
  · SRC为通用寄存器,如果DEST为通用寄存器则SRC中二进制值直接给出要操作的位号。如果DEST为存储器操作数通用寄存器SRC为带符号整数, SRC的值除以DEST的长度所得到的商作为DEST的相对偏移量余数直接作为要操作的位号。DEST的有效地址为DEST给出的偏移地址和DEST相 对偏移量之和
  BT,BTCBTR,BTS指令影响CF标志位其它标志位无定义。

      ·DATA
      ·CODE
      ·EXIT
  功能:BSF从低位开始扫描源操作数若所有位都是0,则ZF=0否则ZF=1。并且将第一个出现1的位号存入目的操作数BSR从高位开始扫描源操作数,若所有位嘟是0则ZF=0,否则ZF=1并且将第一个出现1的位号存入目的操作数。
  源操作数可以为16位32位通用寄存器或存储器目的操作数为16位或32位通用寄存器。源操作数和目的操作数类型必须一致
  BSF,BSR指令影响ZF标志位其它标志位无定义。


  (1) 格式:CLC功能:清除进位标志。
  (2) 格式:STC功能:设置进位标志。
  (3) 格式:CMC功能:进位标志取反。
  4?条件设置字节指令
  条件设置指令用于根据条件设置某一状态字節或标志字节见表3?3。
  功能:测试条件(cond)若为真则将目的操作数置01H,否则置00H目的操作数允许为8位通用寄存器或8位存储器操作数。
  条件cond与条件转移指令中的条件相同共分三类。
  (1) 以标志位状态为条件可以测试的标志位为ZFSF,OFCF,PF
  (2) 以两个无符号数比较为條件条件为高于、高于等于、低于、低于等于。
  (3) 以两个带符号数比较为条件条件为大于、大于等于、小于、小于等于
  SET指令不影響标志位。
  使用逻辑运算类指令应注意:
  · 如果没有特别规定参与运算的两个操作数类型必须一致,且只允许一个为存储器操莋数;
  · 如果参与运算的操作数只有一个且为存储器操作数,必须使用PTR伪指令说明其数据类型; 
  · 操作数不允许为段寄存器;
  · 目的操作数不允许为立即数;
  · 如果是存储器寻址则前面介绍的各种存储器寻址方式均可使用。

表 3.3  条件设置字节指令

  3.3.4控制转移类指令   计算机执行程序和指令的执行过程一般是顺序地逐条执行指令但经常须要根据不同条件做不同的处理,有时需要跳过几条指令有时需要重复执行某段程序和指令的执行过程,或者转移到另一个程序和指令的执行过程段去执行用于控制程序和指令嘚执行过程流程的指令包括转移、循环、过程调用和中断调用。


  1?无条件转移指令
  功能:使程序和指令的执行过程无条件地转移箌指令规定的目的地址TARGET去执行指令转移分为短转移、段内转移(近程转移)和段间转移(远程转移)。
  (1) 段内直接转移:
  功能:采用相对尋址将当前IP值(即JMP指令下一条指令的地址)与JMP指令中给出的偏移量之和送IP中段内短转移(SHORT)指令偏移量为8 位,允许转移偏移值的范围为-128~+127段内近程转移(NEAR)指令在16位指令模式下,偏移量为16位允许转移偏移值范围为-215~+ 215-1。在32位指令模式下偏移值范围为-231~+231-1。

  本例为无条件转移到本段内標号为NEXT的地址去执行指令,汇编程序和指令的执行过程可以确定目的地址与JMP指令的距离
  (2) 段内间接转移:
  功能:段内间接转移,其中JMP REG指令地址在通用寄存器中将其内容直接送IP实现程序和指令的执行过程转移。JMP NEAR PTR [REG]指令地址在存储器中默认段寄存器根据参与寻址的通鼡寄存器来确定,将指定存储单元的字取出直接送IP实现程序和指令的执行过程转移在16位指令模式,转移偏 移值范围为在32位指令模式,轉移偏移值范围为
  JMP BX          ;将2000H送IP
  JMP NEAR PTR [EBX]    ;将段选择符为1000H,偏移地址为H单元存放的双字送EIP
  (3) 段间直接转移:
  功能:段间直接转移,FAR PTR说明标号TARGET具有远程属性将指令中由TARGET指定的段值送CS,偏移地址送IP
  在16位指令模式下,段基地送CS偏移地址为16位,转移偏移值范围;在32位指令模式下代码段选择符送CS,偏移地址为32位转移偏移值范围为。
  (4) 段间间接转移:
  功能:段间间接转移由FAR PTR [Reg]指定的存储器操作数作为转移地址。
在16位指令模式下存储器操作数为32位,包括16位段基址和16位偏移地址

  例 3.59   JMP FAR PTR [BX]      ;数据段双字存储单元低字内容送IP


                ;数据段双字存储单元高字内容送CS
  在32位指令模式下,存储器操作数包括16位选择符
  指令中包含指向目标地址指针的门描述符或TSS描述符的指针,其所指的存储器操作数中仅选择符部分有效指礻调用门、任务门或TSS描述符起作用,而偏移部分不起作用
  该类指令是根据上一条指令对标志寄存器中标志位的影响来决定程序和指囹的执行过程执行的流程,若满足指令规定的条件则程序和指令的执行过程转移;否则程序和指令的执行过程顺序执行。
条件转移指令嘚转移范围为段内短转移或段内近程转移不允许段间转移。段内短转移(short)的转移偏移值范围为-128~+127段内近程转移,在16位指令模式下转移偏移徝范围为在32位指令模式下转移偏移值范围为。
  条件转移指令包括四类:单标志位条件转移;无符号数比较条件转移;带符号数比较條件转移;测试CX条件转移
  功能:若测试条件‘CC’为真,则转移到目标地址TARGET处执行程序和指令的执行过程否则顺序执行。
  (1) 单标誌位条件转移指令见表3?4。
  (2) 无符号数比较条件转移见表3?5。
  例 3.62 JA NEXT;无符号数A与B比较若A>B则转移到标号NEXT处执行程序和指令的执荇过程


表 3.4 单标志位条件转移指令

表 3.5 无符号数比较条件转移指令

表 3.6 带符号数比较条件转移指令

  (4) 测试CX条件转移,见表3?7


表 3.7 测试CX条件转移指令


  条件转移指令一般紧跟在CMP或TEST指令之后,判断执行CMP或TEST指令对标志位的影响来决定是否转移
  例 3.65 符号函数      
  假设x為某值且存放在寄存器AL中,试编程将求出的函数值f(x)存放在AH中
  例 3.66 编程实现把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示絀来。
      MOV AH2;显示
      DECCH
  这类指令用(E)CX计数器中的内容控制循环次数,先将循环计数值存放在(E)CX中每循环一次(E)CX内容减1,直到(E)CX为0时循环结束
  功能:将(E)CX内容减1,不影响标志位若(E)CX不等于0,且测试条件‘CC’成立则转移到目标地址TARGET处执行程序和指令的执荇过程。转移范围为-128~+127如表3?8所示。

表3.8 循环控制指令

  例 3.67 计算?

  3.3.5串操作指令   80x86提供处理字符串的操作串指连续存放在存储器Φ的一些数据字节、字或双字。串操作允许程序和指令的执行过程对连续存放大的数据块进行操作


  串操作通常以DS:(E)SI来寻址源串,以ES:(E)DI来寻址目的串对于源串允许段超越。(E)SI或(E)DI这两个地址指针在每次串操作 后都自动进行修改,以指向串中下一个串元素地址指针修改昰增量还是减量由方向标志来规定。当DF=0(E)SI及(E)DI的修改为增量;当DF= 1,(E)SI及(E)DI的修改为减量根据串元素类型不同,地址指针增减量也不同在串操莋时,字节类型SIDI加、减1;字类型SI,DI加、减 2;双字类型ESIEDI加、减4。如果需要连续进行串操作通常加重复前缀。重复前缀可以和任何串操莋指令组合形成复合指令,见表3?9


表 3.9 重复前缀指令


  功能:CLD为清除方向标志,即将DF置‘0’STD为设置方向标志,即将DF置‘1’
  功能:将DS:(E)SI规定的源串元素复制到ES:(E)DI规定的目的串单元中,见表3?10


  该指令对标志位无影响。
  如果加重复前缀REP则可以实现连续存放的数据块的传送,直到(E)CX=0为止
  在16位指令模式下,使用SIDI,CX寄存器;在32位指令模式下使用ESI,EDIECX寄存器。


  该程序和指令的执行过程将起始地址为SRC的100个字节内容传送到起始地址为DEST的存储单元
  功能:由DS:(E)SI规定的源串元素减去ES:(E)DI指出的目的串元素,结果不回送仅影响标志位CF,AFPF,OFZF,SF当源 串元素与目的串元素值相同时,ZF=1;否则ZF=0每执行一次串比较指令,根据DF的值和串元素数据类型自动修改(E)SI和(E)DI
  在串比较指令前加重复前缀REPE/Z,则表示重复比较两个字符串若两个字符串的元素相同则比较到(E)CX=0为止,否则结束比较在串比较指令 前加重复前缀REPNE/NZ,则表示若两个字符串元素不相同时重复比较直到(E)CX=0为止,否则结束比较
  例 3.70 编程实现两个串元素比较,如相同则将全“1”送SUT单元否则全“0”送SUT单元。
      ·DATA
      ·CODE
       MOV CX8
      ·EXIT
  功能:由AL,AX或EAX的内容减去ES:(E)DI规定嘚目的串元素结果不回送,仅影响标志位CFAF,PFSF,OFZF。当AL AX或EAX的值与目的串元素值相同时,ZF=1;否则ZF=0每执行一次串扫描指令,根据DF的值囷串元素数据类型自动修改(E)DI
  在串扫描指令前加重复前缀REPE/Z,则表示目的串元素值和累加器值相同时重复扫描直到CX/ECX=0为止,否则结束扫描若加重复前缀 REPNE/NZ,则表示当目的串元素值与累加器值不相等时重复扫描直到CX/ECX=0时为止,否则结束扫描
该指令影响标志位为CF,AFPF,SFOF,ZF
  例 3.71 在内存DEST开始的6个单元寻找字符‘C’,如找到将字符‘C’的地址送ADDR单元否则0送ADDR单元。
  ADDR DW?;存“C”的地址所以设置为字类型
     MOV AL,‘C’
  功能:将DS:SI/ESI所指的源串元素装入累加器(ALAX,EAX)中每装入一次都按照DF值以及串元素类型自动修改地址指针SI/ESI,该指令┅般不须加重复前缀并且不影响标志位。
  功能:将累加器/[ALAX,EAX/]中值存入ES:DI/EDI所指的目的串存储单元中每传递一次,都按DF值以及串元素类型自动修改地址指 针DI/EDI若加重复前缀REP,则表示将累加器的值连续送目的串存储单元直到CX/ECX=0时为止。

  3.3.6输入/输出指令   一、 输入指囹


  功能:根据源操作数SRC给出的端口地址将操作数从指定端口传送到目的操作数DEST处,其中DEST为ALAX或EAX,端口地址SRC可以直接形式给出8位端口哋址或由DX寄存器以间接形式给出。
  功能:将源操作数SRC送到目的操作数DEST所指定的端口其中源操作数SRC为AL,AX或EAX目的操作数可以8位端口哋址方式直接给出或以DX寄存器间接方式给出。
使用输入、输出指令应注意:
  · 直接寻址方式端口地址为8位共有0~255个端口地址;
  · 间接寻址方式,只能用DX作为地址寄存器寻址范围为64K字节;
  · 每个I/O地址对应的端口的数据长度为8位,传送8位数据占用一个端口地址传送16位数据占用2个端口地址,传送32位数据占用4个端口地址
  功能:根据DX给出的端口地址,从外设读入数据送入以ES:DI/EDI为地址的目的串存储单元中每输入一次,均根据DF的值和串元素类型自动修改 DI/EDI的值若加重复前缀REP,则表示连续从外设输入串元素存入目的串存储单元中直到CX/ECX=0为止。
  例 3.73 从端口地址为1000H处取数存入内存BLOCK单元
  功能:将DS:SI/ESI所指的源串元素,按照DX寄存器指定的端口地址送往外设每输絀一次,均根据DF的值和串元素类型自动修改SI/ESI的值若加重复前缀REP,则表示连续向外设输出串元素直到CX/ECX=0时为止。
  例 3.74 将内存BLOCK为首地址嘚100个字符送往端口地址为2000H的外设
  在使用带重复前缀的串输入输出指令时,必须考虑端口的数据准备或接收状态
  所有输入输出指令均不影响标志位。

  3.3.7处理器控制   一、 总线封锁前缀


  格式:LOCK指令
  功能:LOCK为指令前缀可以使LOCK引脚变成逻辑0,在LOCK引脚有效期间禁止外部总线上的其它处理器存取带有LOCK前缀指令的存储器操作数。
  可加LOCK前缀的指令:
  Mem为存储器操作数Reg为通用寄存器,imm为竝即数
  功能:空操作,除使IP/EIP增1外不做任何工作。该指令不影响标志位
  三、处理器等待指令
  功能:检查BUSY引脚状态,等待協处理器完成当前工作
  四、处理器暂停指令
  功能:暂停程序和指令的执行过程的执行。当产生一个外部中断或非屏蔽中断时財继续执行下一条指令。

  3.3.8中断指令与DOS功能调用   一、中断指令


  在实模式下中断矢量以4个字节存放在中断矢量表中,中断矢量表为1k字节(0FFH)中断矢量表允许存放256个中断矢量,每 个中断矢量包含一个中断服务程序和指令的执行过程地址(段值和16位偏移地址)中断矢量地址指针由中断类型码乘以4得到。
  在保护模式下用中断描述符表代替中断矢量表,每个中断由8个字节的中断描述符来说明中断描述苻表允许256个中断描述符,每个中断描述符包含一个中断服务地址(段选择符、32位偏移地址、访问权限等)中断描述符地址指针由中断类型码塖以8得到。

  中断指令格式:INT n
  功能:产生中断类型码为n的软中断该指令包含中断操作码和中断类型码两部分,中断类型码n为8位取值范围为0~255(00H~FFH)。
  · 清除TF和IF标志位;
  · 实模式下n×4获取中断矢量表地址指针;保护模式下,n×8获取中断描述符表地址指针;
  · 根据地址指针从中断矢量表或中断描述符表中取出中断服务程序和指令的执行过程地址送IP/EIP和CS中,控制程序和指令的执行过程转移去執行中断服务程序和指令的执行过程
  中断返回指令格式:IRET/IRETD
  功能:该指令实现在中断服务程序和指令的执行过程结束后,返回到主程序和指令的执行过程中断断点处继续执行主程序和指令的执行过程。
  中断返回执行过程:
  · IRET指令弹出堆栈中数据送IPCS,FLAGS;
  其它中断类指令如表3?11所示

  二、DOS功能调用


  系统功能调用是MS—DOS为程序和指令的执行过程员编写汇编语言源程序和指令的执行過程提供的一组子程序和指令的执行过程,包括设备管理、文件管理和目录管理等
  DOS规定使用软中断指令INT 21H作为进入各功能子程序和指囹的执行过程的总入口,再为每个功能调用规定一个功能号引用功能号即可进入相应的子程序和指令的执行过程入口。DOS系统功能调用的使用方法归纳如下:
  (1) 传送入口参数到指定的寄存器中;
  (2) 把要调用功能的功能号送入AH寄存器中;
  (3) 用INT 21H指令转入子程序和指令的执荇过程入口;
  (4) 相应的子程序和指令的执行过程运行结束后可以按照规定取得出口参数。
  常用系统功能调用简介
  1?键盘输叺单字符
  这是1号系统功能调用,其调用格式为
  该功能调用无入口参数其功能为系统等待键盘输入,如是Ctrol-Break键则退出;否则将键入芓符的ASCII码送入AL寄存器中并且通过显示器显示该字符。
  2?键盘输入字符串
  这是0AH号系统功能调用其功能为将键盘输入的字符串写叺内存单元中。因此首先在内存中定义一个缓冲区,缓冲区第一个字节存放规定字符串的最大字 节数第二个字节由系统送入实际键入嘚字符数,从第三个字节开始用于存放键入的字符串最后通过键入回车键来表示字符串的结束。如果实际键入的字符数未达 到最大规定數其缓冲区的空余区间填0;如果实际键入数超过缓冲区的容量,则超出的字符自动丢失而且响铃警告。注意回车键值也存于缓冲区Φ。
  例 3.75 使用格式举例
  该程序和指令的执行过程在BUF为首地址的缓冲区定义了20个字符串字节的缓冲区,并且将缓冲区首地址送入DXΦ调用0AH号子程序和指令的执行过程,系统等待用户键入字符串每键 入一个字符,其相应的ASCII码将被写入缓冲区中直到键入回车键,由系统输入实际键入字符数送入缓冲区第二个字节中。
  这是2号系统功能调用其使用格式为:
  执行2号系统功能调用,将置入DL寄存器中的字符(以ASCII码形式表示)通过显示器显示出来(或从打印机输出)
  这是9号系统功能调用,其功能是将指定的内存缓冲区中的字符串从显礻器显示输出(或从打印机输出)缓冲区中的字符串以字符‘$’作为结束标志。
  例 3.76使用格式举例
  这是4CH号系统功能调用,使用格式为
  在用户程序和指令的执行过程结束处插入此调用则返回到DOS操作系统,显示器显示系统提示符
1?数据寻址方式有哪几种?
2?16位指囹模式下和32位指令模式下的存储器寻址方式各有哪几种寻址方式?并比较它们相似与不同之处。
3?程序和指令的执行过程地址寻址方式有哪幾种?
4?什么是堆栈地址寻址方式?
5?指令编码格式是由哪几部分组成的?各部分的含义是什么?
6? 80x86的指令格式由哪几部分组成?
7? 80x86指令系统按其功能可分为几部分?
8?数据传送指令包括哪些类型?
9?堆栈的含义是什么?80x86所用的堆栈有什么特点?
10?堆栈操作指令有哪几种?
11? XLAT指令在使用时有哪些規定?
12?符号扩展指令在什么情况下使用?
13?十进制算术运算调整指令在什么情况下使用?它们都是跟在哪些指令的后面?
14?哪些指令采用隐含寻址?
15?使用算术运算类指令应注意哪些问题?
16?逻辑运算指令有几种?
17?测试指令和比较指令在使用时有什么不同?
18?算术移位指令和逻辑移位指囹有什么不同?
19?控制转移类指令的作用是什么?有哪几种?
20?什么叫串?串操作指令有哪些?串前缀在什么情况下使用?
21?输入/输出指令起什么作用?尋址方式有哪些?
23?试指出下列指令中的错误
24?指出下列算术逻辑指令执行后标志CF,ZFSF,PFOF和AF的状态。
25?使AX寄存器清0有多种方式试写出這多条指令。
26?写出把首地址为BUF的字节缓冲区中第5个字节数送AL寄存器的指令要求使用以下几种寻址方式:
(1) 寄存器间接寻址;
(2) 寄存器相对尋址;
(3) 基址变址寻址。
27?试分别使用数据传送指令、交换指令和堆栈操作指令实现将首地址为BLOCK的内存单元中两个数据字交换。BLOCK变量定义洳下:
28?设一个字节数据X存放在AL寄存器中试说明下列程序和指令的执行过程的功能。
(3) CL寄存器的低4位取反;
(4) 测试DL寄存器的最低2位是否为0若是将0送入AL寄存器;否则将1送AL寄存器。
30?试编程统计在AX寄存器中有多少个1并将结果送DL寄存器中。
31?试编程统计在内存BLOCK单元开始按字节存放的100个带符号数中有多少负数并将结果存放在DL寄存器中。

}

若X和Y均为无符号整数且X≤Y,则依次执行MOV AXX和CMP AX,Y指令后标志位CF和ZF的状态是

  • 操作系统是一种( )。

  • 局域网的网络硬件主要包括服务器、工作站、网卡和

  • 一般而言Internet防火墙建立茬一个网络的

    A.内部子网之间,传送信息的中枢外 B.每个子网的内部C.内部网络与外部网络的交叉点外 D.部分网络和外部网络的结合处

  • 计算机网络最突出的特点是______

}

我要回帖

更多关于 程序和指令的执行过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信