《汇编语言程序设计》复习资料-.pdf
汇编语言程序设计复习资料注:复习资料仅提供题目类型参考,考试不会出现原题,考试重点依然是每节课划出的重点内容。一、基本概念1、8088/8086CPU 内部寄存器中,AX、BX、CX、DX bp di si 是通用寄存器,BX、BP、SI、DI是基址和变址寄存器,CS、DS、ES、SS 是段寄存器,此外还有指令指针寄存器IP 和标志位寄存器 FLAGS 两个控制寄存器,所有寄存器都是16 位寄存器,每个寄存器可以存放16 位二进制数。2、8088/8086CPU 有三组总线,它们是数据总线、地址总线和控制总线;地址总线是20 条,因此它可以寻址的范围是220 字节。通常将1024 字节称为 1K,将 220 字节称为 1M。3、8088/8086CPU 的存储器采用分段方式管理,每个段最多可以有64K 字节,全部存储空间可以分成 16 个大小为 64K 且互相不重叠的段。4、采用分段方式管理的存储单元的地址分成物理和逻辑地址两种,逻辑地址由段地址和偏移地址两部分构成,段地址是每个存储器段的首地址;偏移地址则是相对于每个段第一个存储单元的偏移量。段地址存放在段寄存器中,由于8088/8086CPU 的段寄存器是16 位寄存器,因此在段寄存器中存放的是段地址的16 位;而 CPU 对数据的存取是按物理地址进行的,物理地址和逻辑地址间的关系是PHA=段地址*16+偏移地址5、存储器中,数据是以字节为单位存放的,它是一个8 位二进制数,16 位二进制数是2 字节,又称为字;每个存储单元可以存放一个字节;一个字则占用两个存储单元,存放时要将低位数据在地址较小的存储单元中。6、计算机的指令由操作码和操作数构成,它们分别给出计算机执行的操作和所需要的操作数。7、表示操作数存放的方式称为寻址方式。088/8086CPU 与数据有关的寻址方式有立即、直接、寄存器、寄存器间接、寄存器相对、基址变址、相对基址变址转移有关的寻址有段内直接、段内间接、段间直接、段间间接等几种。8、8088/8086CPU 的指令系统分成六大类,它们是数据传送指令、算术指令、逻辑指令、串指令、控制指令和处理机和杂项指令。9、汇编语言程序语句构成,语句通常由名字、操作码、操作数、注释四部分构成。10、指令语句在汇编时被翻译成机器语言指令,指示语句则在汇编时由汇编程序执行,而不被翻译成机器语言指令。11、名字项在指令语句中称为标号,它是指令的符号地址;而在指示语句中名字项称为变量,它是存储单元的符号地址,它们都有段、偏移、类型三种属性。12、数据定义伪指令的功能是定义数据、分配存储区,通常使用的数据定义伪指令是DB、DW、DD、DQ、DT、DF。13、符号定义伪指令EQU 的功能是给表达式赋一个名词,通常用它定义常数。14、用汇编语言编写的程序称为汇编语言源程序,它必须用汇编语言程序将它转换成二进制的机器语言程序,这种机器语言程序称为目标程序,而转换的过程称为汇编。它还必须用连接程序连接,才能生成可执行的程序。汇编语言程序上机操作的步骤是编辑、汇编、连接、调试与执行。15、汇编语言源程序的扩展名是.asm,目标程序的扩展名是.obj,可执行程序的扩展名是.exe。16、下列指令中,执行后对标志未发生影响的是A B R F H I N O。A、MOV AX,BXB、PUSH AX C、ADD AX,00FFH D、CMP AX,BX E、JB NEXTF、CALL SUBB G、XOR AX,AX H、MOVSBI、LEA DX,BUF J、TEST AX,8000H K、MUL BX L、DIV BX M、NOT CX N、LOOP LOPO、XCHG AX,BX17、按照下列指令中操作数的寻址方式在括号中填入适当的字母:目的操作数源操作数 A、MOV AX,1200H(寄存器寻址)(立即寻址)B、CMP WORD PRTSI,120H(寄存器间接寻址)(立即寻址)C、ADD AX,14BX(寄存器寻址)(寄存器相对寻址)D、SUB BX+DI,CX(基址变址寻址)(寄存器寻址)E、AND BX,BUF(寄存器寻址)(直接寻址)F、LEA DI,SI(寄存器寻址)(立即寻址)G、XOR BX+SI+3,DX(相对基址变址寻址)(寄存器寻址)a.立即寻址;b.寄存器寻址;c.直接寻址;d.寄存器间接寻址;e.寄存器相对寻址;f.基址变址寻址;g.相对基址变址寻址.18、某存储单元的地址为3A80:13EBH,其中的 3A80 是段地址,13EB 是偏移地址;该存储单元的物理地址是3bbebH。若段地址改变为2eD4,则该存储单元的逻辑地址为2ED4:CEAB。19、十进制数-100 的 8 位二进制数的补码为(C)。A、11100100 B、01100100 C、10011100 D、1100111020、下列是8 位二进制数的补码,其中真值最大的是(D)。A、10001000 B、11111111 C、00000000 D、0000000121、16 位有符号数的补码所表示的十进制数的范围是(B)。A、-32767+32768 B、-32768+32767 C、-65535+65536 D、06553522、以下指令中,执行后AL 中的数据不变的是(B D E F)。A、AND AL,CL B、OR AL,AL C、XOR AL,AL D、CMP AL,AL E、ADD AL,0 F、AND AL,0FFH G、XOR AL,0FFH H、OR AL,0FFH23、下列指令中,执行后,不改变标志位CF 的是(A E F G)。A、NOT AL B、AND AL,AL C、SAL AL,1 D、MUL AL E、MOVSB F、INC AL G、POP AX H、POPF24、下列指令中,执行后,不改变标志位ZF 的是(D)。A、CMP AL,BL B、AND AL,AL C、TEST AL,0FFH D、ROR AL,CL25、执行指令CALL SUBB时,所要保护的断点在 (sp)中,而执行指令CALL FAR PTRSUBB 时,所要保护的断点在(sp)+1,(sp)中。二、根据给定的条件写出指令或指令序列:1、将一个字节的立即数送到地址为NUM 的存储单元中。答:MOV BYTE PTR NUM,num ;这里 num 是立即数2、将一个 8 位立即数与地址为BUF 的存储单元内容相加。答:ADD BYTE PTR BUF,num ;这里 num 是 8 位立即数3、将地址为ARRAY 的存储单元中的字数据循环右 移一位。答:ROR ARRAY,14、将 16 位立即数与地址为MEM 的存储单元中的数比较。答:CMP MEM,num ;这里 num 是 16 位立即数5、测试地址为 BUFFER 的字数据的符号位。答:TEST BUFFER,8000H ;zf=1表示 负数;zf=0 表示 非负 数6、将 AX 寄存器 及 CF 标志位 同时清零。答:AND AX,0 或 XOR AX,AX7、用直接寻址方式将首地址为ARRAY 的字数组中第5 个数送 往 寄存器 BX 中。答:MOV BX,ARRAY+8 8、用寄存器 间接 寻址方式将首地址为ARRAY 的字数组中第5 个数送 往寄存器 BX 中。答:LEA DI,ARRAY+8MOV BX,DI9、用相对寻址方式将首地址为ARRAY 的字数组中第8 个数送 往 寄存器 BX 中。答:MOV BX,8MOV BX,ARRAYBX10、用基址变址寻址方式将首地址为ARRAY 的字数组中第N 个数送 往寄存器 BX 中。答:MOV BX,0MOV SI,2*N-2MOV BX,ARRAYBX+SI11、将首地址为BCD_BUF 存储单元中的两个压缩 BCD 码相加,和送到第三个存储单元中。答:MOV AH,BCD_BUFADD AH,BCD_BUF+1DAAMOV BCD_BUF+2,AH三、按照给定的条件为程序定义一个数据段,并画 出存储单元的示意图:1、STR 是字符串 THIS IS A DATA_SEGMENT。2、DAT1 是字节变量,初值为 23,4BH,126,0D3H。3、DAT2 是 16 进制数字变量,初值为 100,255,2 DUP(3,5)4、LEN 是以上存储单元的字节数。答:DATA SEGMENTSTR DB THIS IS A DATA_SEGMENT DAT1 DB 23,4BH,126,0D3H.RADIX 16DAT2 DW 100,255,2 DUP(3,5).RADIX 10LEN EQU$-STRDATA ENDS5441170048544B0349417E00535FD30520530000494501534755204D02414503204E00445405四、写出 完成下列功能的程序段:1、将 AL 中的两位BCD 码分 离,分别存放DL 和 DH 中。答:MOV DH,ALMOV DL,ALAND DL,0FHMOV CL,4SHR DH,CLAND DH,0FH2、将 DL 中的 4位二进制数转换成16 进制数的 ASCII 码。答:ADD DL,30HCMP DL,30HJB NEXTADD DL,7NEXT:3、将 AL 中的 8位二进制数 高 4位和低 4 位交换。答:MOV CL,4ROR AL,CL4、将 AL 和 BL 中的 非压缩 BCD 码合并 成一个 压缩 的 BCD 码,存在AL 中。答:AND AL,0FHMOV CL,4SHL AL,CLAND BL,0FHOR AL,BL5、将 AL 中的 8位有符号数转换成它的绝对值。答:TEST AL,80HJE EXITNEG ALEXIT:6、用串 扫描 指令在一个字符串中查找 字符*。答:设字符串变量为str,长度 在 CX 中。MOV AL,*LEA DI,STRREPNE SCASBJNE EXITDEC DIEXIT:7、将 输入的大写字母改变成小写输出。答:MOV AH,1INT 21HCMP AL,41HJB SHOWCMP AL,ZJA SHOWADD AL,20HSHOW:MOV AH,2MOV DL,ALINT 21H8、输入一个字母,然后输 出它的后 续字母。答:MOV AH,1INT 21HCMP AL,41HJB NEXTCMP AL,ZJB SHOWCMP AL,61HJB NEXTCMP AL,zJAE NEXTSHOW:DEC ALMOV DL,ALMOV AH,2NEXT:9、将 DX:AX 寄存器中的32 位数 向右 移两位。答:MOV CX,2NEXT:SHR DX,1RCR AX,1LOOP NEXT10、完成计算 78。答:MOV AL,7MOV BL,8MUL BL五、分 析指令和程序。1、已知 SS=2000H,SI=1000H,AX=0ABCDH,SP=0100H,BP=00FEH,给出下列指令执行后,指定寄存器中的内容,并画 出指令执行中 堆栈 的变 化示意图。答:结果 PUSH AX AX=0ABCDH SP=0FEH PUSH SI SI=1000H SP=0FC POP AX AX=1000H SP=0FEH PUSH BP BP=00FEH SP=0FCH POP SI SI=00FEH SP=0FEH POP BP BP=0ABCDH SP=100H PUSH AX AX=1000H SP=0FEH POP BX BX=1000H SP=0100H2、已知(CS)=2300H,(IP)=32B4H,且在数据段中有定义:ARY DB 0AH,28H,00H,3FH分别给出下列指令执行后的CS和 IP 的内容:A、LEA BX,ARYJMP WORD PTRBX (CS)=2300H (IP)=280AH B、MOV BX,OFFSET ARYCALL WORD PTRBX (CS)=2300H (IP)=280AH C、MOV BX,OFFSET ARYJMP DWORD PTRBX (CS)=3F00H (IP)=280AH3、MOV AL,0 MOV BL,0 MOV CX,10L1:INC BL INC BL ADD AL,BL LOOP LI HLT程序的功能是,画出程序的 流程图。答:程序的功能是求 2 4 6 8 10 12 14 16 18 20 的和,程序的 流程图如 下。(AL)0;(BL)0;)CX)0;(B L)(B L)+2(A L)(A L)+(B L)(CX)(CX)-1(CX)=0?Y N4、X DB 14 Y DB 4 DUP(?)MOV SI,0 MOV AH,0 MOV AL,X MUL AL MUL AX MOV WORD PTRSI,AX INC SI INC SI MOV WORD PTRSI,DX HLT程序执行后X 和 Y 的关系是,画出程序的 流程图。答:X 和 Y 的关系是Y=X4,程序的 流程 图如 下。(SI)0(AH)0,(AL)14(AX)(AL)*(A L);(AX)=196(DX,AX)(AX)*(A X)(Y1,Y0)(AX)(SI)(SI)+2(Y3,Y2)(DX)5、MOV AX,4BD5H MOV BL,0 MOV DL,0 MOV CX,16L1:SHL AX,1 JC L2 INC BL JMP L3L2:INC DLL3:LOOP L1 HLT程序的功能是_,程序执行后BL=_,DL=_,AX=_。画出程序的 流程图。答:程序的功能是分别统计4BD5H 中的 0、1 的个数,0 的个数放 BL,1 的个数放DL,程序执行后BL=7,DL=9,AX=0。(AX)4BD5h(B L)0,(DL)0,(CX)16(AX)左移 1位移出的是 1吗?Y N(BL)加1(DL)加1(CX)=0?Y N(CX)减1结束6、XOR DX,DXL1:MOV AH,1 INT 21H CMP AL,$JZ BACK CMP AL,30H JB L1 CMP AL,39H JA L1 AND AL,0FH ADD DL,AL ADC DH,0 JMP L1BACK:HLT程序的功能是 _,画出程序的 流程图。答:程序的功能是_对输入的数字字符转换为对应的十进制表示,并将该十进制数加到DX中,直到 输入字符为$退出 输入,程序的 流程图如 下。(DX)0键盘输入一个字符,放AL 是$吗?Y N是数字吗?清除 AL高4位将AL变为十进制数将该数加到DX中Y 结束六、编写汇编语言程序,要有完整 的格式(要有必要的数据段和代码段)1、在 屏幕 上显示两个字符串,两个字符串要在不同的行。This is a program Disk operation system参考程序Data segmentMsg db This is a program$DOSmsg db Disk operation system$Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMov dx,offset msgMov ah,9Int 21hCall crlfMov dx,offset dosmsgMov ah,9Int 21hMov ah,4chInt 21hCrlf proc nearMov ah,2Mov dl,0ahInt 21hMov ah,2Mov dl,0ahInt 21hRETCrlf endpCode endsEnd start2、用移位指令将X 乘以 30,结果 存入 Y 单元。参考程序Data segmentX DB?Y dw?Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMov AL,XMOV AH,0Mov CL,2MOV DX,AXSHL DX,CLMOV CL,5SHL AX,CLSUB AX,DXMOV Y,AXMov ah,4chInt 21hCode endsEND START3、设有三个数A,B 和 C,如果 其中一个为0,将 另外两个 也清零,否则 求它们的和,存入D 单元中。参考程序Data segmentA DB?B DB?C DB?D DB?Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMov AL,0MOV CX,3MOV BX,0NEXT:CMP XBX,0JZ CLEARADD AL,XBXINC BXLOOP NEXTMOV D,ALJMP EXITCLEAR:MOV A,0MOV B,0MOV C,0EXIT:Mov ah,4chInt 21hCode endsEND START4、在一个数组中查找 最大数。Data segmentA DB 50 dup(?)MAX DB?Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMOV CX,MAX-A-1MOV AL,AMOV BX,1NEXT:CMP AL,ABXJLE L1MOV AL,ABXL1:INC BXLOOP NEXTMOV MAX,ALMov ah,4chInt 21hCode endsEND START5、用 查表法计算 Y=X*X-2*X。参考程序Data segmentMSG DB Please input a number between 0 and 15$A DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225 y DB?Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMOV DX,OFFSET MSGMOV AH,9INT 21HMOV AH,1INT 21HSUB AL,30HMOV DL,ALSHL DL,1 ;DL=2XLEA BX,AXLAT ;查表法计算,AL(BX)+AL),即 AL X*XSUB AL,DL ;AL X*X-2*XMOV Y,ALMov ah,4chInt 21hCode endsEND START6、用字符串操作指令将有符号数数组ARY 中的数转换成绝对值存 回原单元。Data segmentAry DB 10,12,-4,49,116,-253,36,9,-64,8,-100,12,-144,69,196,-225 cnt DB?Data endsCode segmentAssume cs:code,ds:data,ES:DATAStart:Mov ax,dataMov ds,axMOV ES,AXMOV CX,CNT-ARYLEA SI,ARYLEA DI,ARYNEXT:LODSBCMP AL,0JNL LAB1NEG AL ;AL是负数时取相 反数LAB:STOSBLOOP NEXTMov ah,4chInt 21hCode endsEND START7、输入一个字符串,将其中的小写字母转换成大写字母后输出。Data segmentStr DB 50,?,50 dup(?)Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMOV AH,10LEA DX,STRINT 21HMOV CL,STR+1MOV CH,0MOV BX,2NEXT:MOV AL,STRBXCMP AL,41HJB SHOWCMP AL,ZJA SHOWADD AL,20HSHOW:MOV AH,2MOV DL,ALINT 21HLOOP NEXTMov ah,4chInt 21hCode endsEND START8、从键盘输 入一个一位数,然后响铃该数的 次数。Code segmentAssume cs:code,ds:dataStart:MOV AH,1INT 21HSUB AL,30HMOV CL,ALMOV CH,0NEXT:MOV AH,2MOV DL,7 ;响铃的 ASCII 码为 7INT 21HLOOP NEXTMov ah,4chInt 21hCode endsEND START9、从键盘输 入一个字符串,再将它按相 反次 序输出在下一行。Data segmentStr DB 50,?,50 dup(?)Data endsCode segmentAssume cs:code,ds:dataStart:Mov ax,dataMov ds,axMOV AH,10LEA DX,STRINT 21HMOV CL,STR+1MOV CH,0MOV BX,CXNEXT:MOV DL,STRBX+1MOV AH,2INT 21HDEC BXLOOP NEXTMov ah,4chInt 21hCode endsEND START10、统计一个16 位二进制数中1 的个数,并将结果输 出。CODE segment assume cs:CODEstart:mov cx,0mov ax,567AH repeat:test ax,0ffffh jz SHOW ;若 AX 已为 0,则 退出,进行 显 示jns Shift ;若符号位为0,则考 虑下一位inc cx ;若符号位为1,则统计Shift:shl ax,1 Jmp repeat SHOW:CMP cx,10JB NEXTMOV DL,1MOV AH,2INT 21HSUB CX,10NEXT:MOV DL,CLMOV AH,2INT 21Hmov ax,4c00hint 21hCODE ends End start 11、用字符串扫描 指令 查找 字符串中的第3 个空 格,找 到显 示 FOUND,否则 显示 NOTFOUND。Data segmentStr DB 50,?,50 dup(?)found db FOUND$Notfound db NOT FOUND$Data endsCode segmentAssume cs:code,ds:data,Es:dataStart:Mov ax,dataMov ds,axMOV ES,AXMOV AH,10LEA DX,STRINT 21HMOV CL,STR+1MOV CH,0LEA BX,STR+2MOV AL,20HMOV BL,0NEXT:REPNE SCASBJNE LABINC BLLAB:LOOP NEXTMOV AH,9LEA DX,FOUNDCMP BL,2JA SHOWLEA DX,NOTFOUNDSHOW:INT 21HMov ah,4chInt 21hCode endsEND START12、从键盘输 入两个一位数,求它们的和,将结果输 出,分别用 子程序 完成。Code segmentAssume cs:codeMAIN PROC FARPUSH DSMOV AX,0PUSH AXMOV AH,1INT 21HMOV DL,ALINT 21HMOV BL,ALCALL ADDITIONCALL SHOWRETMAIN ENDPADDITION PROC NEAR ;参数是 DL、BL,返回 DLSUB BL,30HSUB DL,30HADD DL,BLRETADDITION ENDPSHOW PROC NEAR ;参数是 DLMOV AL,DLCBWMOV BL,10DIV BL ;分离个位与十位数MOV BH,AHCMP AL,0JE NEXTMOV DL,AL ;十位数ADD DL,30HMOV AH,2INT 21HNEXT:MOV DL,BH ;个位数ADD DL,30HMOV AH,2INT 21HRETSHOW ENDPCode endsEND main