汇编语言课后习题答案---郑晓薇(整理后的)(12页).doc
-汇编语言课后习题答案-郑晓薇(整理后的)-第 12 页习题一1 无符号数: 11010011=211=D3H,01110111=119=77H,10000011=131=83H,00101111=47=2FH,10101010=170=AAH带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H,00101111=+47=2FH,10101010= -86=AAH2 5E8AH,0BE6H,3DEH,4940H3 00011101+00110101=01010010=52H=8201001001+11101000=00110001=31H=4910111110+01010010=00010000=10H=1610011010+11110001=10001011=8BH= -1174 00101001+01010011=01111100+00000110=10000010=82H=820111001100100100=0100111100000110=01001001=49H=4901100110+00011000=01111110+00000110=10000100=84H=840000000100110010+01110101=0000000110100111+00000110=0000001000000111=0207H=2075 000020A3H,FF94H,00003456H,007FH,FFFFEC00H6 无符号数:065535,0000HFFFFH;带符号数:-32768+32767,8000H7FFFH7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD码(2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255(3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码(4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码8 (1) 108=01101100B=6CH,补码01101100B,压缩BCD码0000000100001000,ASCII码313038H(2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H(3) 15=11110001B=F1H,补码11110001B,ASCII码2D3135H(4) 254=0000000011111110B=00FEH,补码0000000011111110B,压缩BCD码0000001001010100,ASCII码323534H9 (1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0(2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0(3) -74+29=11010011B,CF=0,SF=1,ZF=0,OF=0(4) -9237=01111111B,CF=1,SF=0,ZF=0,OF=110 回车、换行、响铃、ESC键、空格键、P、p习题二9 最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节)10 CS:IP,DS:BX、SI、DI,ES:BX、SI、DI,SS:SP、BP11 字节单元保存8位数,字单元保存16位数。根据源操作数的属性确定要访问的是字节单元还是字单元。 12 对于字节单元来说,偶地址和奇地址一样;对于字单元而言,最好用偶地址保存,可减少CPU的访存次数。13 首单元的物理地址=38AE8H,末单元的物理地址=38AE8H+7FFFH=40AE7H16 (1)物理地址=27679H (2) 物理地址=20F92H (3) 物理地址=20F92H (2)和(3)的物理地址是一样的。说明逻辑地址不唯一,多个逻辑地址可对应到同一个物理单元上。17 代码段CS:IP的物理地址=55A84H 堆栈段SS:SP的物理地址=4DB65H数据段DS:BX的物理地址=17678H 附加段ES:DI的物理地址=2BA41H18 当前栈指针所指单元的物理地址是1522CH。堆栈区中还能保存254个字。19 执行E 20020 执行U 100 21 执行R CX,然后输入10022 执行E DS:0 a b c d 习题三3 MOV AX,BX 源操作数为寄存器寻址,EA 无,物理地址 无MOV AX,1290H 立即寻址,EA 无,物理地址 无MOV AX,BX 寄存器间接寻址,EA=1290H, 物理地址=2FBB0HMOV AX,DS:1290H 直接寻址,EA=1290H, 物理地址=2FBB0HMOV AX,BP 寄存器间接寻址,EA=6756H, 物理地址=26A56HMOV DIBX,AX 目的操作数为基址变址寻址,EA=3C06H, 物理地址=32526HMOV ES:SI,AX 寄存器间接寻址,EA=348AH, 物理地址=50CAAH7 MOV AX,CX 错。CX不能为间址寄存器MOV AL,1200H 错。立即数超出8位寄存器范围MOV AL,BX 错。两个操作数不匹配MOV SIDI,AX 错。两个变址寄存器不能在一起MOV ES:DX,CX 错。DX不能为间址寄存器MOV AX,VALUE 错。AX不能为间址寄存器MOV COUNT,SI 错。两个操作数不能都是存储单元8 (1) MOV AX,BX (2) MOV CL,15 (3) ADD AX,BX (4) MOV BX+SI,AL (5) MOV AX,VALUESI (6) SUB AX,DS:2000H9 (1) ADD AX,X+4MOV Y,AX (2) MOV BX,4ADD AX,XBX MOV Y,AX(3) MOV BX,4MOV SI,OFFSET XADD AX,BX+SIMOV Y,AX10 立即寻址方式中操作数(立即数)和指令一起存放在代码段中。习题四10 (1) DATA SEGMENTX DW 0Y DW 0DATA ENDS(2) STRING DB Computer(3) COUNT DB 100 DUP(?)(4) PI EQU 3.14(5) VALUE LABEL BYTE11 (1)对。(2)错。260超出了字节范围。(3)错。X3是字节型,1234H是字型,不匹配。(4)对。(5)错。缺少DUP。(6)对。12 (1)AL=3。(2)AX=2103H。(3)DX=TABLE的偏移地址。(4)CL=33H(5)BX=TABLE的段地址。(6)BX=1。(7)DX= TABLE的偏移地址。13 MOV DX,2012HMOV AX,5D68HMOV CX,1003HMOV BX,49A6HADD AX,BX (SUB AX,BX)ADC DX,CX (SBB DX,CX)14 SUB AX,CXSBB DX,015 MOV AX,extraMOV ES,AX16 (1) MOV AL,16ADD AL,XMOV BL,5IMUL BLMOV Z,AX(2) MOV BL,4MOV AL,XIDIV BLSUB AL,YMOV Z,AX(3) MOV AL,XMOV BL,8IMUL BLMOV DX,AXMOV AH,0MOV AL,YMOV BL,16IDIV BLCBWADD DX,AXMOV AH,0MOV AL,WIMUL ALSUB DX,AXMOV Z,DX(4) MOV AL,XADD AL,YMOV BL,XSUB BL,YMOV AH,0IMUL BLMOV Z,AXMOV AL,XIDIV YCBWSUB Z,AX17 Z= (5+22-15)*14= 16818 从伪指令END START处获知程序从START标号开始。19 (1)减法: (2) 加法:MOV AX,8576H MOV AX,8576HMOV BX,9988H MOV BX,9988HSUB AX,BX ADD AX,BX结果:AX=EBEEH 结果:AX=1EFEHCF=1,OF=0,ZF=0,SF=1 CF=1,OF=1,ZF=0,SF=021 (1) MOV AL,56HMOV BL,34HADD AL,BLDAAMOV Y1,AL(2) MOV AX,128HMOV BX,35HSUB AX,BXDASMOV Y2,AL(3) MOV AL,68HMOV BL,23HADD AL,BLMOV BL,45HSUB AL,BLDASMOV Y3,AL22 (1) MOV AX,0708HMOV BX,0406HADD AL,BLADD AH,BH ;不用带进位加AAA ;加法调整,含进位调整MOV BX,AXXCHG AH,AL ;高4位调整AAAMOV BH,ALMOV Z1,BX ;保存十位、各位,百位在CF中(2) MOV AX,0905HMOV BX,0207HSUB AL,BLSUB AH,BH ;不用带借位减AAS ;减法调整MOV Z2,AX(3) MOV AX,0102HMOV BX,0006HMUL BX ;乘法先不用调整MOV BX,0303HSUB AX,BXAAS ;减法调整MOV Z3,AX(4) MOV AX,0704HMOV BX,0108HADD AL,BLADD AH,BHAAA ;加法调整MOV BL,6AAD ;除法调整DIV BLMOV BH,AH ;余数保存在BHAND AX,000FHAAA ;商调整MOV Z4,AX ;保存商23 .model small.databuff db ?.codestart:mov ax,datamov ds,axmov ah,1 ;键盘输入int 21hsub al,30h ;去掉ASCII码mov buff,almov ah,4chint 21hend start24 .model small.codestart:mov ah,1 ;键盘输入int 21hsub al,20h ;变为大写mov dl,almov ah,2int 21hmov ah,4chint 21hend start25 .model small.datax db 12hy db 34h.codestart:mov ax,datamov ds,axmov al,xadd al,y ;结果为46Hmov ah,al ;AH=46Hand al,0fh ;AL=06Hmov cl,4rol ah,cl ;AH=64Hand ah,0fh ;AH=04Hadd ax,3030h ;AX=3436Hmov bx,axmov dl,bh ;显示4mov ah,2 int 21hmov dl,bl ;显示6int 21hmov ah,4chint 21hend start26 data segment x db '0.000','1.000','1.414','1.732','2.000'db '2.236','2.449','2.646','2.828','3.000' ;建立字符表y db 5 dup(?) ;存放查到平方根u db 3 ;要查的数data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov al,u ;要查的数mov cl,5mul cl ;u*5=15(号单元开始)mov ah,0mov bx,ax ;地址保存到bxmov si,0let1:mov al,xbx ;取出平方根数字mov ysi,al ;存入yinc siinc bxloop let1 ;循环取出5次mov ah,4chint 21hcode endsend start27 .model small.datax1 db 'zhang yan $' ;姓名为10个字符宽度x2 db 'li li $'x3 db 'wang lan $'x4 db 'zhao xue $'x5 db 'li jiang $'u db 3 ;要查的学号.code start:mov ax,datamov ds,axmov al,u ;给出学号mov cl,10mul cl ;u*10=30(号单元开始)mov ah,0mov dx,ax ;地址保存到dxmov ah,9 ;9号功能显示字符串int 21hmov ah,4chint 21hend start28 编程实现公式计算Z=X/4+16Y。.model small.datax db 4 y db 6z db ?.code start:mov ax,datamov ds,axmov al,x ;mov cl,2sar al,cl ; X/4mov cl,4mov bl,ysal bl,cl ;16Yadd al,bl ;X/4+16Ymov z,almov ah,4chint 21hend start29 .model small.datay db ?,?.code start:mov ax,datamov ds,axmov al,3 ;设al=3mov cl,6mul cl ;al*6mov cl,4 ;设cl=4sub al,cl ;相减mov bl,3 idiv bl ; /3mov y,al ;商mov y+1,ah ;余数mov ah,4chint 21hend start习题五11 进位标志CF=1 12 先把AX的值除以8等于0246H,再把高12位屏蔽为0,剩下AL=06H加上30H变为ASCII码显示出来。13 判断X>0,是,Z=X-Y;否则Z=X的绝对值 14 (1) 目的操作数是存储单元时,要用PTR伪操作指出单元的属性 (2)DS段寄存器使用非法 (3)立即数使用非法 (4) 目的操作数不允许是立即数 (5) 两个操作数不允许都是存储单元 (6)移位次数超过1要用CL表示。15 AND AL,11011111B16 (1) AL=30H (2) AL=B7H (3) AL=C8H (4)AL=38H27 分支程序设计。完成如下公式的计算,请写出程序。 (X+3)/2 X>0Y= 0 X=0 X×4 X<0程序如下:DATA SEGMENTX DB 23Y DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,XCMP AL,0JE SUB2JG SUB1MOV CL,2SAL AL,CLJMP SHORT SUB2SUB1:ADD AL,3SAR AL,1SUB2: MOV Y,ALMOV AH,4CHINT 21HCODE ENDSEND START28 设X、Y、Z为字节单元。如果X0,Z=4X-Y/16,否则,Z=X的绝对值。编程序实现。程序如下:DATA SEGMENTX DB 3Y DB 5Z DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AL,XCMP AL,0JL SS1MOV CL,2SAL AL,CLMOV BL,YMOV CL,4SAR BL,CLSUB AL,BLJMP OUT1SS1: NEG ALOUT1: MOV Z,ALMOV AH,4CHINT 21HCODE ENDSEND START29 字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO 单元。程序如下:DATA1 SEGMENTM DW 21,-34,32,112,-324,0,76,0,48,50POSI DW ?NEGA DW ?ZERO DW ?DATA1 ENDSCODE1 SEGMENTASSUME CS: CODE1,DS:DATA1START: MOV AX,DATA1MOV DS,AXMOV CX,10LEA SI,MAGAIN: CMP WORD PTR SI,0JL LOWERJE EQUALINC POSIJMP LPP1LOWER: INC NEGAJMP LPP1 EQUAL: INC ZEROLPP1: ADD SI,2DEC CXJNZ AGAINMOV AH,4CHINT 21HCODE1 ENDSEND START30 试编写程序,从键盘接收一英文单词,以空格结束,将其存入BUF开始的存储单元中,并在最后加上字符串结束符$。主要程序部分:LEA BX,BUFLOP: MOV AH,1INT 21HCMP AL,20HJE NEXTMOV BX,ALINC BXJMP LOPNEXT: MOV BYTE PTRBX,$31 编程。将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。程序段:START:MOV AX,1234HMOV BX,AXAND AL,0FH ;4AND BL,0F0H ;3AND AH,0FHMOV CL,AH ;2AND BH,0F0HMOV DL,BH ;1习题六11 累加和TOTAL=8312 循环统计X中0的个数13 (1) 将BB1:RCL AL,1改为BB1:ROL AL,1(2) 将BB2:CMP BX,T LOOPNE BB2改为:DEC BXBB2:INC BXCMP BX,TLOOPNE BB215 计算Y=1×2+3×4+5×6+7×8+9×10的程序段答案:MOV AL,1MOV BL,2MOV DX,0MOV CX,5AA1:MUL BLADD DX,AXINC BLMOV AL,BLINC BLLOOP AA116 写程序段。查找CATT表中的字符”,找到后将SIGN单元置1,否则SIGN单元置0。catt db 'asdddd'sign db ?mov ax,extramov es,axmov sign,0mov al,''lea di,cattcldmov cx,7repnz scasbjcxz neemov sign,1nee: mov ah,4chint 21h17 写程序段。在长度为N的字数组VALUE中统计负数的个数并保存到AX中。value dw 2,-4,-5,3,6,6,-8n equ ($-value)/2 ;元素个数start: mov ax,datamov ds,axmov cx,nmov bx,0mov ax,0rept1:mov si,valuebx ;取出元素cmp si,0 jge let1 ;0 转let1inc ax ;为负数,ax加1let1: add bx,2loop rept118 从键盘输入一个数字,在屏幕上显示出以该数字开始10个数字串。CODE SEGMENTASSUME CS:CODESTART: MOV AH,1INT 21HMOV CX,10MOV BL,ALREPT1: CMP BL,'9'JLE NEXTSUB BL,10NEXT: MOV DL,BLMOV AH,2INT 21HINC BLLOOP REPT1MOV AH,4CHINT 21HCODE ENDSEND START19 data segmentbunch1 db 'stadent'bunch2 db 'studEnt'data endscode segmentassume cs:code,ds:data,es:datastart:mov ax,datamov ds,axmov es,axlea si,bunch1lea di,bunch2mov bx,0 ;bh=相同的个数,bl=不同的个数mov cx,7let1:mov al,sicmp al,di ;两字符比较jz equl ;相同转equlinc bl ;不同bl加1jmp out1equl: inc bhout1:inc siinc diloop let1mov dl,'n' ;显示'n',代表不同mov ah,2hint 21hadd bl,30h ;加上ASCII码mov dl,bl ;显示不同的个数int 21hmov dl,'e' ;显示'e',代表相同int 21hadd bh,30hmov dl,bh ;显示相同的个数int 21h mov ah,4chint 21hcode endsend start21 DATA SEGMENTSTR DB SDABF G H0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DI,STRSPACE:MOV CX,10MOV AL,DICMP AL,0JE OUTCMP AL,20HJE DELETEJMP EXITSUB CX,DIMOV SI,DIDELETE:MOV BL,SI+1MOV SI,BLINC SILOOP DELETEEXIT:JMP SPACEOUT:MOV AH,4CHINT 21HCODE ENDSEND START23 设计思路:(1) 用EQU伪指令获得需转换的十进制数的个数;(2) 用双重循环。外循环控制个数,用x作为中间变量;(3) 内循环将一个3位十进制数去掉ASCII码后按位数扩大10倍再相加,保存后即存储为二进制数;(4) 分两个数组保存ASCII码表示的十进制数和转换后的二进制数。程序如下: ; 6-23.asm 将内存中用ASCII码表示的100以内的十进制数转变为二进制数data segmentscore1 db 36h,37h,20h,31h,30h,30h,38h,35h,20h,31h,30h,30h ;即67,100,85,100x dw ?n equ 3 ;三位数num equ (x-score1)/n ;十进制数个数score2 dw num dup(0) ;保存转换后的二进制数data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov cx,num mov si,-2mov bx,0rept1: push cx ;保存外循环次数mov cx,nrept2: mov al,score1bx ;从score1取数cmp al,30h ;判断是否0-9jl exitcmp al,39hjg exitand ax,000fh ;去掉ASCII码xchg ax,x mov dx,10 ;将ax中前一次形成的数扩大10倍mul dx xchg ax,xadd x,ax ;相加后保存到xexit: inc bx ;取下一位数loop rept2pop cx ;弹出外循环次数add si,2mov ax,xmov score2si,ax ;转换后的数据保存到score2mov x,0 loop rept1mov ah,4chint 21hcode endsend start习题七12 功能:两个字节数相加。X和BL相加保存到Y。13 功能:键盘输入的字符保存到KEY单元中,直到按回车为止。14 功能:将X单元中的十六进制3AH变为十进制入栈保存,AH中为余数。先将0008H入栈,再将0005H入栈,结果为58。16 PUSH AXPUSH BXMOV BX,0LET1:MOV AH,1INT 21HCMP AL,0DH ;输入回车退出JZ EXITMOV BUFFERBX,AL ;保存到BUFFERINC BXJMP LET1EXIT:POP BXPOP AXRETKEY_IN ENDP17 KEY_IN_DEC PROC PUSH AXPUSH BXMOV X,0MOV BX,0MOV SI,0LET1:MOV AH,1INT 21HCMP AL,0DH ;输入回车退出JZ EXITMOV BUFFERSI,AL ;保存到BUFFERINC SIJMP LET1EXIT:MOV CX,SI ;位数放在CXMOV SI,0LET2:MOV AL, BUFFERSISUB AL,30HMOV AH, 0XCHG AX,X ;形成十进制数MOV BX,10MUL BXXCHG AX,XADD X,AX ;保存INC SILOOP LET2POP BXPOP AXRETKEY_IN _DEC ENDP23 calcu procpush axpush bxpush simov ax,0mov al,xand al,aljns zzneg almov fuhao,'-'zz:mov si,0mov bx,10 ;将ax变为十进制数真值let1:mov dx,0inc si ;统计余数个数idiv bxmov ysi, dx ;在y单元保存余数cmp ax,0jnz let1pop sipop bxpop axretcalcu endp30 DATA SEGMENTA DB 9,-8,-7,6,5B DB -8,7,6,-5,4SUM1 DB ?SUM2 DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,5MOV SI,OFFSET ACALL LADDMOV SUM1,BLMOV SI,OFFSET BCALL LADDMOV SUM2,BLMOV AH,4CHINT 21HLADD PROC NEARPUSH CXPUSH AXPUSH SIXOR BL,BLNEXT: MOV AL, SIAND AL,ALJNS JJJADD BL,ALJJJ: INC SILOOP NEXTPOP SIPOP AXPOP CXRETLADD ENDPCODE ENDSEND START习题八16 宏的作用:DOS功能调用。功能号用哑元指出。17 宏的作用:两个操作数相加,结果保存在第3个数中。18 宏的作用:DOS的2号显示功能。19 宏的作用:定义VALUE数组,数组长度和初值由哑元指出。20 缺少标号定义LOCAL LETT1。宏的作用:两个哑元相减,结果为负则求补。27 程序:.model small.stack 100h.codestart:input ;键盘输入add al,20h ; 大写变为小写output al ; 显示mov ah,4chint 21hend start28 程序:.model small.data alpha db Computer.codestart:display alpha ;显示字串mov ah,4chint 21hend start29 程序:.model small.stack 100h.codestart:input ;键盘输入cmp al,-jnz startneg x ;求补mov ah,4chint 21hend start30 程序:.model small.stack 100h.codestart:input ;键盘输入mov bl,alinput ;输入第2个数add al,blmov ah,0aaa ;非压缩BCD码加法调整add ax,3030h output ah ;显示高位output al ;显示低位mov ah,4chint 21hend start