《汇编语言程序设计合工大版习题参考.doc》由会员分享,可在线阅读,更多相关《汇编语言程序设计合工大版习题参考.doc(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流汇编语言程序设计合工大版习题参考.精品文档. 部分习题参考答案1.5 下列各数均为十进制数,请采用8位二进制补码运算,并回答标志寄存器FLAGS中CF和OF的值,运算结果所代表的十进制数是多少?如果用16位二进制补码运算,其结果所代表的十进制数是多少?FLAGS中CF和OF的值呢?(1)85+69 (2)85+(-69) (3)85-(-69) (4)85-(69) 85=55H,69=45H,-69=BBH, 8位二进制补码运算: (1)85+69 =55H+45H=9AH, CF=0,OF=1 (2)85+(-69)=55H+BBH=11
2、0H,CF=1,OF=0其余略1.6 实模式下,写出段地址和偏移地址为1234:2002、1430:0042、FF00:0FFF的物理地址。 1234:2002=12340+2002=14342 1430:0042=14300+0042=14342 FF00:0FFF=FF000+0FFF=FFFFF1.7 已知8086系统某存储单元物理地址为:52506H,你认为段基址的最大值、最小值分别是多少? 8086微机最多可以有多少个不同的段基址? 52506=5250:0006, 段基址的最大值=5250 52506=4251:FFF6, 段基址的最小值=42511.8 从物理地址为00100H开
3、始到00103H单元中顺序存放的数据为:12H,34H,56H,78H。请画出数据存放示意图,并回答以下问题:(1) 写出00101H字节单元的内容(00101)= 34H(2) 写出00102H字单元的内容(00102)= 7856H习题33.1 分别说明8086处理器中各寄存器的名称和作用是什么?3.2 溢出标志OF与进位标志CF有何作用和区别?3.3 何为段地址?何为有效地址? 何为物理地址?用指令举例说明。3.4 带符号数比较大小,当AX BX时程序转向标号L1,若前导指令为CMP AX, BX后续指令应为什么?若视为二个无符号数比较大小, 后续指令应为什么?带符号数:JL L1, 无
4、符号数:JB L13.5 ADD指令和ADC指令在什么情况下是一样的结果? CF=03.6 说出CALL指令和INT 21H指令的操作,有何异同? CALL把断点压入堆栈,不一定是远调,INT 21H还要把FLAGS压入堆栈,且是远调,总入口地址为84H内存中的两个字。3.7 除了用4CH号系统功能调用结束程序的执行并退出,还有哪些办法?RET指令,INT 20H 3.8 指出下列错误的指令,说出错误原因,并给出合适的修改。 (1) MOV AX,DX / MOV AX,BX (2) MOV DS,DATA / MOV DS,BX (3) MOV CS,AX / MOV ES,AX(4) MO
5、V AX,DL / MOV AL,DL(5) PUSH AL / PUSH AX(6) ADD BX,DI / ADD BX,DI(7) LEA BX,2000H / LEA BX,2000H (8) MOV BX,OFFSET 2000H (9) MOV SI,2 / MOV BYTE PTR SI,2(10) MUL BX,CX / MUL BX(11) DIV 5 / DIV BX(12) MOV BYTESI,2 / MOV BYTE PTR SI,2(13) MOV AX,SI+DI / MOV AX,BX+SI(14) SHR AX,4 / SHR AX,1(15) CMP 6,A
6、X / CMP AX,6(16) MOV FFFF,AX / MOV FFFE,AX(17) MOV AX,BX+4 / MOV AX,BX+4(18) JMP FAR PRO / JMP FAR PTR PRO3.9 假定(DS)=1200H,(SS)=4400H, (BX)=463DH,(BP)=2006H, (SI)=6A00H,位移量D=4524H,以AX寄存器为目的操作数,试写出以下各种寻址方式下的传送指令,并确定源操作数的有效地址EA和物理地址。 (1)立即寻址 ;操作数的EA就是指令的EA/操作数在指令中/无EA (2)直接寻址 ;EA=4524H,物理地址=DS:4524 (3
7、)使用BX的寄存器寻址;无EA (4)使用BX的间接寻址 ;EA=463DH,物理地址=DS:463D (5)使用BP的寄存器相对寻址 ;MOV AX,BP+4524,EA=2006+4524,物理地址=SS:EA (6)基址变址寻址 ;MOV AX,BX+SI,EA= BX+SI,物理地址=DS:EA (7)相对基址变址寻址;MOV AX,4524+BX+SI,EA=4524+BX+SI, 物理地址=DS:EA 3.10 用一条指令完成以下操作。(1)把BX寄存器和DX寄存器的内容相加,结果存人DX寄存器中。ADD DX,BX(2)用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与A
8、L寄存器的内容相加,并把结果送到AL寄存器中。ADD AL,BX+SI(3)用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和AX寄存器的内容互换。XCHG AX,BX+0B2(4)用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回该存储单元中。ADD WORD PTR 524, 2A59H3.11 在数据段定义了ARRAY数组,其中依次存储了五个字数据,请用以下寻址方式的指令把第4个字送AX寄存器。(1)直接寻址 MOV AX,ARRAY+6 或MOV AX,ARRAY+6 (2)使用BX的间接寻址 LEA BX,ARRAY+6 ;MOV
9、AX,BX (3)使用BX的寄存器相对寻址 LEA BX,ARRAY ;MOV AX,BX+6(4)基址变址寻址 LEA BX,ARRAY ; MOV SI,6 ; MOV AX,BX+SI3.12 画出数据在数据段中的存放情况,程序执行后,BX、DI、CX、DX寄存器中的内容是什么? 程序如下:data segmentarray dw 20,30,40,20h,30h,-6buff db abcd$data endscode segment assume cs:code,ds:datastart: mov ax, data mov ds, ax mov bx, array+1 mov di,
10、 offset array mov cx, di+5 mov dl, buff+3 mov ah, 4ch int 21hcode ends end start 1E,00,00,00,20,00,00,643.13 在DEBUG下设置(SP)=20H,设置AX、BX、CX、DX为不同值,把这四个寄存器内容依次压入堆栈,再从堆栈中依次弹出到SI、DI、BP、BX寄存器。写出一段程序实现上述操作,并画出每条入栈指令执行后SP和堆栈中数据的变化。3.14 求出7450H与以下各十六进制数的和及差,并根据结果标出SF、ZF、CF、OF标志位的值。(1) 1234H (2)5678H (3)9804H
11、 (4)E0A0H SF、ZF、CF、OF(1)1234H+7450H, 1 0 0 1(2)5678H+7450H, 1 0 0 1(3)9804H+7450H, 0 0 1 0(4)E0A0H+7450H, 0 0 1 03.15 在数据段有如下定义: DATAX DW ?,? DATAY DW ?,? SUM DW ?,?,?,? 请用16位指令按下列要求写出指令序列: (1)DATAX和DATAY两个字数据相加,和存放在SUM中。 MOV AX,DATAX ADD AX,DATAY MOV SUM AX (2)DATAX和DATAY两个双字数据相加,和存放在SUM开始的字单元中。 MO
12、V AX,DATAX MOV DX,DATAX+2 ADD AX,DATAY ADC DX,DATAY+2 MOV SUM,AX MOV SUM+2,DX(3)DATAX和DATAY两个字数据相乘(用MUL),积存放在SUM开始的字单元中。 (4)DATAX和DATAY两个双字数据相乘(用MUL),积存放在SUM开始的字单元中。 (5)DATAX双字除以字DATAY(用DIV),商和余数存放在SUM开始的字单元中。(6)DATAX和DATAY两个压缩BCD码数据相加,和存放在SUM中。3.16 双字长数X存放在DX和AX中,设(DX)=1004H,(AX)=1002H,要求用16位指令写出:(
13、1) 对存放在DX和AX中的双字长数求补的指令序列,并验证结果。NOT AXNOT DXADD AX,1ADC DX,0(2) 用减法指令求0-X的指令序列,并验证结果。MOV BX,0 MOV CX,0SUB BX,AXSBB CX,DX ;结果在CX,BX3.17试编写一个程序求出双字长数的绝对值。双字长数在A开始的字单元中,结果存放在B开始的字单元中。A DW ?,?B DW ?,?MOV AX,AMOV DX,A+2TEST DX,8000HJZ ZSNOT AXNOT DXADD AX,1ADC DX,0ZS:MOV B,AXMOV B+2,DX3.18 用移位指令为主实现对AX中的
14、无符号数乘以5,不考虑乘积可能超出16位。 MOV DX,AXMOV CL,2 SHL AX,CL ADD AX,DX3.19 用移位指令为主实现对AX中的无符号数乘以5,考虑乘积可能超出16位的情况。提示:用DX接AX左移的位,32位操作。3.20 把AX中的内容依次倒排序,即第0位移到第15位,第1位移到第14位,。3.21 在数据段有如下定义:BUFF DB ABCD$EFGHIJK$ STR1 DB 12 DUP(?) LEN DB ?用串指令编写程序完成以下操作:(1) 对字符串STR1全部置空格符。MOV AX,DATAMOV DS,AXMOV AL,20HLEA DI,STR1M
15、OV CX,STR1-BUFFCLDREP STOSB (2) 从左到右把BUFF中的字符串传送到STR1。MOV AX,DATAMOV DS,AXMOV ES,AXCLDLEA SI,BUFFLEA DI,STR1MOV CX,STR1-BUFFREP MOVSB(3) 从右到左把BUFF中的字符串传送到STR1。MOV AX,DATAMOV DS,AXMOV ES,AXSTDLEA SI,STR1-1LEA DI,LEN-1MOV CX,STR1-BUFFREP MOVSB(4) 比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0。MOV AX,DATAMOV DS,
16、AXMOV ES,AXCLDLEA SI,BUFFLEA DI,STR1MOV CX,STR1-BUFFREPE CMPSB(5) 查找BUFF中有无字符$,把字符$出现的次数计入BX寄存器。MOV AX,DATAMOV ES,AXMOV BX,0CLDMOV AL,$LEA SI,BUFFMOV CX,STR1-BUFFNEXT: REPNE SCASBJCXZ NO-FOUNDINC BXJMP NEXT3.22 对于给定的AX和BX的值,执行下列程序段,程序将转向哪里?ADD AX, BX JNO L1JNC L2SUB AX,BXJNC L3JNO L4JMP L5(1) AX=123
17、4H, BX=6789H(2) AX=9200H, BX=4000H(3) AX=420EH, BX=8031H(4) AX=E002H, BX=8086HL1,L1,L1,L53.23 下面不完整的程序段是比较AX和BX的值,把其中大的数送MAX变量。如果是无符号数,应如何填写指令?如果是有符号数,应如何填写指令?CMP AX,BX( JB L1 ) 有符号数:JL L1MOV MAX,AX( JMP L2 )L1:MOV MAX,BX L2:HLT 3.24 在下列程序段的括号中分别填入如下指令,程序执行完后,AX、CX的内容是什么?(1) LOOP(2) LOOPE(3) LOOPNZM
18、OV AX, 8 MOV CX,5L1:SHL AX,CL提示:上机,SHL指令使ZF=0,LOOPE指令不可能循环。3.25 测试AL寄存器,如果最高位和最低位同时为0,则转L0,如果最高位和最低位只有一位为1,则转L1,如果最高位和最低位同时为1,则转L2。画出流程图,并编写程序段。ROL AL,1AND AL,3JZ L0SUB AL,3JZ L3JMP L23.26 从键盘输入一个英文字母,显示输出其大写。画出流程图,并编写程序段。 3.27 从键盘输入一位数字N,显示输出N个N。画出流程图,并编写程序段。CODE SEGMENTASSUME CS:CODESTART:MOV AH,1
19、INT 21HMOV DL,ALAND AL, 0FHMOV CL,ALMOV CH,0NEXT: MOV AH,2INT 21HLOOP NEXTMOV 4CHINT 21HCODE ENDS END START3.28 寄存器中为压缩的BCD码表示的十进制数,写出指令完成十进制加减计算,即计算AL+BL;AL-BL。并在DEBUG下上机验证。(1) AL=65H,BL=37H (2) AL=98H,BL=69H3.29 寄存器中为非压缩的BCD码表示的十进制数,写出指令完成十进制加减计算,即计算AL+BL;AL-BL。并在DEBUG下上机验证。(1) AX=235H,BL=37H (2)
20、AL=238H,BL=39H3.30 用相对基址比例变址寻址方法求ARRAY行列式的值。ARRAY DW 2,3,5 DW 1,4,6 DW 2,7,9习题44.1 假设VAR1为字节变量,VAR2为字变量,LAB为标号,VAL为常量,指出下列有错误的指令,说出原因,并予纠正。(1) ADD AX,VAR1 / ADD AL,VAR1(2) MOV VAR2,VAR1 / MOV VAR2,AX(3) MOV VAR1,BYTE PTR VAR2 / MOV VAR1,AL(4) MOV VAR1,OFFSET VAR2 / MOV VAR2,OFFSET VAR1(5) MOV VAR2,O
21、FFSET VAR1 (6) MOV VAR1,VAR2+VAR1 / MOV VAR2,VAR2-VAR1(7) MOV VAR1,VAR2-VAR1 / MOV VAR2,VAR2-VAR1(8) MOV VAR2,VAR2-VAR1(9) MOV BX,VAR2+VAL-4*5 (10) MOV BX,TYPE VAL (11) MOV BX,LAB(12) JMP VAR1 /JMP WORD PTR VAR1(13) JMP VAR2(14) JMP VAL /仅在DEBUG下可以(15) MOV BL, VAR1 AND VAL / VAR1 AND VAL须用指令实现(16) M
22、OV BX, VAL AND 0FH(17) MOV BX, VAL LT 0FH(18) MOV BL,LAB+VAR1 / MOV BL,VAR1 4.2 画图说明下列数据定义语句所示内存空间的数据,并回答寄存器的值。ORG 0ARRAY LABEL BYTEDA1 DW 2,9,14,3,315H,-6 DA2 DB 7,ABCDEDFGLEN = $DA2 ORG 100HDA3 DW DA4DA4 DB 4 DUP(2 DUP(1,2,3),4)MOV AL,ARRAY+2 (AL)=( )HADD AL,DA2+1 (AL)=( )HMOV AX,DA2-DA1 (AX)=( )H
23、MOV BL,LEN (BL)=( )HMOV AX, DA3 (AX)=( )HMOV BX, TYPE DA4 (BX)=( )HMOV BX, OFFSET DA4 (BX)=( )HMOV CX, SIZE DA4 (CX)=( )HMOV DX, LENGTH DA4 (DX)=( )HMOV BX, WORD PTR DA4 (BX)=( )HMOV BL, LEN AND 0FH (BL)=( )HMOV BL, LEN GT 5 (BL)=( )HMOV AX, LEN MOD 5 (AX)=( )H4.3 变量和标号有哪些区别?变量和标号有哪些属性?如何获取属性值?写出指令。
24、变量是为指令提供的操作数,标号是为指令提供标识,都是为了在指令中引用。它们最主要的属性有:偏移属性,段属性,类型属性。例如:MOV BX, OFFSET VAL ;取偏移属性MOV BX, SEG VAL ;取段属性MOV BX, TYPE VAL ;取类型属性4.4 指令和伪指令的区别在哪里?伪指令可以出现在代码段吗?指令可以在数据段吗? 指令只能出现在代码段,定义数据的伪指令通常在数据段。伪指令不会生成指令。 4.5 下面的程序是否有错?能否通过汇编?程序运行的结果如何?程序的真正意图是什么?应如何修改程序才能实现真正意图?答:通过汇编和连接可以运行,但程序真正意图是输出ASCII码为30
25、H39H的字符09,应作修改。CODE SEGMENT ASSUME CS:CODE K=30H ;改为 K DB 30H J DW 0START: MOV DL, K MOV AH, 2 INT 21H K=K+1 ;K=K+1是伪指令,没生成代码,改为 INC K INC J CMP J, 10 JNZ START MOV AH, 4CH INT 21HCODE ENDS END START 4.6 用32位指令编写完整程序,并上机调试,计算V=(X+Y)*R,其中所有变量均为64位变量,X、Y、R的具体数值由你自己确定,变量定义格式如下: X DD ?,? Y DD ?,? R DD ?
26、,? V DD ?,?data segmentx dd 1y dd 2r dd 3v dd ?,?data endscode segmentassume cs:code,ds:data.386pstart: mov ax,data mov ds,ax mov eax,x add eax,y mov ebx,r imul ebx mov v,eax mov v+4,edx mov dl,al add dl,30h mov ah,2 int 21h mov ah,4ch int 21hcode endsend start习题55.1 下列程序是在3个数中找出最小的数并放入AL,在括号中填入指令使其
27、完整。moval,xmovbl,ymovcl,zcmp al,bl( jl l1 )xchg al,bll1: cmp al, cljle l2( xchg al,cl )l2: ret5.2 数据段如下:data segmentda1db1,2,abcd count = $-da1da2 db 9 dup(?)data ends补充括号处的指令,使得程序把DA1数据区数据移到DA2数据区。movax,datamov ds, axmoves,( AX )movcx,( COUNT )mov si, ( OFFSET DA1 ) ( MOV DI, OFFSET DA2 ) ( REP MOVS
28、B )5.3 以下程序对无符号数组ARRAY的6个元素从小到大排序,补充括号处的指令。data segmentarraydw4,3,12,56,5,8 data endscode segmentassume cs:code,ds:datastart: ( mov ax,data ) ( mov ds, data )mov cx, 5l1: mov di, cxmov bx, 0l2: mov ax, arraybxcmp ax, arraybx+2( jl l3 )xchg ax, arraybx+2mov arraybx, axl3: add bx, 2( loop l2 )mov cx,
29、diloop l1mov ah, 4chint 21hcode segmentend start5.4 编写程序,实现从键盘输入的小写字母用大写字母显示出来。对输入须合法性检查。code segment assume cs:code start: push ds sub ax,ax push ax mov ah,1 int 21h cmp al,61h jb exit cmp al,7ah ja exitsub al,20hmov dl,almov ah,2int 21h exit:retcode endsend start5.5 编写程序,比较两个字符串是否相同,如果相同,则显示两个字符串,
30、如果不同,则显示发现不同的字符位置。datasg segment mess1 db 13,10, input string1:$mess2 db 13,10, input string2:$mess3 db 13,10, match!$mess4 db 13,10, no match at $st1 label byte max1 db 6 act1 db ? stok1 db 6 dup(?)st2 label byte max2 db 6 act2 db ? stok2 db 6 dup(?)datasg endscodesg segment assume cs:codesg, ds:da
31、tasg,es:datasg main proc far push ds sub ax,ax push ax mov ax,datasg mov ds,ax mov es,ax lea dx,mess1 mov ah,09 int 21h ;qust1? lea dx,st1 mov ah,0ah int 21h ;ans1 lea dx,mess2 mov ah,09 int 21h ;qust2? lea dx,st2 mov ah,0ah int 21h ;ans2 mov cl,act1 mov dl,act2 cmp cl,dl jnz nomatch lea si,stok1 le
32、a di,stok2 inc cl repe cmpsb cmp cl,0 jz matchnomatch: lea dx,mess4 jmp exitmatch: lea dx,mess3exit: mov ah,09 int 21h sub di,offset stok2 mov dx,di and dx,0fh add dl,30h mov ah,2 int 21h ret main endp codesg ends end main 5.6 编写程序,从键盘输入一个个位数N,响铃N次(响铃ASCII码为07H)。code segment assume cs:code start: pu
33、sh ds sub ax,ax push ax mov ah,1 int 21h cmp al,31h jb exit cmp al,39h ja exitsub al,30hmov cl,almov ch,0k: mov ah,2mov dl,7int 21hloop k exit:retcode endsend start5.7 编写程序,从键盘输入一个字符串到BUFF,再输入一个字符到AL,在字符串BUFF中查找是否存在该字符,如果找到,显示发现的字符位置。;search datasg segment paradatamess1 db 13,10, input string:$mess2
34、 db 13,10, input a char:$mess3 db 13,10, found at $mess4 db 13,10, no found !$st1 label byte max1 db 6 act1 db ? stok1 db 6 dup(?)datasg endscodesg segment paracode assume cs:codesg, ds:datasg,es:datasg main proc far push ds sub ax,ax push ax mov ax,datasg mov ds,ax mov es,ax lea dx,mess1 mov ah,09
35、int 21h ;qust1? lea dx,st1 mov ah,0ah int 21h ;ans1 lea dx,mess2 mov ah,09 int 21h ;qust2? mov ah,1 int 21h ;ans2 lea di,stok1 repne scasb jz matchnomatch: lea dx,mess4 jmp exitmatch: lea dx,mess3exit: mov ah,09 int 21h sub di,offset stok1 mov dx,di and dx,0fh add dl,30h mov ah,2 int 21h ret main endp codesg ends end main 5.8 编写程序,从键盘输入一个N位二进制数,统计1出现的次数。code segment assume cs:code start: mov cx,9 ;N10 mov dl,30H next: mov ah,1 int 21h cmp al,13 jz write cmp al,30h jb exit cmp al,31h ja exit sub al,30h add dl,al dec cx jnz nextwrite: push dx mov dl,10 mov ah,2 int 21h pop dx
限制150内