第一章 计算机基础 (P32)
1-3 写出下列机器数的真值:
(1)01101110 (2)10001101 (3)01011001 (4)11001110 答案:
(1)+110 (2)-13(原码) -114(反码)-115(补码) (3)+89 (4)-78(原码)-49(反码)-50(补码)
1-4 写出下列二进制数的原码、反码和补码(设字长为8位): (1)+010111 (2)+101011 (3)-101000 (4)-111111 答案:
(1)[x]原=00010111 [x]反= 00010111 [x]补= 00010111 (2)[x]原=00101011 [x]反= 00101011 [x]补= 00101011 (3)[x]原=10101000 [x]反= 11010111 [x]补= 11011000 (4)[x]原=10111111 [x]反= 11000000 [x]补=11000001
1-5 当下列各二进制数分别代表原码,反码,和补码时,其等效的十进制数值为多少?
(1)00001110 表示原码14, 反码14,表示补码为14 (2)11111111 表示原码-127, 反码-0,表示补码为-1 (3)10000000 表示原码-0, 反码-127,表示补码为-128 (4)10000001 表示原码-1, 反码-126,表示补码为-127
1-6 已知x1=+0010100,y1=+0100001,x2=-0010100,y2=-0100001,试计算下列各式。(字长8位)
(1)[x1+y1]补 (2)[x1-y2]补 (3)[x2-y2]补 (4)[x2+y2]补 (5)[x1+2*y2]补 (6)[x2+y2/8]补 答案:
(1)[x1+y1]补=[00010100+00100001]补=[00110101]补=00110101 (2)[x1-y2]补=[x1]补+[-y2]补=00010100+00100001=00110101 (3)[x2-y2]补=[x2]补+[-y2]补=11101100+00100001=00001101 (4)[x2+y2]补=[x2]补+[y2]补=11101100+11011111=11001011
(5)[x1+2*y2]补=[x1]补+[2*y2]补=00010100+10111110=11010010 (6)[x2+y2/8]补=11101100+[y2/8]补=11101100+11111100=11101000
1-7 用补码来完成下列运算,并判断有无溢出产生(字长为8位): (1)85+60 (2)-85+60 (3)85-60 (4)-85-60 答案:
(1)[x]补+[y]补=01010101+00111100=10010001 = -111,有溢出 (2)[x]补+[y]补=10101011+00111100=11100111 =-25,无溢出
(3)[x]补+[y]补= 01010101+11000100=00011001 =25,无溢出 (4)[x]补+[y]补=10101011+11000100=01101111 =111,有溢出
1-8在微型计算机中存放的两个补码数,试用补码加法完成计算,并判断有无溢出产生。
(1)[x]补+[y]补=01001010+01100001=10101011 有溢出
(2)[x]补-[y]补=01101100-01010110 = 01101100+10101010=00010110
无溢出
注:[ X]补-[Y]补=[X]补+[-Y]补
[-Y]补的算法:将[Y]补连同符号位一起按位取反加1
1-9 试将下列各数转换成BCD码: (1)(30)10 (2)(127)10 (3)00100010B (4)74H 答案: (1)(30)10 = (0011 0000)BCD (2)(127)10 = (0001 0010 0111)BCD
(3)00100010B = 34 = (0011 0100)BCD
(4)74H = (116)10 = (0001 0001 0110)BCD
1-10 下列各数代表什么ASCII字符:
(1)41H (2) 72H (3) 65H (4) 20H 答案:
(1)41H =(0100 0001)2,代表字符A。 (2)72H = (0111 0010)2,代表字符r。 (3)65H = (0110 0101)2,代表字符e。 (4)20H = (32)10 = (0010 0000)2, 代表SP。
1-11 写出下列字符的ASCII码: 9,*,=,!,$
答案: 9 0011 1001 * 0010 1010 = 0011 1101 ! 0010 0001 $ 0010 0001
1-21 试用示意图说明内存储器的结构和读、写操作。 参考课本P22
第二章 80X86/Pentium微处理器(P90)
2-3 在执行指令期间,EU能直接访问存储器吗?为什么?
答:不能,因为CPU由EU和BIU组成,在指令执行期间,EU负责到BIU指令队列去取指令,执行指令,如果需要从存储器取数据,由BIU负责总线操作。
2-7 8086/8088有几位状态位?有几位控制位?其含义分别是什么? 答:8086/8088有6位状态位,3位控制位。
状态位:CF进位标志;PF奇偶标志;AF辅助进位标志;ZF零标志;SF符号标志,OF溢出标志。
控制位:IF 允许中断标志;DF方向标志;TF陷阱标志
2-9 简述A0与/BHE在8086系统中的作用。 答:8086有16根数据线,可以在一个总线读写周期中,读写一个字数据。8086CPU配置的内存分为奇地址和偶地址存储体。如果要读写一个字数据,需要分别从奇地址和偶地址存储体读写一个字节数据。由A0=0选通偶地址存储体,一个字节数据送到低八位数据线D0~D7;由/BHE=0选通奇地址存储体,一个字节数据送到高八位数据线D8~D15。
2-19设双字12345678H的起始地址是A001H,试说明这个双字在存储器中如何存放?
答:地址为A001H、A002H、A003H、A004H的存储单元分别存放:78H、56H、34H、12H。存放原则:低地址存放低位数据,依次存放在连续的存储单元中。
2-20 已知堆栈段寄存器SS=A000H,堆栈指示器SP=0100H,试将数据1234ABCDH推入堆栈,画出进栈示意图。最后栈顶SP=? 答: SP=00FCH
物理地址 0A00FCH---0A00FFH的内容依次为CD,AB,34,12.
注:SP:堆栈栈顶指示器,16位寄存器,存放栈顶的偏移地址。
2-21 试求出下列运算后的各个状态标志,并说明进位标志和溢出标志的区别。 (1)1278H+3469H (2)54E3H-27A0H (3)3881H+3597H (4)01E3H-01E3H 解:(1) 0001 0010 0111 1000 + 0011 0100 0110 1001 0100 0110 1110 0001
CF=0 PF=1 AF=1 ZF=0 SF=0 OF=0
(2) 0101 0100 1110 0011 + 1101 1000 0110 0000 1 0010 1101 0100 0011
CF=0 PF=0 AF=0 ZF=0 SF=0 OF=0
(3) 0011 1000 1000 0001 + 0011 0101 1001 0111 0110 1110 0001 1000
CF=0 PF=1 AF=0 ZF=0 SF=0 OF=0
(4) 0000 0001 1110 0011 + 1111 1110 0001 1101 1 0000 0000 0000 0000
CF=0 PF=1 AF=0 ZF=1 SF=0 OF=0
注:16位操作数的最低二进制位:b0、最高二进制位:b15 AF:看b3是否向b4有进(借)位:辅助进借位
2-24 什么是时钟周期,机器周期,总线周期,什么是指令周期? 参考课本P55。
第三章 80X86/Pentium指令系统(P135)
3-5
寻址方式:要注意题目要求是源操作数还是目的操作数。
(1)MOV SI,2100H (2)MOV CX,DISP[BX] (3)MOV [SI],AX (4)ADC AX,[BX][SI] (5)AND AX,DX (6)MOV AX,[BX+10H] (7)MOV AX,ES:[BX] (8)MOV AX,[BX+SI+20H] (9)MOV [BP],CX (10)PUSH DS
参见课本内容,掌握寻址方式和EA、PA的计算。 地址表达式:标号/变量/常量+基址寄存器+变址寄存器
[地址表达式]:存储器操作数,以地址表达式的值为偏移地址 如下:是否正确? MOV AX, [SI][DI] MOV AX, [BX][BP] MOV AX, [ELEMS+CX] MOV AX,[ELEMS+100-SI] MOV BX, [AX] 3-8 (1)AX=3355H, SP=1FFFEH
(2) AX=3355H, DX=4466H, SP=1FFFEH
3-12 (3)BX=0056H, AX=1E40H (4)SI=00F6H, [SI]=0024H
(5)AX=5678H, [09226H]=1234H
3-14 (1)MOV AX,0 XOR AX,AX
(2)MOV CL,4 ROR BL,CL
(3)假设N1、N2、M1、M2都为字节变量,则 MOV AX,N1 CWD IDIV N2 MOV M1,AL MOV M2,AH
(4)AND BX,1111011110101111b (5)XOR AX 4020H
(6) TEST DX,0000001000000001b
JZ ZERO;ZF=1说明bo、b9全为0 TEST DX,0000000000000001b
JZ B0ZERO; ZF=1说明bo为0 TEST DX,0000001000000000b JZ B9ZERO; ZF=1说明b9为0 …; bo、b9全为1
ZERO:…
B0ZERO:… B9ZERO:…
(7) OR CX,1 3-17
NUM1 DW 4148H,2816H NUM2 DW 2258H,8452H (1) MOV AX,NUM2 ADD NUM1,AX MOV AX,NUM2+2 ADD NUM1+2,AX (2) RES DB 2DUP(?)
MOV AL,BYTE PTR NUM1 ADD AL,BYTE PTR NUM1+1 ADD AL,BYTE PTR NUM1+2 ADD AL,BYTE PTR NUM1+3 MOV RES,AL
(3) 假设存放的数据为无符号数 MOV SI,OFFSET NUM1 XOR AX,AX MOV CX,8 LP:ADD AL,[SI] ADC AH,0 INC SI
LOOP LP MOV RES,AL MOV RES+1,AH
假设存放的数据为带符号数 MOV SI,OFFSET NUM1 XOR BX,BX MOV CX,8 LP:MOV AL,[SI] CBW
ADD BX,AX INC SI LOOP LP MOV RES,AL MOV RES+1,AH (4) MOV AX,NUM1 ADD NUM2,AX MOV AX,NUM1+2 ADC NUM2+2,AX 3-18 (1) XOR AX, AX ;AX清零 LEA SI, NUM1 MOV CX, 8 LOP: ADD AL, [SI] DAA
ADC AH, 0 ;AF清零 INC SI LOOP LOP MOV RES, AL
MOV RES+1, AH (2) MOV AL, NUM1
SUB AL, NUM2 DAS
MOV RES, AL
差=90H; CF=1 3-21
(1)BX=9AH (2)BX=61H (3)BX=8071H (4)BX=10F7H (5)BX=0FF1CH 3-23
(1)将自FIRST开始的存储区中的连续10个字节传送到从SECOND开始的存储区中。 (2)将自0404H开始的存储区中连续256个字节全部赋0值。 3-27
(1)IP=1256H (2)IP=3280H (3)IP=2450H 3-28
CS=2000H; IP=009AH; SP=0F178H; [SP]=8FH [SP+1]=3DH; [SP+2]=50H; [SP+3]=40H; 3-29 MOV BL,AL CMP AL,01H JZ LAB1 CMP AL,02H JZ LAB2 CMP AL,04H JZ LAB3 AND BL,07H JNZ OK …… OK: …… LAB1: …… LAB2: …… LAB3: …… 3-31 MOV AX,0032H CMP AX,X JL N_HIGH MOV BX,X SUB BX,Y JO OVERFLOW JNS NEXT NEG BX
NEXT: MOV RESULT,BX
N_HIGH: …… OVERFLOW: ……
第四章4-2 内存分配和预置数据
VAR1 DB 12,-12H,3 DUP(0,0FFH) VAR2 DB 100 DUP(0,2 DUP(1,2),0,3) VAR3 DB ‘WELCOME TO’
汇编语言程序设计(P195)
VAR4 DW VAR3+6 ;存放的是偏移地址
VAR5 DD VAR3 ;存放的是偏移地址、段地址 4-3
(1)DATA1 DB 86H,27H,23H,00H,24H,1AH (2)DATA2 DW 0B430H,1062H
(3)DATA3 DB 4DUP(20H),20,0,6DUP(1,2) 4-5
(1)VAR1的偏移量是0030H;VAR2的偏移量是003AH (2)CNT=0010H
(3)VAR2+2单元的内容是02H 4-11
DATA SEGMENT X DB 4 DUP(?) Y DB 4 DUP(?) Z DB 4 DUP(?) ;定义X,Y,Z为字节变量 DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DL,0 MOV AX,WORD PTR X SUB AX,WORD PTR Y ;X,Y低16位相减 MOV WORD PTR Z,AX ;结果存入Z的低16位 MOV AX,WORD PTR X[2] SBB AX,WORD PTR Y[2] ;X,Y高16位相加 MOV WORD PTR Z[2],AX ;结果存入Z的高16位 JNO OK MOV DL,-1 ;溢出 OK: MOV AH,4CH INT 21H CODE ENDS END START
4-13
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV GOOD,0 MOV PASS,0 MOV BAD,0
XOR BX,BX ;bx存放全年级统计总成绩 XOR SI,SI MOV CX,100
LP: MOV AH,BUF[SI]
CMP AH,85H JA GS CMP AH,60H JAE PS
MOV AL,BAD ADD AL,1 DAA MOV BAD,AL JMP AGAIN GS: MOV AL,GOOD ADD AL,1 DAA MOV GOOD,AL JMP AGAIN PS: MOV AL,PASS ADD AL,1 DAA MOV PASS,AL AGAIN: MOV AL,BL ADD AL,AH DAA MOV BL,AL
MOV AL,BH ADC AL,0 DAA MOV BH,AL
INC SI LOOP LP
MOV AVRG,BH MOV AH,4CH INT 21H CODE ENDS END START 4-15
DATA SEGMENT
FIRST DB '...$' COUNT EQU 100 RESULT DW ? DATA ENDS
;定义字符串 ;定义字符串长度 ;定义存放结果单元 STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET FIRST ;建立数据指针 MOV CX,COUNT ;设置循环次数 MOV DX,0 ;清零计数器 LP: CMP BYTE PTR [BX],'A' JNZ NEXT ;非'A'则转到NEXT INC DX ;是'A'则计数器DX加1 NEXT: INC BX ;调整数据指针 LOOP LP ;循环100次 MOV RESULT,DX ;结果存入RESULT MOV AH,4CH INT 21H CODE ENDS END START 4-17
DATA SEGMENT
DATA_W DW X1,X2,… COUNT EQU ($-DATA_W)/2 COUT1 DW 0 COUT2 DW 0 COUT3 DW 0 DATA ENDS
STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET DATA_W ;建立数据指针 MOV CX,COUNT ;设置循环次数 LP: CMP WORD PTR [BX],0 JGE NEXT INC COUT2
JMP AGAIN NEXT: JG NEXT2 INC COUT3
JMP AGAIN
NEXT2: INC COUT1 AGAIN:INC BX ;调整数据指针 INC BX
LOOP LP ;循环100次
MOV AH,4CH INT 21H CODE ENDS END START 4-18
DATA ESGMENT
ARRAY DB D1,D2,...,DN ;定义字节数组 COUNT EQU $-ARRAY ;字节数组长度赋予符号名COUNT MAX DB ? MIN DB ?
DATA ENDS
STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET ARRAY ;建立数据指针 MOV CX,COUNT-1 ;设置循环次数 MOV AL,[BX] MOV MAX,AL ;MAX赋予初值为ARRAY的第一个数据 MOV MIN,AL ;MIN赋予初值为ARRAY的第一个数据 LP: INC BX ;调整数据指针 MOV AL,[BX] ;取数据 CMP AL,MIN ;与MIN进行比较 JNB BIG ;比MIN大则跳转BIG判断是否最大值 MOV MIN,AL ;小于或等于MIN则给MIN重新赋值 JMP NEXT ;比较下一个数据 BIG: CMP AL,MAX ;与MAX进行比较 JNA NEXT ;比MAX小则比较下一个数据 MOV MAX,AL ;大于或等于MAX则给MAX重新赋值 NEXT: LOOP LP MOV AH,4CH INT 21H CODE ENDS END START
4-19
MOV AX,DATA MOV DS,AX
MOV AL,0 ;AL存放绝对值最大的数 MOV SI,0 ;SI作为指针 MOV CX,256 LP: CMP BLOCK[SI],0 JGE NEXT
NEG BLOCK[SI] ;负数取相反数 NEXT:CMP AL,BLOCK[SI] JAE NEXT2
MOV AL,BLOCK[SI] NEXT2:INC SI
LOOP LP MOV MAX,AL 4-23
MOV CH,0 MOV SI,0
LP: CMP STRING[SI],0DH JZ OVER INC CH INC SI JMP LP OVER: 4-32
STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS DATA SEGMENT
STR1 DB 8 DUP(0) ;存储输入的6位十进制数ASCII码,STR1[2]~STR1[7],分别保存十万~个位,下同 STR2 DB 8 DUP(0) SUM DB 8 DUP(0) ;存储结果的ASCII码 BCD1 DB 3 DUP(0) ;存储输入的6位十进制数的压缩BCD码,BCD1[2]~BCD1[0],分别保存十万~个位,下同 BCD2 DB 3 DUP(0) BCDSUM DB 4 DUP(0) ;存储结果的BCD码
MESG1 DB 'PLEASE INPUT THE FIRST NUMBER : $' MESG2 DB 'PLEASE INPUT THE SECOND NUMBER : $' MESG3 DB 'THE SUM IS : $' DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
HCHH PROC FAR ;回车换行子函数子程序 MOV AH,02H MOV DL,0DH INT 21H
MOV DL,0AH INT 21H RET HCHH ENDP
GETSTR PROC FAR ;从键盘输入字符串子程序 MOV AH,0AH INT 21H ;调用10(0AH)号DOS中断,从键盘输入字符串 RET GETSTR ENDP
ASCTOBCD PROC FAR ;ASCII转BCD码子程序,SI指向ASCII串,DI指向BCD串
MOV CX,3 NEXT1: MOV AL,[SI] SUB AL,30H PUSH CX MOV CL,4 SHL AL,CL POP CX
MOV [DI],AL INC SI MOV AL,[SI] SUB AL,30H ADD [DI],AL DEC DI INC SI
LOOP NEXT1 RET ASCTOBCD ENDP
BCDADD PROC FAR ;两个BCD码相加子程序,SI和DI指向两个被加数,BX指向结果
MOV CX,3 NEXT2: MOV AL,[SI] MOV AH,[DI] ADC AL,AH DAA
MOV [BX],AL INC SI INC DI INC BX LOOP NEXT2 JNC NEXT3 ;如果结果有第7位,则将这位写入结果中 MOV BCDSUM[3],1 NEXT3: RET BCDADD ENDP
BCDTOASC PROC FAR ;BCD码转ASCII码子程序,SI指向BCDASCII串,DI指向ASCII串 MOV CX,3
CMP BCDSUM[3],1 ;如果结果有第7位,则将这位转变为ASCII码 JNE NEXT4
MOV SUM[0],31H NEXT4: MOV AL,[SI] ;转变剩下的6位 AND AL,0F0H PUSH CX MOV CL,4 SHR AL,CL POP CX ADD AL,30H MOV [DI],AL INC DI
MOV AL,[SI] AND AL,0FH ADD AL,30H MOV [DI],AL INC DI DEC SI
LOOP NEXT4
MOV SUM[7],24H ;9号DOS中断的要求,被显示串要以'$'结尾 RET BCDTOASC ENDP
DISP PROC FAR ;显示字符串子程序 LEA DX,SUM MOV AH,09H INT 21H ;调用9号DOS中断,显示字符串 RET DISP ENDP
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESG1 ;显示\ MOV AH,09H INT 21H
LEA DX,STR1
MOV STR1[0],7 CALL GETSTR ;从键盘输入字符串,即6位十进制数 CALL HCHH LEA SI,STR1[2] LEA DI,BCD1[2] CALL ASCTOBCD ;ASCII转BCD码
MOV DX,OFFSET MESG2 ;显示\ MOV AH,09H
INT 21H LEA DX,STR2 MOV STR2[0],7 CALL GETSTR ;从键盘输入字符串,即6位十进制数 CALL HCHH LEA SI,STR2[2]
LEA DI,BCD2[2] CALL ASCTOBCD ;ASCII转BCD码 LEA SI,BCD1 LEA DI,BCD2
LEA BX,BCDSUM
CALL BCDADD LEA SI,BCDSUM[2] LEA DI,SUM[1] CALL BCDTOASC ;两个BCD码相加 MOV DX,OFFSET MESG3 MOV AH,09H INT 21H CALL HCHH CALL DISP ;显示结果字符串 MOV AH,4CH INT 21H CODE ENDS
END START
第五章 半导体存储器(P221)
5-5
所占地址空间:20000H-27FFFH 5-6
1#: 8000H-87FFH 2#: 8800H-8FFFH 3#: 9000H-97FFH 4#: 0A000H-0A3FFH 5#: 0A400H-0A7FFH 6#: 0A800H-0ABFFH 7#: 0AC00H-0AFFFH
5-7 用2-4译码器来产生4片的片选信号,各片的地址分别是: 0# 80000H-807FFH 1# 80800H-80FFFH 2# 81000H-817FFH 3# 81800H-81FFFH
第六章 输入输出和中断技术(P269)
6-2 参见课本P224 6-4 MOV DX,PORT_IN IN AL,DX MOV CX,8 CMP AL,01H JNE NEXT LP1: OUT DX,AL CALL DELAY ROL AL,1 LOOP LP1 JMP EXIT NEXT: CMP AL,02H JNE EXIT MOV AL,80H
LP2: EXIT:
6-5 MOV BX,OFFSET STRING PRINT0: IN AL,STATUS AND AL,80H JNZ PRINT0 MOV AL,[BX] OUT DATAS,AL INC BX CMP AL,0DH JNE PRINT0 MOV AH,4CH INT 21H 6-6
LEA BX,DATABUF MOV CX,100
AGAIN: IN AL,STATUS
TEST AL,80H JZ AGAIN IN AL,DATAS MOV [BX],AL INC BX LOOP AGAIN
6-11 因为CPU在中断响应时,执行中断服务程序之前,会自动对FR寄存器的IF和TF清零,在中断服务程序中,如果允许中断嵌套,则必须开中断。 6-12 参见课本P244 6-13
OUT CALL ROR LOOP MOV OUT MOV INT DX,AL DELAY AL,1 LP2 AL,0H DX,AL AH,4CH 21H
SP=0100H-6=00FAH SS=0300H IP=0040H CS=0100H PSW=0040H
堆栈最上面的3个字的内容为:00A2H(IP),0900H(CS),0240H(PSW) 注:中断响应时PSW推入堆栈后将IF,TF清零。
6-16
IR3上中断请求信号有效,其他没有中断请求 CPU正在为IR3进行中断服务程序 20H,05H 6-18
MOV AL,13H ;ICW1 MOV DX,0FFDCH OUT DX,AL
MOV AL,90H ;ICW2 MOV DX,0FFDDH OUT DX,AL
MOV AL,01H ;ICW4 OUT DX,AL
6-21读8259A相关寄存器的内容。
8259A的端口地址为20H、21H,读入IRR、ISR、IMR寄存器的内容,并相继保存在数据段内偏移地址为2000H开始的内存单元中。
MOV AL,xxx01010B 发OCW3,欲读取IRR的内容 OUT 20H,AL
IN AL,20H 读入并保存IRR的内容 MOV [2000H],AL
MOV AL,xxx01011B 发OCW3,欲读取ISR的内容 OUT 20H,AL
IN AL,20H 读入并保存ISR的内容 MOV [2001H],AL
IN AL,21H 读入并保存IMR的内容 MOV [2002H],AL