汇编语言与接口技术(第三章).ppt
汇编语言与接口技术,主讲教师张玉琢,学习要点正确定义各种符号,熟练使用地址表达式熟练掌握汇编语言的常用指令掌握符号指令的寻址方式汇编语言的格式,第三章 汇编语言与汇编程序,第三章 汇编语言与汇编程序,3.2,3.3,符号指令中的表达式,符号指令的寻址方式,常用指令,3.4,伪指令,3.1,3.5,常用系统功能调用和 BIOS,如:0FFH 数据 FFH 符号,符号,汇编中的各种符号由伪指令定义,有常量、变量和标号三类,.1 符号指令中的表达式,1、常量 在汇编时已有确定数值的量,ASCII码字符做数值常量时,需加单引号,.1.1 常量和数值表达式,(1)数值常量,例:AA EQU 10 CC=66 MOV AX,AA;AX=10 MOV AX,CC;AX=66,注:汇编程序不给符号常量分配存储单元,(2)符号常量,2、数值表达式由常量与运算符组成的有意义的式子,结果为数值,在汇编中允许对常量进行三种类型的运算:(1)算术运算 包括,/,MOD(求余)(2)逻辑运算 包括AND,OR,XOR,NOT(3)关系运算 包括:EQ(),NE(),LT(),GT(),LE(),GE(),代表存储器的地址 变量是存储器中的数据或数据区的符号表示变量名是数据的地址或数据区的首地址地址表达式由变量、常量、寄存器(SI、DI、BX、BP,寄存器必须位于 中)和运算符组成,.1.2 变量和地址表达式,如:SEG W;取变量W的段地址,如:OFFSET W;取变量W的偏移地址,1、存储器分段,变量和地址表达式有三重属性,变量的类型有:字节(byte),字(word),双字(dword),四字(qword),十字节(tbyte),一个数据分别占1,2,4,8,10个单元,格式:变量名 DB 表达式,;定义字节变量变量名 DW 表达式,;定义字变量变量名 DD 表达式,;定义双字变量,2、变量的定义,数据定义伪指令指明了变量的类型表达式确定了变量的初值,(1)常量或数值表达式存入数值(2)ASCII字符串(若串长 2,只能用DB定义)存入ASCII码值(3)重复子句,格式:N DUP(表达式)重复N次(N1的正整数),其值由表达式确定(4)地址表达式可用DW或DD定义,当地址表达式为变量或标号名时,若用DW则取它的偏移地址来初始化变量;若用DD则取其偏移地址和段地址来初始化其变量(5)由以上表达式组成的序列,之间用,分隔,表达式可以有以下几种形式:,数据段DATA1定义的变量W1 DW B3B1 DB AB$W2 DW 5,1994HB2 DB 4 DUP(?)D DD EBB3 DB 2 DUP(-1)DB 1 DUP(10,E);重复因子1不能省 DB 13,1,3在附加数据段DATA2中定义的变量如下:EB DB 8 DUP(0)EW DW AB,CD;用DW定义变量时,字符串长 度不超过2个字符,P44 例 画出数据的存储形式,8,0,1、标号的三个属性(1)段地址定义该标号所在段的段首址(2)偏移地址标号所在段的段首址到该标号定义指令的字节距离(3)类型两种:NEAR段内调用,FAR段间调用,标号指令地址的符号表示,也可以是过程名,.1.3 标号,(1)书写在指令助记符前,用:定义,只能为NEAR类型,(2)用PROCENDP伪指令定义过程名,例:CYCLE:MOV AL,SI;定义近标 号CYCLE近标号只能在段内使用!,例:ABC PROC FAR;定义过程名ABC为远标号 ABC ENDP,2、标号的定义,变量、标号以及由其组成的地址表达式均有类型属性。在编程时往往需要临时改变原定义的变量或标号的类型属性,而仍保持它们原来的段地址和偏移地址属性不变 格式:类型 PTR 地址表达式,.1.4 变量和标号类型的变更,例1:B1 DB AB$;定义变量B1为字节类型 WORD PTR B1;临时改变B1的类型为字变量例2:BYTE PTR BX+5;明确地址表达式BX+5的类型为字节例3:A DW 1122H,3344H;变量A为字类型 MOV AX,A MOV AL,BYTE PTR A,第三章 汇编语言与汇编程序,.1,.3,符号指令中的表达式,符号指令的寻址方式,常用指令,.4,伪指令,.2,.5,常用系统功能调用和 BIOS,汇编语言的指令格式:标号:操作码 目的操作数,源操作数;注释 1标号:表示一条指令的符号地址2操作码 规定操作的性质,表示指令所要执行的操作3操作数 表示指令执行过程中操作的对象(操作数/地址码),提供操作数的地址或操作数本身,即从何处获得操作数以及运算结果存在何处寻址方式。分为:立即寻址、寄存器寻址、存储器寻址。4注释 用于解释程序使之便于阅读的任何说明文字。,3.2 符号指令中的寻址方式,因为寄存器在CPU内部,所以采用寄存器寻址可提高运行效率,特别是AX,用它存放运算结果,则执行指令的时间短些,所以最常用,.2.1 寄存器寻址,例:AX=2035H,BX=0178H MOV BX,AX;BX=AX=2035H ADD AL,BL;AL=ADH,BL=78H,AX,BX,CX,DX,SI,DI,BP,SP16位通用寄存器AH,AL,BH,BL,CH,CL,DH,DL8位通用寄存器,立即寻址方式只能用于源操作数,主要用来给寄存器或存储器赋初值,也可以与寄存器或存储器操作数进行算术逻辑运算 例:MOV 5,AL,.2.2 立即寻址,例:MOV AL,5;将字节05H送AL,AL=05H MOV AX,18;将字0012H送AX,AX=0012H MOV BL,1;将字节FFH送BL,BL=0FFH,.2.3 直接寻址,注:段地址默认在DS段 例:MOV AX,W 该指令的源操作数地址为 DS:OFFSET W,直接寻址常用已定义的变量表示 例:W2 DW 5,1994H B1 DB AB$MOV AX,W2;AX=FFFBH MOV BX,W22;BX1994H MOV B1+3,AL;(B1+3)=FBH区分立即寻址与直接寻址 从变量中取数据属于直接寻址方式,注意与符号常量区别 例:AA EQU 10 MOV AX,AA;立即寻址,AX=000AH MOV AX,W2;直接寻址,AX=FFFBH,如:MOV CX,BX 如右图所示,若BX=0124H,则该指令执行的操作是将 0124H作为操作数的偏移地址,将当前数据段中0124H单元中的字 取出送CX,即CX=1958H,操作数为带方括号的寄存器(SI,DI,BX,BP),寄存器的内容为操作数据的偏移地址,.2.4 间接寻址,注:寄存器寻址中,寄存器内容即为操作数据;间接寻址属于存储器寻址,寄存器内容为操作数据的偏移地址。只有SI,DI,BX,BP 可用于间接寻址 例:MOV AX,CX 若以SI,DI,BX 间址,约定段的段地址为DS寄存器 例:MOV AX,BX;(DS:BX)AX 若以BP间址,约定段的段地址为SS寄存器 例:MOV AX,BP;(SS:BP)AL,(SS:BP+1)AH,.2.4 间接寻址,操作数据在存储器中,其偏移地址为基址寄存器BX或BP的内容与位移量之和 EA=BX/BP+位移量 例1:MOV BX+BUF+2,AL 或 MOV BUFBX+2,AL;AL(DS:BX+BUF+2)例2:MOV 6BP,AX 或 MOV BP+6,AX;AL SS:BP+6,AH SS:BP+7,3.2.5 基址寻址,3.2.6 变址寻址,操作数据在存储器中,其偏移地址为变址寄存器SI或DI的内容与位移量之和,与基址寻址类似 EA=SI/DI+位移量 例:MOV AX,2SI 或MOV AX,SI+2;(DS:SI+2)AL,(DS:SI+3)AH,3.2.7 基址变址寻址,EA=BX/BP+SI/DI+位移量例:MOV AX,4BX+DI 或MOV AX,BX+DI+4;(DS:BX+DI+4)AL;(DS:BX+DI+5)AH 段地址由基址寄存器确定:以BX为基址寻址,操作数在DS段 以BP为基址寻址,操作数在SS段,操作数据在存储器中,其偏移地址为指令中指定的基址寄存器和变址寄存器的内容及位移量3项之和,例:W为一字变量,B为一字节变量,则:MOV AL,WBX MOV AL,BYTE PTR WBX MOV AX,BSI+5 MOV AX,WORD PTR BSI+5,变量名意义是取变量单元中的数据,所以其类型要与另一操作数的类型一致,在符号指令中的基址,变址,基址变址三种寻址中,其位移量可以是常数或符号常量,还可以是变量名。若是变量名,它给出变量所在段的偏移地址 例:将立即数35H存入字节变量BUF+5单元中 MOV BX,OFFSET BUF+5 MOV BYTE PTRBX,35H;间接寻址 或:MOV BX,5 MOV BUFBX,35H;基址寻址,常以间址、基址、变址访问一片连续的单元 例:B1 DB AB$MOV BX,OFFSET B1;BX0000H MOV AL,BX;AL41H MOV AL,BX1;AL42H,寻址方式小结,寻址方式可分为三大类:立即寻址、寄存器寻址、存储器寻址。直接寻址、间接寻址、基址寻址、变址寻址、基址变址寻址都属于存储器寻址。立即寻址的操作数为立即数;寄存器寻址的操作数为寄存器;存储器寻址的操作数为地址表达式。地址表达式通式为:变量+寄存器+常量 也可表示为:变量寄存器+常量,此种形式理解为,寄存器+常量是变量定义的数据区的位移量。,寻址方式小结,如果地址表达式中只出现寄存器,则一定要加;如果地址表达式中没有寄存器,则可加,也可不加如果地址表达式中只有寄存器,则为间接寻址;如果地址表达式中只有变量,则为直接寻址;如果地址表达式中除有寄存器外还有变量或者常量,则为基址寻址或变址寻址。,存储器存取方式 约定段 段更换 偏移地址,1.存储器寻址时段寄存器的基本约定和段更换见下表所示:(P50表21),取指令 CS 不允许 IP堆栈操作(PUSH,POP,CALL,RET等)SS 不允许 SP数据存取(BP间址、基址除外)DS CS SS ES EABP间址,基址数据存取 SS CS,DS,ES EA字符串处理指令的源串 DS CS,SS,ES SI字符串处理指令的目的串 ES 不允许 DI,3.2.8 存储器寻址中段地址的确定,例:MOV ES:DI,AL;AL ES:DI MOV ES:2000H,AL;AL ES:2000H 其中,ES为前缀字节,当要否认以上默认状态,到其他段寻找操作数时,必须用跨段前缀指明操作数所在段的段寄存器名,2.段超越或段更换,段更换只是用来临时改变变量、标号、地址表达式的段属性,且只在所出现的语句中有效,不改变偏移地址和类型,第三章 汇编语言与汇编程序,3.1,符号指令中的表达式,符号指令的寻址方式,常用指令,3.2,伪指令,3.3,3.4,3.5,常用系统功能调用和 BIOS,数据传送指令 加减运算指令 位操作(逻辑运算)指令 注:学习时注意指令格式及功能,3.3 常用指令,1.数据传送指令 格式:MOV dest,source 目的操作数 源操作数 功能:将一个字节或一个字操作数据从源传送至目的地址中,源保持不变,3.3.1 数据传送类指令,指令特点:将数据从一个部位传送到另一部位.不影响数据的状态标志位.,MOV指令的9种形式:,MOV REG,REGMOV REG,IMMMOV MEM,IMM MOV MEM,REGMOV REG,MEMMOV SEGREG,REG;CS除外MOV REG,SEGREGMOV SEGREG,MEM;CS除外MOV MEM,SEGREG,一个指令中,两操作数类型必须一致至少1个操作数的类型要明确,不能出现二义性代码段寄存器CS和立即数均不能作为目的操作数源操作数和目的操作数不能同时为存储器操作数 存储器类型由地址表达式的变量名确定立即数的类型属性不明确(字、字节).在立即数送存储器的指令中,若存储器操作数的类型不明确,则必需使用算符来明确其中一个操作数的属性,注意:,格式:XCHG dest,source 功能:将源地址与目的地址中的内容互换 XCHG REG,REG XCHG REG,MEM XCHG MEM,REG,2.数据交换指令,例:数据段中有两个字变量W1和W2,编写程序段将两个字变量互换 W1 DW 1234H W2 DW 5678H用数据交换指令实现:MOV AX,W1;AX=1234H XCHG AX,W2;AX=5678H,W2=1234H MOV W1,AX;W1=5678H仅用MOV指令实现:MOV AX,W1 MOV BX,W2 MOV W1,BX MOV W2,AX,用堆栈操作指令:PUSH W1PUSH W2POP W1POP W2,练习:写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。要求使用以下几种寻址方式:寄存器间接寻址基址寻址基址变址寻址,加减运算的操作数:,注:两操作数需类型相同,不能同为存储器加减法指令执行后的结果将影响状态标志Flag,3.3.2 加减运算指令,1.加法类指令,格式:ADD dest,source操作:source+dest dest 即将源操作数据与目的操作数据相加,结果存入目的地址中,源地址内容不变,(2)加进位的加法指令ADC,格式:ADC dest,source操作:dest+source+CFdest;CF为前面指令产生的CF,例 3个32位无符号数12345678H、8765ABCDH和2468FEDCH相加,其和(仍为32位无符号数)放DX和AX中,程序段如下:MOV DX,1234H MOV AX,5678H ADD AX,0ABCDH ADC DX,8765H ADD AX,0FEDCH ADC DX,2468H,格式:INC dest 操作:dest+1dest 例:MOV BX,1 INC BX;BX=0002H该指令不影响CF,对其它标志位的影响同ADD单操作数指令,只能为REG,MEM,类型要明确,不能出现二义性例:INC CL INC SI INC BYTE PTRSI INC 2000H 该指令常用于修改偏移地址和计数次数,(3)增量指令INC,例:有两个无符号字数组,每个数组20个字,分别放在8000H和9000H开始的存储单元中,要求进行数组对应字单元相加运算,得到的和放在8000H开始的内存单元中,然后将AX清0 MOV SI,8000H MOV DI,9000H MOV CX,20 LP1:MOV AX,SI ADD AX,DI MOV SI,AX INC SI INC SI INC DI INC DI DEC CX JNZ LP1;转移指令,结果不为0则转到LP1,否则转到下一条指令 MOV AX,0,格式:DEC dest 操作:dest1dest,(1)减法指令SUB,2.减法类指令,格式:SUB dest,source操作:dest source dest,(2)带借位减指令SBB,格式:SBB dest,source操作:dest source CF dest;CF为前面指令产生的进位(借位),(3)减量指令DEC,例:2个32位无符号数8765ABCDH 和2468FEDCH相减,其差送DX和AX。程序段如下:,MOV AX,0ABCDH SUB AX,0FEDCH;CF=1 8765 ABCD MOV DX,8765H 2468 FEDC SBB DX,2468H;CF=0 62FC ACF1注:减法类指令对标志位的影响,除将进位改为借位外,与加法类指令相同DEC不影响CF,其余标志均受影响,3.比较指令CMP 格式:CMP dest,source 操作:dest source 执行减操作,只影响标志,不改变操作数 主要用来判断两数的大小是否相等 后面常跟条件转移指令,根据比较结果实现程序的分支,例:在自BLOCK开始的内存缓冲区中,有100个带符号数,要找出其中的最大值,把它存放到MAX单元中。,MOV BX,OFFSET BLOCK MOV AX,BX INC BX INC BX MOV CX,99 AGAIN:CMP AX,BX JG NEXT MOV AX,BX NEXT:INC BX INC BX DEC CX JNZ AGAIN MOV MAX,AX HLT,格式:NEG dest操作:将操作数地址中的内容求补后再送入操作数地址中该指令是求补操作,而不是求补码操作单操作数指令,操作数只能是REG,MEM影响标志,影响规律同减法指令,3.3.3 位操作指令,1.逻辑运算指令,(1)求补指令,若将执行求补指令前后的数均视为补码数,则求补指令将该数变为绝对值相等符号相反的另一个数。例:MOV AX,0FFFBH;AX=FFFBH NEG AX;AX=0005H 例:MOV BX,000AH;BX=000AH NEG BX;BX=FFF6H,格式:NOT dest操作:将操作数地址中的内容逐位取反后再送回操作数地址中注:该指令只是执行求反操作,而不是求反码指令,对符号位也求反 该指令不影响标志位,(2)求反指令NOT,格式:AND dest,source操作:destsourcedest作用:取出目的操作数中与源操作数的“1”对应的位例:MOV AX,0F6E5H AND AX,000FH;AX=0005H,(3)逻辑与指令AND,格式:OR dest,source 操作:dest sourcedest 作用:将目的操作数和源操作数中的所有“1”位拼合在一起 例:MOV BX,7B00H OR BX,0056H;,BX=7B56H 对应“1”位置1,对应“0”位则不变,(4)逻辑或指令OR,格式:XOR dest,source 操作:dest sourcedest,作用:将REG清0,也可将目的操作数中的某些位取反 例:MOV CX,35EBH XOR CX,CX;CX=0000H思考:用什么方法可以实现对通用寄存器清0?,XOR AX,AX MOV AX,0 SUB AX,AX AND AX,0,(5)逻辑异或指令XOR,注:AND、OR、XOR指令均为双操作数指令,对源操作数和目的操作数的要求同加减指令 AND、OR、XOR三条逻辑指令均将标志位CF和OF清0,对PF、SF、ZF的影响同加操作此类指令常用于拆字、拼字,例:将AX的高4位,CX的中间8位,BX的低4位拼合起来,结果放CX中,程序段如下:如:AX=1234H,BX=5678H,CX=9ABCHCX=1AB8H AND AH,0F0H;取AX高4位,AH=10H AND BL,0FH;取BX低4位,BL=08H AND CX,0FF0H;取CX中间8位,CX=0AB0H OR CH,AH;拼字 CH=1AH OR CL,BL;CL=0B8H CX=1AB8H,目的操作数可以是8位或16位的REG或MEM源操作数为移位的次数,只能是CL或1以CL为源操作数的移位指令执行以后,CL 的值不变,2.移位指令,移位指令为双操作数指令,用于将目的操作数中的8位或16位二进制数移位,格式:SHR dest,source操作:;最后移出位移至CF 用0填补已空出的位 例:AL=abcdefgh,CL=3 SHR AL,1;执行后,AL=0abcdefg,CF=h 例:AL=abcdefgh,CL=3 SHR AL,CL;执行后,AL=000abcde,CF=f,(1)逻辑右移SHR,格式:SAR dest,source操作:;最后移出位移至CF,最高位向右移动同时 保持不变例:AL=abcdefgh SAR AL,1;执行后,AL=aabcdefg,CF=h,(2)算术右移SAR,注:逻辑右移SHR一位,等于对无符号数除以2运算 例:MOV AL,0CH;AL=12 SHR AL,1;AL=6算术右移SAR一位,等于对符号数除以2运算 例:MOV CH,80H;CH=80H128 SAR CH,1;CH=C0H64,格式:RCR dest,source操作:;前面指令产生的CF 移至最高位 例:AL=abcdefgh,CF=i,CL=4 RCR AL,CL 执行后,AL=fghiabcd,CF=e,带进位循环右移RCR,例1 编写程序段实现将字变量W中的无符号数除以8,商和余数分别放入字变量QUOT和字节变量REMA中思路:用逻辑右移1位的指令,将被除数按低位到高位的顺序1次移1位.每次移入CF中的余数,用带进位的循环右移指令移入字节变量REMA中.3位余数都移入字节变量REMA中后再用逻辑右移指令右移5位将3位余数从D7D5移至D2D0.,指令应用举例,W DW 65525QUOT DW 0REMA DB 0MOV AX,W;AX=1111 1111 1111 0101BSHR AX,1;AX=0111 1111 1111 1010B,CF=1RCR REMA,1;REMA=1000 0000BSHR AX,1;AX=0011 1111 1111 1101B,CF=0RCR REMA,1;REMA=0100 0000BSHR AX,1;AX=0001 1111 1111 1110B,CF=1RCR REMA,1;REMA=1010 0000BMOV QUOT,AX;QUOT=0001 1111 1111 1110BMOV CL,5SHR REMA,CL;REMA=0000 0101B,格式:SHL dest,source SAL dest,source操作:;最后移出位移至CF 用0填补已空出位 例:AL=abcdefgh SHL AL,1;执行后,AL=bcdefgh0,CF=a,(4)算术/逻辑左移SAL/SHL,格式:RCL dest,source操作:;前面指令产生的CF 移至最低位 例:AL=abcdefgh,CF=i RCL AL,1 执行后,AL=bcdefghi,CF=a,(5)带进位循环左移RCL,格式:ROR dest,source操作:;右边移出位移入CF,同时移入左边空出位例:AL=abcdefgh ROR AL,1 执行后,AL=habcdefg,CF=h,(6)循环右移ROR,格式:ROL dest,source操作:;左边移出位移入CF,同时移入右边空出位例:将相邻字节变量B1(低地址)和B2中的两个8位二进制数交换 MOV CL,8 ROL WORD PTR B1,CL,(7)循环左移ROL,思路:(W)10=(W)(23+2)=(W)23+(W)2 16位无符号数乘以2和乘以8分别用左移1位和左移3位实现 16位无符号乘以2有可能大于16位无符号数的最大值65535,因此要将它扩展为32位的无符号数再乘以2,即用逻辑左移双字来实现乘以2的操作,例2 编写程序段将字变量W中的无符号数乘以10,积放字变量J2中,指令应用举例,WDW 65525J2 DW 0,0MOV AX,WXOR DX,DX;DX清0,将16位无符号数扩展为32位SHL AX,1;乘以2RCL DX,1MOV J2+2,DX;保存乘以2的结果MOV J2,AXSHL,AX,1;W中的内容乘以4RCL DX,1SHL AX,1;W中的内容乘以8RCL DX,1ADD J2,AX;2(W)+8(W)ADC J2+2,DX,例3 字变量NUMW中有一无符号数,编写程序,计算(NUMW)16+30并将结果送入NUMW+2和NUMW NUMW DW 1234H,0MOV CL,4 ROL NUMW,CL;将NUMW字单元中的1234H变成2341HMOV AX,000FH AND AX,NUMW;取低位字的最低4位 AX=0001HAND NUMW,0FFF0H;清低位字的最低4位(NUMW)=2340HADD NUMW,30;低位字加30 ADC AX,0;将低位字加30的进位(若产生)加入高位字 MOV NUMW+2,AX,例4 将AX中小于256大于0的3位BCD数转换为二进制数,存入字节变量SB中 思路:用(百位10+十位)10+个位的方法将BCD数转换为二进制数 如将BCD数255H转换为二进制数11111111B,运算的过程为:,SB DB 0MOV CL,2SHL AH,1;百位2MOV SB,AH;暂存2 百位SHL AH,CL;百位再乘以4得23 百位ADD AH,SB;23 百位+2 百位得10 百位 MOV SB,AL;暂存十位和个位SHR AL,CL;取十位SHR AL,CLADD AH,AL;10 百位+十位MOV AL,SB;十位和个位送ALSHL AH,1;(10百位+十位)10MOV SB,AH SHL AH,CLADD SB,AH;23(10百位+十位)+2(10百位+十位)AND AL,0FH;取个位ADD SB,AL;加上个位,第三章 汇编语言与汇编程序,.1,.3,符号指令中的表达式,符号指令的寻址方式,常用指令,.2,伪指令,.4,.5,常用系统功能调用和 BIOS,参见教材P66 一般程序由三个段组成.教材中程序的小写字母部分均为程序结构,.4.7 宏汇编源程序的一般格式,stack segment stack stack;定义堆栈段及堆栈长度dw 32 dup(0)stack endsdata segment;定义数据段:data endscode segment;定义代码段begin proc far;将汇编源程序视为DOS下的子程序 assume cs:code,ss:stack,ds:data push ds;PSP的段地址(段地址在DS中)进栈 sub ax,ax push ax;PSP首地址的偏移地址进栈 mov ax,data;设置用户数据段 mov ds,ax ret;PSP的首地址出栈送IP和CS begin endpcode ends end begin,格式:过程名 PROCNEAR或FAR:过程名 ENDP注:PROC和ENDP必须成对出现PROC和ENDP前的过程名必须有且相同过程的类型由PROC的操作数确定,默认为NEAR类型由过程定义伪指令定义的子程序,通过CALL指令调用PROC和ENDP之间至少有一条子程序返回指令RET,以返回调用它的程序,.4 伪指令,.4.1 过程的定义,格式:段名 SEGMENT 定位方式组合方式类别名 段名 ENDSSEGMENT和ENDS必须成对出现,且前面的“段名”相同三个可选项主要用于多模块化程序设计,以告诉LINK程序各模块间的通信方式和各段间的组合方式,从而把各模块正确地连接在一起段名用来表示段地址,.4.2 段的定义,组合方式提供本段同其他段的组合关系(1)NONE无组合方式 系统隐含的组合方式.表示本段与其他段逻辑上不发生关连(2)STACK 将本段与其他模块中所有STACK组合方式的同名段组合成一个堆栈段 一个程序的所有模块中至少有一个STACK段类别名是用单引号括起来的字符串,连接时将同类别名的所有段(段名可以不同)存放在连续的存储区 典型的类别名有:DATA,CODE,STACK,定位方式表明如何将经组合后的段定位到存储器中,(1)PARA(节),隐含的定位方式.规定段的起始地址总是16的整数倍,即段首址低四位为零,(2)WORD(字),段从偶地址开始,段间可能留1个字节间隙,(3)Byte(字节),本段可从任何地址开始,段间不留空隙,(4)Page(页),段的起始地址总是256的整数倍,即低8位为零,用$表示,记录正在被汇编程序翻译的指令的地址例:DATA SEGMENT;段定义 BUF DB 0123456789ABCDEF COUNT EQU$BUF;定义常量COUNT=16 DATA ENDS$的值由ORG设置,格式为:ORG 数值表达式;$=数值表达式的值,.4.3 汇编地址计数器,源程序在代码段的开始需要对段寄存器与段之间的关系作假定,以便汇编程序根据给定的偏移地址和段寄存器计算出正确的物理地址 格式:ASSUME 段寄存器:段名,段寄存器:段名,注:ASSUME只是告诉汇编程序段寄存器与段间的对应关系,并没有将段首址置入对应的段寄存器中。程序最后运行时,CS和SS的内容由系统自动设置,但DS和ES必须由程序将其段首址分别置入,.4.4 段寄存器的假定,格式:END 表达式功能:源程序的最后一个语句,标志整个源程序结束,即告诉汇编程序,汇编到此结束表达式为可选项,必须是存储器地址,即程序的启动地址,常为过程名不带表达式,则该程序不能单独运行,只是供其他程序调用的子模块,.4.5 源程序的结束,第三章 汇编语言与汇编程序,.1,.3,符号指令中的表达式,符号指令的寻址方式,常用指令,.2,伪指令,.4,常用系统功能调用和 BIOS,.5,IBM PC微机系统为汇编用户提供了两个程序接口,一个是DOS系统功能调用,另一个是ROM中的BIOS(Basic Input/OutpuT System)。它们由一系列中断服务子程序构成,由软中断指令 INT N 来调用,通过中断返回指令IRET返回,.5 常用系统功能调用和BIOS,1、调用的一般过程:,.5.1 系统功能调用,调用格式:MOV AH,1 INT 21H 入口:无入口参数 出口:键入字符ASCII码值在AL中,回显,2、常用功能调用 参见P76 表示23,(1)1号功能调用键入并显示一个字符,例1:设计一程序段,从键盘读入两个1位的十进制数,将它们相加后把结果存入AL中。,MOV AH,01 INT 21h;从键盘读入第一个数的ASCII码,存入AL。SUB AL,30h MOV BL,AL;将ASCII码转换为十进制数转存入BL,MOV AH,01 INT 21H;从键盘读入第二个数的ASCII码,存入AL。SUB AL,30H;;将第2个数转换为十进制数,存入AL ADD AL,BL,调用格式:MOV DL,待显示字符的ASCII MOV AH,2 INT 21H 入口:输出字符的ASCII 送 DL 出口:无出口参数例:显示字符 B MOV AH,2 MOV DL,B INT 21H,(2)2号功能调用显示器显示一个字符,例2:从键盘输入一个字符,并同时在显示屏上输出,当键入字符$时,则停止操作。DON1:MOV AH,O1H;置单字符输入 INT 21H CMP AL,$;是结束字符吗 JZ DON2;是,转向DON2 MOV DL,AL MOV AH,02H;显示输出字符 INT 21H JMP DON1DON2:INT 20H;程序结束,调用格式:MOV DX,待显示字符串的首偏移地址 MOV AH,9 INT 21H 入口:DS:DX置字符串首地址,字符串以结束 出口:无出口参数,(3)9号功能调用显示器显示字符串,例:显示 AZ 26个字符方法一:用2号功能调用,单个字符依次输出方法二:定义一个存储区,存放26个字符,并以$结束,用9号功能调用输出字符串OBUF DB ABCDXYZ$MOV DX,OFFSET OBUFMOV AH,9INT 21H,调用格式:MOV DX,数据区的首偏移地址 MOV AH,10 INT 21H 变量数据区IBUF应在DS数据段中事先定义,其定义格式为:IBUF DB 数据区大小,0,数据区大小 DUP(0),(4)10号功能调用键入字符串,存放字符串数据区的首地址在DS:DX中 数据区大小是一无符号数,可以为0255 第1个字节指出数据区能容纳的最大字节数(1255),包含回车 第2个字节存放实际键入的字符数(0254,不包含回车),由系统自动填入 第3个字节开始存放键入字符的ASCII,例:IBUF DB 10,0,10 DUP(0)MOV DX,0FFSET IBUF MOV AH,10 INT 21H,等待输入字符,数据区最大长度,实际输入个数,存放输入的字符和回车符,调用格式:MOV AH,11 INT 21H 入口:无入口参数 出口:有键入AL=0FFH,无键入AL=0,(5)11号功能调用检测键盘有无键入,注意:1.汇编中的“回车”操作仅将光标移至本行行首,故一般在10号功能调用后要输出一个换行0AH,将光标移至下一行的行首2.2号、9号、10号功能调用均会破坏AL中的内容,故为了防止AL中内容被破坏,在调用前应先保护AL,调用后再恢复,stack segment stack stack dw 32 dup(0)stack endsdata segment OBF DB wish you success!data ends,例1 编写汇编语言源程序,在显示器上显示wish you success!。(P77),思路:将欲显示字符串的ASCII码存放到字节变量数据区中,用9号功能调用显示,.5.2 常用系统功能调用应用举例,code segementstart proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV DX,OFFSET OBF MOV AH,9 INT 21H retstart endpcode ends end start,stack segment stack stack dw 32 dup(0)stack endsdata segment OBUF DB,0DH,0AH,IBUF DB 0FFH,0,0FFH DUP(0)data ends,如输入:ABCDE内存分配如右图:,例2.7“镜子”程序从键盘输入一串字符,在下一行照原样显示(P79)。,code segment begin proc far assume cs:code,ss:stack,ds:data push ds;sub ax,ax push ax mov ax,data;设置用户数据段 mov ds,ax,PSP首址、偏移地址进栈,MOV DX,OFFSET IBUFMOV AH,10INT 21HMOV BL,IBUF+1 MOV BH,0MOV IBUFBX+2,;串尾存MOV DL,0AH MOV AH,2INT 21H,MOV DX,OFFSET OBUFMOV AH,9 INT 21H,MOV DX,OFFSET IBUF+2 MOV AH,9 INT 21H ret;PSP首址出栈CS:IP begin endp code ends;结束用户程序 end begin,显示键入的串,IBUF DB 5,0,5 DUP(0)SW DW 0MOV DX,OFFSET IBUFMOV AH,10INT 21HMOV AX,WORD PTR IBUF+4,例3 键入4位十进制数,以压缩BCD数形式存入字变量SW单元中,AND AX,0F0FHMOV CL,4SHL AL,CLOR AL,AHMOV BYTE PTR SW,ALMOV AX,WORD PTR IBUF2AND AX,0F0FHSHL AL,CLOR AL,AHMOV BYTE PTR SW1,AL,