习题一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=AAH25E8AH,0BE6H,3DEH,4940H300011101+00110101=01010010=5 2H=8201001001+11101000=00110001=3 1H=4910111110+01010010=00010000=1 0H=1610011010+11110001=10001011=8 BH= -117400101001+01010011=01111100+0 0000110=10000010=82H=82 01110011-00100100=01001111-00000110=01001001=49H=49 01100110+00011000=01111110+0 0000110=10000100=84H=84 0000000100110010+01110101=00 00000110100111+00000110=0000001000000111=0207H=207 5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H6 无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH7(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) -92-37=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 10021 执行R CX,然后输入10022 执行E DS:0 ‘a’ ‘b’ ‘c’ ‘d’习题三3MOV AX,BX 源操作数为寄存器寻址,EA 无,物理地址无MOV AX,1290H 立即寻址,EA 无,物理地址无MOV AX,[BX] 寄存器间接寻址,EA=1290H, 物理地址=2FBB0HMOV AX,DS:[1290H] 直接寻址,EA=1290H, 物理地址=2FBB0HMOV AX,[BP] 寄存器间接寻址,EA=6756H, 物理地址=26A56HMOV [DI][BX],AX 目的操作数为基址变址寻址,EA=3C06H, 物理地址=32526H MOV ES:[SI],AX 寄存器间接寻址,EA=348AH, 物理地址=50CAAH7MOV AX,[CX] 错。
CX不能为间址寄存器MOV AL,1200H 错。
立即数超出8位寄存器范围MOV AL,BX 错。
两个操作数不匹配MOV [SI][DI],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) MOVAX,VALUE[SI] (6) SUBAX,DS:[2000H]9(1) ADD AX,[X+4]MOV Y,AX(2) MOV BX,4ADD AX,X[BX]MOV Y,AX(3) MOV BX,4MOV SI,OFFSET XADD AX,[BX+SI]MOV 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的偏移地址。
13MOV 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) 加法:MOVAX,8576H MOV AX,8576HMOVBX,9988H MOV BX,9988HSUBAX,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 ;余数保存在BH AND 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.code start: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,2int 21hmov dl,bl ;显示6int 21hmov ah,4chint 21hend start26data segmentx 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,x[bx] ;取出平方根数字mov y[si],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 ;要查的学号.codestart:mov ax,@datamov ds,axmov al,u ;给出学号mov cl,10mul cl ;u*10=30(号单元开始)mov ah,0mov dx,ax ;地址保存到dxmov ah,9 ;9号功能显示字符串int 21h mov ah,4chint 21hend start28 编程实现公式计算Z=X/4+16Y。