汇编语言符号汇总

汇编语言符号汇总
汇编语言符号汇总

汇编语言符号和教材符号汇总

(8088/8086 IBM PC计算机)

--学习笔记" "∶教材符号

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

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

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

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

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

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

;∶注释符号。

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

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

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

∶运算符。方括号括起来的数是数组变量的下标或地址表达式。带方括号的地址表[ ] 1.

达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;BX 或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不

③和DI可以单独出现在各方括号内,也可允许BX和BP出现在同一个方括号内;SI

以与常数、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减6,AH减1 ,并使AF和CF 置1,清除AL中的高四位。

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

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

∶,辅助进位标志,在标志寄存器的第4字节。记录运算时第3 AF Auxiliary Carry Flag

位(半个字节)产生的进位值(置1)。该标志用于对BCD码的加减运算中。

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

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

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

AX Accumulator

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

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

BP Base Pointer

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

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

位,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。

∶,进位标志,在标志寄存器的第0字节,记录运算时从最高有效位产生的CF Carry Flag

进位值(置1)。作加法时,CF位可以用来表示无符号数的溢出(有符号数溢出用OF 表示)。

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

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

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

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

CMP∶指令助记符——比较。对于“ CMP AX,BX” ,如果是两个无符号数比较(减),若结果没有产生借位,即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方式可以使不同模块中的不同变量或标号作用于相同的存储单元。

∶,代码段寄存器,存放当前运行的代码段起始地址(高16位)。代码CS Code Segment

段存放当前正在运行的程序。

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

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

位,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 。操作数可以是寄存器或存储器单元,但不能是段寄存器或立即数。

∶,方向标志,在标志寄存器的第10字节,在串处理指令中控制处理信DF Direction Flag

息的方向。DF为1时是反向,每次操作后使SI和DI减量(这样就使串处理从高地址向低地址方向处理);当DF为0时是正向,使SI和DI增量。

∶tination Index,目的变址寄存器。与ES联用,用来确定数据段中某一存储单元的DI Des

偏移地址。在串处理指令中,DI指出目的操作数的地址,隐含段为当前的附加段。

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和AX组合在一起存放一个双字数,DX Data,

DX用来存放高位字。此外,对某些I/O 操作,DX可用来存放I/O的端口地址。其中DH是高8位,DL是低8位。

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

ELSE∶伪指令——条件。条件不满足时汇编ELSE至ENDIF之间的程序块。

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

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

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

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

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

∶,附加段寄存器。用于存放附加段的起始地址(高16位)。附加段ES Extra Segment

是一个辅助的数据区,也是串处理指令的目的操作数据存放区。

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

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中。 余数的符号必须和被除数的符号相同。

∶,①中断标志,在标志寄存器的第9字节,当IF为1时,允许中断,即IF Interrupt Flag

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=0,OF=0;否则,CF=1,OF=1,表示在AH(对于字节)或DX(对于字)中包含结果的有效值。

IN∶指令助记符——输入。允许把一个字或字节由输入端口(port)传送到AX或AL。端口地址可以用直接寻址(IN AL n),也可用DX间接寻址(IN AL,DX)。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 [BX]

②(段内存储器

三、段内间接转移JMP AX

间接转移)。将指令中给定的寄存器或存储单元中的内容送到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 与变量连用。

例 TIMB LABLE BYTE

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

二、LABLE 与标号连用。

例 POINTF LABLE FAR POINTN:MOV AX,[BX+SI]第一句给第二句隐含定义的近标号POINTN取一个新名字POINTF,并将类型属性修改为FAR 。这样就允许作为

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

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

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

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

例:变量名一DD 变量名二

......

LDS SI 变量名一

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

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

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

例一LEA SI,变量名(与MOV SI OFFSET 变量名等效);

例二LEA AX,[AX] (将SI所指存储单元的EA送至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 字乘法:(AX)*(源操作数)->DX和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 $+10 表示跳过10个字节。

例二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)。或指定输出新的一页(用+号)。

∶奇偶标志,在标志寄存器的第2字节,当运算结果(指低8位)中1的PF Parity Flag,

个数为偶数时置1,否则置0。该标志主要用来检测数据在传输过程中的错误。

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

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

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

∶rogram Status Word,程序状态字寄存器,由条件码标志(OF、SF、ZF、AF、PSW P

PF、CF)和控制标志(DF、IF、TF)构成。

11109876420

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

│OF│DF│IF│TF│SF│ZF││AF││PF││CF│

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

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 重复次数

重复块

ENDM

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

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程序把类别名相同的所有段放在连续的存储区域内。同类的各个段在连接时,先出现的在前,后出现的在后。

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

置1。

SHL∶

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

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

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

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

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

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

SHR∶

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

二、指令助记符——无符号数的逻辑右移。经常用来除以2。当移位次数大于1

时,则移位次数应预先置于CL寄存器中,写成“SHR …,CL”。

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

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

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

SI Source Index

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

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

SP Stack Pointer

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

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

SS Stack Segment

STACK∶伪指令——段定义(组合类型)。指定该段在运行时为堆栈段的一部分。被连接的程序中必须至少有一个ST ACK 段。初始化时,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∶伪指令——设计一个结构。

例 定义名为S的结构如下 S STRUC

FL1DB 1,2

FL2DB 'DOBOSKY'

S ENDS

然后定义一个类型为S的变量DBAREA S <,'ANY'>

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

SUB∶指令助记符——减法。

SUBTTL∶伪指令。为程序指定一个小标题,并打印在每一页的标题之后。

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

例如TEST AL,01H(检查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 EQU THIS BYTE

DA_WORD DW 20H DUP(0)

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

例二JMP_FAR EQU THIS FAR

JMP_NEAR:MOV AL,30H

当从段内某指令调用这个程序段时,可用标号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∶运算符。用于返回记录或记录字段所占的位数。

汇编语言程序代码详细版

1.1 DATAS SEGMENT x db 6 y db 7 z db ? ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT dw 100 dup(0);此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: push ds mov ax,0 push ax mov ax,datas mov ds,ax mov dl,x add dl,y mov cl,3 sal dl,cl sub dl,x sar dl,1 mov z , dl ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START 1.2DATAS SEGMENT x db 4 dup (0) y db 4 dup (0)

z db 4 dup (0) ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT dw 100 dup(0);此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: mov x,12h mov [x+1],34h mov [x+2],56h mov [x+3],78h mov bl,78h mov y,34h mov [y+1],56h mov [y+2],87h mov [y+3],64h add bl,64h mov [z+3],bl mov bl,56h adc bl,87h mov [z+2],bl mov bl,34h adc bl,56h mov [z+1],bl mov bl,12h adc bl,34h mov z,bl

汇编语言程序设计 知识点 V3.0

第一章 1、什么是汇编语言? 2、汇编语言程序设计过程:编辑源程序,编译(汇编),连接,运行调试 3、汇编语言特点?与机器语言一一对应,直接操作硬件,高效率(空间和时间,运行速度快,目标代码短,占用存储空间少) 4、数制转换 第2章8086计算机组织结构 1、计算机硬件系统组成:CPU、存储器、输入输出设备。 2、CPU组成:运算器、控制器、寄存器,运算器和控制器由芯片设计时设计好,不可做任何改动,程序设计员仅能在程序里使用寄存器,寄存器都有相应的名字,如AX,能在程序里直接使用寄存器是汇编语言区别于高级语言的最重要特点,这样就可以直接控制硬件系统。 3、总线结构:数据总线、地址总线、控制总线。数据总线分8位、16位、32位和64位等,多少位机就是以数据总线来划分,比如8位机、32位机。8086机是16位机,但地址总线是20位,地址总线数量决定了内存寻址空间的大小,如8086有20位地址线,那么寻址空间是:220=210*1K=1M,8086最大寻址空间为1MB,即地址范围:00000H~FFFFFH。控制总线主要传送控制信息,如读写操作,读写操作的主体是CPU,读操作是指CPU从内存或外设读取数据,写操作是指CPU把数据写到内存或外设中。 4、存储器:存储器的最小单元是字节(Byte,由8个位组成),字节的多少就是存储器的容量。每一个字节单元都有一个唯一的编号,这个编号就是字节单元的地址,此地址就是物理地址,对于8086而言,编号的形式为:XXXXXH,如85421H。如果要读写存储器,必须知道某一个字节单元的地址。多个字节单元可以组合成更大的单元(数),比如2个字节单元组合成一个字(Word),4个字节单元组合成一个双字(Double Word)等,规定:这个组合后的大单元是以最小字节单元地址为自己的地址。如85421H字节单元内容为12H,85422H 字节单元内容为34H,那么以85421H地址的字单元的内容就是3412H。 地址取最小字节单元的地址为大单元的地址。 内容排序按照“高高低低”原则:高字节放在高地址里,低字节放在低地址里。 详细请参看2.3节(P30页) 5、8086CPU寄存器 (1)通用类:AX(AH,AL)、BX(BH,BL)、CX(CH,CL)、DX(DH,DL) (2)段寄存器类:CS、DS、ES、SS (3)与偏移地址相关类:SI、DI、SP、BP (4)特殊类:IP、FLAGS 所有寄存器都是16位大小,通用类的16位又可看成2个8位的寄存器组成,区分为高8位(High)和低8位(Low),因此取名为AH和AL,其他类似。 CS:存放代码段段地址,DS:存放数据段段地址,SS:存放堆栈段段地址,ES:存放数据附加段段地址,一般作为DS的辅助使用,比如在一段程序里需要用到2个不同数据段的数据时,其中一个数据段段地址存放在DS中,另一个存放在ES中。 SI、DI:一般用于变址寻址方式,如[BX+SI]、[BX+DI], SP:堆栈段中堆栈栈顶的偏移地址,不可修改,由SS:SP逻辑地址始终指向堆栈的栈顶。 详细参看2.3.2,P32页 BP:一般也用于堆栈,可以作为SP的备份,通常也是用SS:BP逻辑地址表示,BP可以随意修改,因此通过SS:BP可以访问堆栈的任何地方。此外,BP还与BX一样,可以作为基地址

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

汇编语言指令汇总

汇编语言程序设计资料简汇 通用寄存器 8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。 16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。 AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。专用寄存器 指令指针:IP(16位)。 标志寄存器:没有助记符(FLAGS 16位)。 段寄存器 段寄存器:CS、DS、ES、SS。 内存分段:80x86采用分段内存管理机制,主要包括下列几种类型的段: ?代码段:用来存放程序的指令序列。 ?数据段:用来存放程序的数据。 ?堆栈段:作为堆栈使用的内存区域,用来存放过程返回地址、过程参数等。 物理地址与逻辑地址 ?物理地址:内存单元的实际地址,也就是出现在地址总线上的地址。 ?逻辑地址:或称分段地址。 ?段地址与偏移地址都是16位。 ?系统采用下列方法将逻辑地址自动转换为20位的物理地址: 物理地址= 段地址×16 + 偏移地址 ?每个内存单元具有唯一的物理地址,但可由不同的逻辑地址描述。 与数据有关的寻址方式 立即寻址方式 立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 例:MOV AL,18 指令执行后,(AL)= 12H 寄存器寻址方式 在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。 例3:MOV AX,BX 如指令执行前(AX)= 6789H,(BX)= 0000H;则指令执行后,(AX)= 0000H,(BX)保持不变。 直接寻址方式 直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。直接寻址方式适合于处理单个数据变量。 寄存器间接寻址方式 在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。 如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址。 如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段。

【汇编语言程序设计】试题及答案合集

《汇编语言程序设计试题及答案》合集 汇编语言程序设计试题及答案 1.对于有符号的数来说,下列哪个值最大(D) A:0F8H B:11010011B C:82 D:123Q 2.下列有关汇编语言中标号的命名规则中,错误的是(D) A:通常由字母打头的字符、数字串组成 B:标号长度不能超过31个字符 C:?和$不能单独作为标号 D:.号不可位于标号首 3.8088/8086存储器分段,每个段不超过(D ) A.64K个字 B.32K个字节 C.1兆个字节 D.64K个字节 4.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式(B)A:寄存器寻址B:相对基址变址寻址 C:变址寻址D:基址变址寻址 5.若AX= - 15要得到AX=15应执行的指令是(A ) A.NEG AX B.NOT AX C.INC AX D.DEC AX 6.8086/8088系统执行传送指令MOV时( A) A.不影响标志位 B.影响DF方向标志 C.影响SF符号标志 D.影响CF进位标志 7.若要求一个操作数中的若干位维持不变,若干位置?1?,可以使用(B)A:NOT B:OR C:AND D:XOR 8.下列指令中段默认为堆栈段的是( C) A.MOV AX,[BX+SI+10] B.ADD AX,ES:[SI] C.SUB [BX],[BP][DI] D. MOV DX,[1000H] 9.关于8086/8088微机系列,下列说法哪个是正确的(D) A:一个存储单元由16个二进制位组成,简称字。

B:当存储一个字数据时,低字节放高地址位,高字节放低地址位。 C:在内存空间中,可以无限分配段,且段的大小不受限制。 D:段与段之间可以邻接,也可以重叠。 10.下列关于堆栈的说法,错误的是(D) A:以?先入后出?为原则。 B:栈区最高地址单元的前一个单元为栈底。 C:运行中SP寄存器动态跟踪栈顶位置。 D:压栈和弹出都是以字节为单位。 11.表示过程定义结束的伪指令是( A) A.ENDP B.ENDS C.END D.ENDM 12.BUF1 DB 3 DUP(0,2 DUP (1,2),3) COUNT EQU $-BUF1 符号COUNT等价的值是( B) A.6 B.18 C.16 D.9 13.下列标志位中,可以用来判断计算结果正负的是(B) A:PF B:SF C:DF D:OF 14.下列指令正确的是( CD) A. MOV [100H], [BX] B.MOV DS, ES C. ADD V[BX], CX D.MOV AX, 34H 15.下列哪个寄存器是属于指针寄存器(C) A:SI B:DX C:SP D:ES 二、填空题 (每小题4 分,共 20 分) 1.下列程序段求数组FLD的平均值,结果在AL中。请将程序填写完整(不考虑溢出) FLD DW 10, -20, 30, -60, -71, 80, 79, 56 _LEA SI,FLD______ MOV CX, 8 XOR AX, AX

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

51汇编语言指令集符号定义表 (1)

51汇编语言指令集 符号定义表 符号含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 指令介绍 指令字节周期动作说明 算数运算指令 1.ADD A,Rn 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 将累加器与间接地址的内容相加,结果存回累加器 4.ADD A,#data 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 将累加器与寄存器的内容及进位C相加,结果存回累加器 6.ADDC A,direct 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 将累加器的值减去寄存器的值减借位C,结果存回累加器 10.SUBB A,direct 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 将累加器的值减间接地址的值减借位C,结果存回累加器 12.SUBB A,#data 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 将累加器的值加1 14.INC Rn 将寄存器的值加l 15.INC direct 将直接地址的内容加1 16.INC @Ri 将间接地址的内容加1 17.INC DPTR 数据指针寄存器值加1 说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位 18.DEC A 将累加器的值减1 19.DEC Rn 将寄存器的值减1 20.DEC direct 将直接地址的内容减1 21.DEC @Ri 将间接地址的内容减1 22.MUL AB 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字

如何编写和汇编语言程序

如何编写和汇编语言程序 可以用普通文本编辑器编辑汇编语言源程序。常用的有 MS-DOS 下的 EDIT 文本编辑程序, Windows 下的写字板( WORDPAD.EXE )等。用户通过屏幕编辑程序键入源程序,检查无误,可将源程序存到汇编系统盘上,该程序的扩展名为· ASM 。 软件运行基本环境 运行汇编程序必备的软件环境: DOS 操作系统;汇编系统。 汇编系统盘应包含如下文件: MASM 宏汇编程序文件 LISK 连接程序文件 CRFF 索引程序文件(也可不用) 汇编源程序编写 1 )源程序的书写格式 当 CPU 访问内存时,是把存储器分成若干个段,通过 4 个段寄存器中存放的地址对内存储器访问,因此在编源程序时必须按段的结构来编制程序。由于每个段的物理空间为≤ 64KB ,所以程序中各段可以分别为一个或几个。源程序的书写一般有如下形式: 逻辑堆栈段堆栈段名 SEGMENT STACK 用变量定义预置的堆栈空间 · · 堆栈段名 ENDS 逻辑数据段数据段名 SEGMENT 用变量定义预置的数据空间 · · 数据段名 ENDS 逻辑代码段代码段名 SEGMENT ASSUME 定义各段寻址关系 过程名 PROC … 程序 · · 过程名 ENDP 代码段名 ENDS END 过程名或起始标号 在源程序中最少要有一个代码段,数据段根据需要可有可无,也可以增设附加段。对于堆栈段也可以根据需要可有可无,但在连接( LINK )时计算机将显示警告性的错误: Warning : N STACK segment There was 1 error detected. 在程序中如果没有用到堆栈时,该错误提示不影响程序的运行,如果程序中用到堆栈时必须设置堆栈段。 其中: SEGMENT 、 ASSUME 、 PROC … ENDP 为伪指令,伪指令是发给汇编程序 ASM 的,而不和微处理器打交道,在汇编时不产生目标代码,只是把源程序中各段的设置情况告诉汇编程序。 2 )段寄存器的段地址的装入 Assume 伪指令语句只是建立了当前段与段寄存器的联系,但不能把各段的段地址装入相应的段寄存器中,段寄存器的段地址的装入是在程序中完成的。 ( 1 ) DS 、 ES 、 SS 的装入 由于段寄存器不能用立即数寻址方式直接传送,所以段地址装入可通过通用寄存器传送给段寄存器。 MOV AX ,逻辑段名 MOV 段寄存器, AX

汇编语言指令详解

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H 立即数可以是8位的,也可以是16位的。若

是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以分成两种情况:

汇编语言符号汇总

汇编语言符号和教材符号汇总 (8088/8086 IBM PC计算机) --学习笔记" "∶教材符号 +、-、*、/∶算术运算符。 &∶宏处理操作符。宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了。 $∶地址计数器的值——记录正在被汇编程序翻译的语句地址。每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。 ?∶操作数。在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。 =∶等号伪指令——符号定义。对符号进行定义和赋值,功能与EQU相似,但允许(重复)再定义。 :∶修改属性运算符(操作符)——段操作符。用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。注意,段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS。 ;∶注释符号。 %∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。 ( )∶1.运算符——用来改变运算符的优先级别。2.教材符号,表示括号内存储单元(或寄存器)的内容。 < >∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。 ∶运算符。方括号括起来的数是数组变量的下标或地址表达式。带方括号的地址表[ ] 1. ② 达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;BX 或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不 ③和DI可以单独出现在各方括号内,也可允许BX和BP出现在同一个方括号内;SI 以与常数、BP或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内; ④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。2.教材符号,表示其中的内容可省略。

一些简单的汇编程序

1.编制程序计算S=1+2+3+4+……+N直到和大于500为止,并将结果在屏幕上显示出来(N的值和最终的和的值)。 DATA SEGMENT N DW? SUM DW? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,0 MOV BL,0 E1: INC BL ADD AX,BX CMP AX,500 JBE E1 MOV [N],BX MOV [SUM],AX E2: MOV AX,BX MOV BL,10 DIV BL ADD AL,30H MOV DL,AL MOV CL,AH MOV AH,2 INT 21H ADD CL,30H MOV DL,CL MOV AH,2 INT 21H MOV AH,2 MOV DL,0AH INT 21H MOV AX,SUM CWD MOV BX,100 DIV BX MOV CX,DX ADD AL,30H MOV DL,AL MOV AH,2 INT 21H MOV BL,10 MOV AX,CX DIV BL MOV CL,AH MOV AH,2 ADD AL,30H MOV DL,AL INT 21H MOV AH,2 ADD CL,30H MOV DL,CL INT 21H MOV AH,4CH INT 21H CODE ENDS END START 2.从键盘输入学生成绩(A、B、C、D),自动汇总并显示各类分数的人数。按下$键则停止输入;若按下A、B、C、D之外的键则提示“INPUT ERROR”信息。 DATA SEGMENT M1 DB'Please input A,B,C,D:',13,10,'$' M2 DB 13,10,'Input error! ',13,10,'$' M3 DB 13,10,'The number of A is: $' M4 DB 13,10,'The number of B is: $' M5 DB 13,10,'The number of C is: $' M6 DB 13,10,'The number of D is: $' DATA ENDS STACK SEGMENT

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

8088汇编语言指令

8088指令系统总结 预备知识:符号含意、数据传送原则 符号含意 符号含意 opr 操作数 src 源操作数 dst 目的操作数 mem 存储器 im 立即数 seg 段寄存器 reg 通用寄存器 EA 偏移地址 PA 物理地址 nn直接地址DISP8:8位偏移地址DISP16:16位偏移地址 数据传送原则 口诀数据传送原则 寄段储间互传数,seg、reg、mem之间的数据可以相互传送。 立即只入寄和储。im可入reg、mem 只有寄间互换数,reg之间的数据可以传送。Mem间、seg间不可自传CS立即不可目,CS和立即数不可入,不能当目的操作数 8088指令系统 8088指令系统分六大类 一、数据传送指令 二、算术运算指令 三、逻辑运算与位移指令 四、串操作指令 五、控制与转移指令 六、CPU控制指令 一、数据传送指令 1.通用传送指令 (1)传送指令MOV dst, src功能:dst←src (2)堆栈操作指令人W PUSH src作用:SP←SP-2 ((SP+1)+SP)←src src(reg seg mem) POP dst 作用:dst←((SP+1)+SP)SP←SP-2 dst(reg seg mem)

(3)交换指令XCHG OPR1,OPR2 OPR1←→OPR2 2.累加器传送指令 (1)输入输出指令 256B短格式:直接寻址,64K长格式:直接、间接寻址,PORT为8位口地址输入指令:直接寻址IN AX,PORT IN AL,PORT 间接寻址IN AX,DX IN AL,DX 输出指令:直接寻址OUT AX,PORT OUT AL,PORT 间接寻址OUT AX,DX OUT AL,DX (2)换码指令XLAT AL←(BX+AL)(BX)为mem地址 3.地址传送指令 (1)有效地址传送寄存器 LEA reg16, mem作用:mem的EA→reg16 (2)指针送寄存器和DS指令 LDS reg16, mem32 作用:reg16←mem32的低字高字→DS (3)指针送寄存器和有ES指令 LES reg16, mem32 作用:reg16←mem32的低字高字→ES 4.标志寄存器传送指令 (1)取标志指令:LAHF F的低字节→AH (2)置标志指令:SAHF AH→flag的低字节 (3)标志入栈指令:PUSHF SP-2→SP F→(SP+1):SP (4)标志出栈指令:POPF (SP+1):SP→F SP+2→SP 二、算术运算指令 1.加法类指令(Add)opr-reg mem B/W (1)不带进位加法ADD dst, src dst←dst+src 影响OSZAPC (2)带进位加法ADC dst, src dst←dst+src+CF影响OSZAPC (3)加1指令INC opr opr←opr+1影响OSZP (4)组合十进制调整DAA放在ADD后 (5)非组合十进制调整AAA放在ADC后 原理:2个十进制数相加,可能出现非法数(A到F),需用调整指令,进行加6调整变成合法十进制数。十进制=BCD组合=压缩组合BCD占4位非组合BCD占8位 2 . 减法类指令(substract) (1)减法指令SUB dst, src;dst←dst-src影响标志位OSZAPC (2)带借位减法指令SBB dst, src;dst←dst-src-CF影响标志位

汇编语言词法分析(新)

数学与信息工程学院《编译原理》 实验报告一 实验名称:词法分析 实验室:6202 班级:09计算机3班 姓名:沈春晖 学号:0929210062

词法分析器的设计 一、实验目的 通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、实验环境 操作系统:window xp 编写环境:visual c++ 、c-free、turbo c 编写语言:c语言 分析语言:PL/0 三、实验内容 对PL/0语言进行词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下: (1)关键字:begin,call,const,do,end,if,odd,procedure,read,then,var,while,write (2)标识符:用来表示各种名字,必须以字母开头小于10位字符组成(3)数字:以0-9组成小于14位的数字 (4)运算符:+,-,*,/,:=,<,<=,>,>= (5)界符:,,.,;,# 表1 各种单词符号对应类型表 单词符号类型 + plus - minus * times / slash ( lparen ) rparen = eql , comma . perio # neq ; semicolon begin beginsym call callsym const constsym do dosym end endsym

if ifsym odd oddsym procedure proceduresym read readsym then thensym var varsym while whilesym write writesym N N Y Y 开始 调用GETSYM 取单词 输入要分析的文件 文件是否存在 文件是否结束 结束 打印分析结果 图1 主流程图

相关文档
最新文档