资源描述
第3章 实方式指令寻址与指令系统,3.1 指令的基本寻址方式 3.2 实方式32位指令寻址 3.3 实方式指令系统 3.4 字符设备I/O功能调用,3.1指令的基本寻址方式,8086 CPU的指令系统的基本指令包括: 数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 控制转移类指令 处理机控制类指令,3.1.1指令的基本格式,大多数数据传送类指令、算术运算类指令、位操作类指令及串操作类指令,其操作数指令有相同的语句格式和操作规定。 指令一般由操作码OP 、寻址方式MOD和一个或多个操作数OD等字段组成。,指令的表示形式,PC微机的多数指令有一个或两个操作数,当然也可以没有操作数,常见的表示形式如下: OP OP 操作数 OP 目的操作数 , 源操作数,示例:,单操作数指令只需指定一个操作数。例如将寄存器AX的内容加1后,其和回送到AX,指令的符号表示形式为: INC AX ; AX+1-AX 双操作数指令需要指定两个操作数.当源操作数和目的操作数进行运算后,多数指令将其结果回送到目的操作数的位置。例如寄存器BX与CX的内容相减后,其差送入BX的指令为: SUB BX,CX ; BX-CX-BX 没有操作数指令,即隐含操作数指令,是指在OD位置虽然未明确给出操作数,但在指令OP中隐含有事先安排的操作数。例如: CLC ; 0-CF,3.1.2 寻址方式,立即寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址,立即寻址(Immediate Addressing),立即寻址方式中,指令操作码和操作数都在存储器代码段中。 汇编格式:n(n为立即操作数,是用8位或16位二进制补码表示的有符号数) 功能:操作数存放在存储器,指令下一单元的内容为立即操作数n。 图形表示:,示例,MOV AX, 10 执行后(AX)=? 该例中源操作数为立即寻址方式,立即数为10,存放在指令的下一单元。 执行:10AX 执行后:(AX)=000AH 图形表示:,寄存器寻址(Register Addressing),寄存器寻址方式的操作数在指令指明的寄存器中。 功能:操作数直接存放在寄存器中。 图形表示:,寄存器寻址示例:,下列程序执行后,(AX)=?,(BX)=? MOV AX,1234H MOV BX,5678H ADD AX,BX 该程序中MOV指令为数据传送指令操作符,ADD指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令AX、BX皆为目的操作数地址,为寄存器寻址方式。第三条指令中,AX为目的操作数地址,BX为源操作数地址。源地址和目的地址皆为寄存器寻址方式。,执行: 1234HAX 5678HBX (AX)+(BX)AX 执行后:(AX)=68ACH,(BX)=5678H 图形表示:,寄存器寻址示例(续):,直接寻址(Direct Addressing),指令操作码OP后直接给出操作数的16位偏移地址EA。OP与直接地址在代码段,操作数据一般在数据段。 功能:指令下一字单元的内容是操作数的偏移地址EA。 PA=DS*16+NN 图形表示:,直接寻址示例:,寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。 执行指令:MOV AX ,BUF 执行后:(AX)=? 执行:(32000H)AX 执行后:(AX)=4545H 图形表示:,寄存器间接寻址(Register Indirect Addressing),寄存器间接寻址方式中,寄存器R的内容为操作数的偏移地址EA,操作数在存储器中,即: EA=BX / BP / DI / SI 功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。 PA=DS*16+BX/SI/DI PA=SS*16+BP,【例】寄存器和存储器内容分别为:(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H 执行指令:MOV AX ,BP 执行后:(AX)=?,(BP)=?,(SS)=?,(20030H)=? 图形表示如右:,寄存器间接寻址示例:,寄存器相对寻址(Register Relative Addressing),寄存器相对寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。 汇编格式:XR(X表示位移量,是8位或16位二进制补码表示的有符号数) 功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。 PA=DS*16+BX/SI/DI+X PA=SS*16+BP+X 图形表示如下:,寄存器相对寻址图示:,寄存器相对寻址示例:,设执行前: (AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H 执行指令:ADD 6BX,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=? 图形表示如下:,执行:(20036H)+(AX) 20036H 执行后:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0090H。,寄存器相对寻址示例(续):,基址变址寻址(Based Indexed Addressing),基址变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容加上变址寄存器内容之和,操作数在存储器中。 汇编格式: BR + IR 功能:操作数存放在存储器,BR的内容加IR的内容是操作数的偏移地址EA。 PA=DS*16+BX+/SI/DI PA=SS*16+BP+SI/DI 图示如下:,基址变址寻址图示:,相对基址变址寻址(Relative Based Indexed Addressing),相对基址变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量三项之和,操作数在存储器中。 汇编格式:XBR+IR 功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。 PA=DS*16+BX+/SI/DI+X PA=SS*16+BP+SI/DI+X 图形表示:,相对基址变址寻址图示:,3.1.3数据寻址与数据结构的关系,多种寻址方式能方便、灵活的存取操作数, 支持高级语言的某些数据结构。 1.简单变量寻址 2.数组或表格数据的寻址 3.记录型数组的寻址,1.简单变量寻址,存取简单变量有时使用直接寻址方式如果变量有基本地址就将基本地址-BX / SI / DI, 则存取某个变量 EA = BX / SI / DI,2.数组或表格数据的寻址,表格数据的存取也可当作是数组的存取,均可用寄存器、寄存器相对、基址变址喝相对基址变址等寻址方式。 (1)存取基本数组:数组的基本地址-BX,某个元素到数组基本地址的距离-SI / DI, 则: EA = BX + SI / DI 或者位移量DISP=数组开始地址, BX / SI / DI =数组元素到数组开始地址的距离,则: EA = BX + BX / SI / DI + DISP,2.数组或表格数据的寻址(续),(2)对于赋值语句A(i) = B (j)应指出两个变址寄存器。如对应元素ai可使用DI; 对应元素bj用SI, 则两组元素的地址分别为: EA = SI + DISP EA = DI + DISP (3)存取二维数组A(i, j): 数组起始地址-BX, BX兼行元素相对数组起始地址变址,而列元素又相对行元素的变址量-SI / DI, 则存取某个元素应有: EA = BX + SI / BX + DI 若DISP = 数组元素的起始地址, BX = 行元素变址量, SI 或 DI = 列元素相对行元素的变址,则存取某个元素应有: EA = BX + SI / DI + DISP,3.记录型数组的寻址,数组和记录结合使用。 设雇员的记录有四个数据项(雇员、保险号、雇龄和工资),由多个雇员的记录组成一个数组,则任一雇员记录项地址的形式描述为 F=f(M, I, J) 其中,F为数组记录项的地址,M为数组的基本地址, I为数组的元素(记录), J为元素的数据项, f则表示记录型数组。 对此,存取任一记录中的数据项(如雇龄项)的操作数寻址对应描述为: 偏移地址 = f(基址,变址,位移),3.记录型数组的寻址(续),假定基址指针再BX,与数组元素相一致的变址值在SI,记录中项的位置用DISP表示,则 EA = BX + SI + DISP。 4.堆栈数据结构寻址 堆栈采用以BP为基址指针的寻址,方便数据结构相同而参数不同的数据存取。当存取堆栈中的简单变量时 EA = BP + DISP 若存取堆栈中的数据和记录,则 EA = BP +SI / DI + DISP,3.1.4程序转移寻址,寻址方式对多数指令而言,是要计算出操作数的地址,但是也由少数指令是为了形成程序转移的地址(如无条件转移指令JMP、调用指令CALL等)。 程序正常顺序执行时,每取出一条指令执行IP+n-IP,其中n为取出指令的字节数;然后形成下一条指令的地址: PA = CS * 24 + IP 但是如果程序发生转移时,需要计算出转移偏移地址EA并修改IP,有时还需要修改CS的值。这种情况操作的对象是一个地址,地址的内容是要取出的指令,而不是上述讲到的操作数,因此称之为程序转移寻址。,程序转移方式:,段内转移是指程序在同一段代码内,仅改变IP的值而不改变CS的值所发生的转移。 而段间转移是程序要从一个代码段转移到另一个代码段,则不仅改变IP的值,同时也要改变CS的值。 无论是段内还是段间发生的转移都有直接和间接的形式,因此程序转移有四种寻址。,段内转移图示,段内直接转移和间接转移寻址如下图:,1.段内直接寻址(Intrasegment Direct Addressing) 转移偏移地址EA是指令中8位或16位位移量(DISP8,16)与指令指针IP当前内容之和。即: EA = IP + DISP8,16 - IP 2.段内间接寻址(Intrasegment Indirect Addressing) 转移偏移地址 EA 如果指定的是16位的寄存器,则将寄存器的内容-IP。 如果指定的是存储器中的一个字,则将该存储单元的内容-IP。 (EA) - IP,段内转移过程,段间转移图示,程序段间的直接或间接转移如下图:,段间转移过程,1.段间直接寻址(Intersegment Direct Addressing) 转移偏移地址EA-IP 转移段地址-CS 2.段间间接寻址(Intersegment Indirect Addressing) (EA)-IP (EA+2)-CS,3.2实方式32位指令地址,实地址方式32位指令寻址,指在32位的PC机上使用16位的存储机制,执行32位的非保护方式及非虚拟方式的指令,达到直接存取32位寄存器和32位存储器操作数的目的。,3.2.1数据与地址类型,几个概念 位域:一个相邻的位系列,在该序列中每一个作为一个独立的单位处理,一个位域可以从任何字节的任何位置开始。 位串:相邻位的序列,可以从任何字节的任何位置开始。 串:字节、字、双字的序列。 实方式的近程指针:16位的段内偏移值。,3.2.2 32位的指令寻址方式,偏移地址EA EA=基址变址 比例因子位移量 基址寄存器可以是任意一个32位通用寄存器。 变址寄存器是指除了堆栈指针ESP以外的7个通用寄存器。 比例因子是1、2、4、8可以分别用于字节、字、双字、四字的变址。 常数位移量可以指8位或32位。,32位的寻址方式图示,如果使用ESPEBP为基址寄存器,则SS是默认的段寄存器,也可用CS、DS、ES、FS、GS来替换SS; 使用EAX、EBX、ECX、EDX、ESI、EDI为基址寄存器,则DS是默认的段寄存器,同样也能用CS、SS、ES、FS、GS来越段替换DS,32位的指令寻址方式示例:,MOV AX ,DS:BP MOV FS:EBP,ECX;DS、FS分别替换了缺省段SS,32位的指令寻址方式示例(续),为了取得指令代码,只能用CS;PUSH、POP等指令与堆栈有关,也只能用SS。此外,在指令代码32位的程序堆栈操作时,要确保ESP/SP的内容(地址)总是为4的倍数。 例如: PUSH 12345678H ;ESP/SP-4-ESP/SP,12345678-ESP/SP POP EAX ; (ESP/SP)-EAX, ESP/SP+4- ESP/SP,3.2.3 实地址32位指令寻址,32位的指令寻址包括数据寻址和程序转移寻址。一般寻址的基本概念与16位汇编寻址概念相似,特殊的寻址方式如上叙述。现介绍如下:,1、非存储器的数据寻址方式示例,(1)立即寻址 MOV EAX,19461201H; 19461201H-EAX 与16位寻址相似。 (2) 寄存器寻址 MOV EAX,ECX ;ECX-EAX 与16位寻址相似,2、存储器的数据寻址方式示例,(1)直接寻址 MOV EAX,4612H ;EA=4612,(EA)-EAX 与16位寻址相似。 (2)寄存器间接寻址 MOV ECX,EDX ;ECX间接指示存放操作数EA在EAX 中,EA=ECX,EDX-EA,与16位寻址相似。,存储器的数据寻址方式示例(续),(3)寄存器相对寻址 MOV ECX,EAX+24 ; EA=EAX,(EA)-ECX (4)基址变址寻址 MOV EAX ,EBX ESI ; EA=EBX+ESI,(EA)-EAX (5)相对基址变址寻址 SUB EAX,EBX+ESI+0FF0H ;EA=EBX+ESI+0FF0H,EAX-(EA)-EAX,存储器的数据寻址方式示例(续),(6)带比例因子的变址 MOV ECX,ESI*4 ;EA=ESI4,(EA)-ECX (7)基址与带比例因子的变址寻址 MOV ECX,EAXEDX*8 ;EA=EAX+EDX8,(EA)-ECX (8)基址与带位移量及比例因子的变址寻址 MOV EAX,LTABEDI*4EBP+80 ;EA=LTAB+EDI4+EBP+80,(EA)-EAX,3.程序转移寻址方式,有相对EIP的段内直接寻址,段内间接寻址、段间直接寻址和段间间接寻址。,4.前缀代码67H或66H,32位机汇编指令或有32位操作数的情形识别涉及指令机器码格式的有关前缀表示。这些在相应的汇编列表文件(*.LST)或DEBUG过程中可以看到,如前缀代码67H或66H。,(1)机器指令操作数长度属性前缀码66H,66|83 E0 0F AND EAX,0FH ;EAX0FH-EAX 66|8B CB MOV ECX,EAX,(2)机器指令寻址长度续性前缀,67|8B 1475 00000026 MOV DX,26HESI*2 67|66|8B 04B0 MOV EAX,EAX+ESI*4,3.3实方式指令系统,指令系统是一台机器所有指令的集合。 Pentium系列机指令系统庞大、类型多样,约有300多条指令,其中包括基本指令100多条。 具有支持多进程、多任务、虚拟存储器和多媒体等功能的32位指令。,3.3.1常用指令类型集,1.数据传送类指令 2.算术运算类指令 3.逻辑和移位操作类指令 4.串操作与重复前缀类指令 5.控制转移类指令 6.处理机控制类指令 7.其它指令,本讲义约定:,OPD表示目的操作数; OPS表示源操作数; (OPS)表示OPS的内容; (OPD)表示OPD的内容; -表示传送; R表示通用寄存器; Sr表示段寄存器; M表示主存储器; XXXX:XXXX 表示组合号, “:”表示其前后组成一个数; L表示操作数的长度; d表示立即数; B/W/D表示字节或字或双字。,3.3.2数据传送类指令,通用数据传送指令 堆栈操作指令 标志寄存器传送指令 地址传送指令 输入输出指令,通用数据传送指令,1.传送指令MOV 2.数据交换指令XCHG 3.查表转换指令 XLAT,语句格式:MOV OPD,OPS 功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)OPD。 下图描述了MOV指令在传送数据时允许传送的路径及类型。,1.传送指令MOV,注意:,(1) OPD,OPS的类型(8/16/32位)必须一致. (2) OPD不能使用立即数。 (3) 双操作数不能同时为内存中的数据。 (4) 段寄存器不能直接送立即数. (5) 指令执行后不影响FLAGS的标志位的状态. (6) 不能任意改变CS,示例:存储器与寄存器间数据传送。,MOV AX,BUF ;BUF是变量,源操作数为直接寻址 MOV BH,DI ;源操作数为寄存器间接寻址 MOV DI,ES:3SI ;源操作数为变址寻址,使用跨段前缀 MOV BP,3BX+SI ;源操作数为基址加变址寻址 MOV BUFA,DL ;BUFA是一字节变量 MOV BP,AX ;使用SS段寄存器 MOV DS:BP,DL ;使用跨段前缀 MOV BUF,DS ;BUF是个字变量 MOV ES ,BUF,2.数据交换指令XCHG,语句格式:XCHG OPD,OPS 功能:将源地址与目的地址中的内容互换。 即(OPD)OPS,(OPS)OPD。 寄存器与存储器之间数据交换。 MOVAX,5678H;(AX)=5678H MOVBX,0FFFFH;(BX)=0FFFFH XCHG AX,BX;(AX)=0FFFH, (BX)=5678H,MOVSX和MOVZX指令,格式:MOVSX OPD, OPS MOVZX OPD, OPS 它们将OPS的内容-OPD,但是对于OPD左边空缺的位,MOVSX全部用OPS的符号填充(作符号延伸), 可以对有符号的数进行符号扩展;而MOVZX是全部以零(0)填充,可对无符号数进行0扩展. 注意:OPD的位数比OPS的位数长,示例:,MOV CL, 88H MOVZX AX, CL ;AX = 0088H MOVSX BX, CL ;BX = FF88H 另外也可如下书写指令: MOVSX CX, BL MOVSX EAX, BUF MOVZX AX, CL MOVSX EBX, AL MOVZX ESI, BUF MOVZX EDX,DI,3.查表转换指令 XLA,语句格式:XLAT OPS或XLAT 功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即(BX+AL)AL。,堆栈操作指令,1.进栈指令PUSH 2.出栈指令POP 3.PUSHA/PUSHAD指令 4.POPA/POPAD指令,1进栈指令PUSH,语句格式: PUSH OPS ; W/D, R/Sr/M/d 功能:将寄存器、段寄存器、立即数或存储器中的一个字数据压入堆栈顶部,指令视操作数长度为字(2字节)或双字(4字节)和地址为16位/32位,先将SP/ESP - 2/4-SP/ESP,后将OPS-SP/ESP。,2出栈指令POP,语句格式: POP OPD ; W/D, R/Sr/M/d 功能: 视OPD长度为字或双字,先将当前SP/ESP指向的内容-OPD,后将SP/ESP+2/4-SP/ESP 。 从POP指令功能可看出,该指令为PUSH指令的逆过程,一般成对使用。,3.PUSHA/PUSHAD指令,格式: PUSHA ; 压入8个字通用寄存器. PUSHAD ; 压入8个双字通用寄存器.,4.POPA/POPAD指令,格式: POPA ;弹出到8个16位通用寄存器 POPAD ; 弹出到8个32位通用寄存器,标志寄存器传送指令,1.标志送AH指令LAHF 2.AH送标志指令SAHF 3.标志寄存器进栈指令PUSHF 4.标志寄存器出栈指令POPF,1标志送AH指令LAHF,语句格式:LAHF 功能:将标志寄存器的低8位送入AH寄存器。 即(FLAGS)7-0AH。该指令的执行对标志位无影响。 【例】标志寄存器传送。 执行前:(FLAGS)=0485H,(AX)=0FFFFH 执行指令:LAHF 执行后 : AH =85H,2AH送标志指令SAHF,语句格式:SAHF 功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)FLAGS7-0。 从该指令功能可看出,SAHF为LAHF的逆过程。,3标志寄存器进出栈指令PUSHF/POPF,语句格式: PUSHF 功能:将标志寄存器的内容压入堆栈。即(FLAGS)- 堆栈。 POPF 功能:将堆栈顶端的内容送到标志寄存器。即堆栈- (FLAGS )。,地址传送指令,1传送偏移地址指令 LEA 2传送偏移地址及数据段首址指令LDS 3传送偏移地址及附加数据段指令LES,1传送偏移地址指令 LEA,语句格式: LEA OPD,OPS ;OPS的EA-OPD ;OPD是16/32位的R,OPS是M 功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。 【例】主存偏移地址的获取。 MOV BX,0100H;(BX)=0100H MOV SI, 0210H;(SI) =0210H LEA BX,1234BX+SI; (BX)=1544H,2LDS/LES/LFS/LGS/LSS指令,语句格式: LDS/LES/LFS/LGS/LSS OPD,OPS ;EA = OPS 功能: 地址传送LDS等指令中,OPD为R(16位),OPS为M(32位).操作对FLAGS无影响,执行后结果为: (EA)-R ;全程指针的偏移地址 (EA+2)- LDS/LES/LFS/LGS/LSS ;全程指针的段地址,输入输出指令,1输入指令IN 2输出指令OUT,1输入指令IN,输入指令用来从指定的外设寄存器取信息送入累加器。它有四种形式: (1)语句格式:INAL,PORT 功能:(PORT)AL (2)语句格式:INAX,PORT 功能:(PORT)AX (3)语句格式:INAL,DX 功能:(DX)AL (4)语句格式:INAX,DX 功能:(DX)AX,2输出指令OUT,输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式: (1)语句格式:OUTPORT,AL 功能:(AL)PORT (2)语句格式:OUTPORT,AX 功能:(AX)PORT (3)语句格式:OUTDX,AL 功能:(AL)DX (4)语句格式:OUTDX,AX 功能:(AX)DX,3.3.3 位操作类指令,逻辑运算指令 1求反指令NOT 2逻辑乘指令AND 3测试指令TEST 4逻辑加指令OR 5按位加指令XOR,语句格式:NOT OPD 功能:将目的地址中的内容逐位取反后送入目的地址。 即(OPD)求反OPD 【例】逻辑非运算。 MOVAX,878AH;(AX)=878AH NOTAX ;(AX)=7875H,1求反指令NOT,语句格式:AND OPD, OPS 功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。 即(OPD)(OPS)OPD。 该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:11=1,10=0,01=0,00=0 【例】将AL中第3位和第7位清零。 MOVAL,0FFH ANDAL,77H,2逻辑乘指令AND,语句格式:TEST OPD,OPS 功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。 即(OPD)(OPS)。 【例】测试AX中的第12位是否为0,不为0则转L。 TEST AX,1000H JNE L,3测试指令TEST,语句格式:OR OPD,OPS 功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。 即(OPD)(OPS)OPD。 说明:逻辑加的运算法则为:11=1,10=1,01=1,00=0。 【例】将AL寄存器中第3位和第7位置1。 MOVAL,0 OR AL,88H,4逻辑加指令OR,语句格式: XOR OPD,OPS 功能:目的操作数与源操作数做按位加运算,结果送入目的地址。 即(OPD)(OPS) OPD。 说明:按位加的运算法则为;11=0,10=1,01=1,00=0。 【例】按位加运算。 MOVAL,45H;(AL)=45H XORAL,31H;(AL)=74H,5按位加指令XOR,移位指令,移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。这些指令均有统一的语句格式: SAL/SHL OPD, OPS ;左移 SAR OPD, OPS ;算术右移 SHR OPD, OPS ;逻辑右移 其中,OPD是8/16/32位的R/M;OPS是计数值(即移位次数),有三种情形:OPS即可是8位的立即数或CL的内容(移位前次数-CL)。 其功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。,语句格式:SAL OPD,1 或SHL OPD,1 SAL OPD,CL或SHL OPD,CL 功能:将(OPD)向左移动CL指定的次数,最低位补入相应的,的内容为最后移入位的值。,1算术左移和逻辑左移指令SAL(SHL),语句格式:SAR OPD,1或SAR OPD,CL CF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。,2算术右移指令SAR,MOVBH,0F4H;(BH)=0F4H MOVCL, 2;(CL)=2 SARBH, CL;(BH)=0FDH,(CF)=0 该例语句“SARBH,CL”实际上完成了(BH)BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。,【例】算术右移运算,语句格式:SHR OPD,1或SHR OPD,CL 功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的,CF的内容为最后移入位的值。,3逻辑右移指令SHR,语句格式:ROL OPD,1或ROL LPD,CL 功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。,4循环左移指令ROL,语句格式: ROR OPD,1或ROR OPD,CL 功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。 0 7 CF,5循环右移指令ROR,语句格式: RCL OPD, 1或RCL OPD,CL 功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。,6带进位的循环左移指令RCL,语句格式:RCR OPD,1或RCR OD,CL 功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。,7带进位的循环右移指令RCR,3.4 字符设备I/O功能调用,本节主要介绍DOS子程序调用方式、键盘输入、屏幕显示和打印机输出的DOS系统功能调用。,DOS子程序调用方式,调用之前:设置子程序的入口参数。 调用请求:执行“INT 21H”软中断指令调用。 调用之后:可能有出口参数,也可能无出口参数。如果有出口参数,可根据程序需要,判断本次调用是否成功或者分析执行情况。,1 从键盘输入一个字符AH=01H,从键盘读入一个字符,送到显示器输出,并将该字符的ASCII码值AL(出口参数);如果检测到读入的字符是CtrlBreak,则中止程序执行。例: MOV AH,H 键盘输入子程序,功能1-AH INT 21H DOS子程序调用,等待键入一个字符调用后,输入字符的ASCII码值-AL,2、显示输出一个字符AH=02H,将DL寄存器重的字符(ASCII码值)送到标准输出设备上输出。若检测到CtrlBreak间,则执行中断“INT 23H”中止程序的执行。例: MOV DL,AL ;AL内容是字符的ASCII码-DL MOV AH,2 ;功能号2-AH INT 21H ;调用显示一个字符,3.打印机输出一个字符AH=05H,将要打印的字符DL,然后调用就可以打印输出。如果有标准打印设备不输出,可在执行时用DOS命令键CtrlBreak进行帮助。例: MOV DL,AL ;AL的字符ASCII码-DL MOV AH,5 ;功能号5-AH INT 21H ;调用打印一个字符,4、直接控制台输入AH=07H,输入时不回显,例如,从键盘输入一个字符,在屏幕上不显示,出口参数AL键入的字符。可用来设置保密口令。例: PASSWORD DB 10DUP(0) . MOV CX,6 MOV SI,0 AGAIN: MOV AH,7 INT 21H MOV PASSWORDSI,AL MOV DL,* MOV AH,2 INT 21H INC SI LOOP AGAIN,5、显示输出字符串AH=09H,例:执行下语句后屏幕显示输出“WELCOME!” STRING DB WELCOME!,13,10,$ MOV AX,SEG STRING MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H,6、缓冲区键盘输入AH=0AH,如果需要键入最大的字符数位N,则由“DS:DX”指向的缓冲区可分为3个字段。 第一个字段:定义缓冲区可存放的字符数N+1,使机器自动控制检查,若键入实际的字符数个数超过N,则响铃报警。 第二个字段:定义缓冲区,当键盘输入调用退出后,系统自动计数并存放实际输入的字符。 第三个字段:定义可存放字符的缓冲区,调用退出后,存放实际输入的字符,最后一个字节总是回车符。,0AH调用示例,例:编写在实地址方式(.586与USE16)下,定义一个能最多可输入20个字符到BUF缓冲区的程序。 .586 STACK SEGMENT USE16 ;定义16位段 DB 256 DUP(0) STACK ENDS DATAS SEGMENT USE16 N EQU 20 BUF DB N+1 ;定义第一个字段,BUF位21 COUNT DB 0 ;定义第二个字段 CHAR DB N+1 DUP(0) ;定义第三个字段 PROMPT DB Please input:,13,10, $ DATAS ENDS,0AH调用示例(续),CODES SEGMENT USE16 ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,prompt ;取prompt的偏移地址dx MOV AH,9 INT 21H LEA DX,BUF ;取BUF的偏移地址dx MOV AH,0AH INT 21H MOV AH,4CH INT 21H CODES ENDS END START,7、返回DOS调用AH=4CH,功能:返回DOS 入口参数:AH=4CH,AL=返回码 出口参数:,
展开阅读全文