1、第一章1.1 解:五代,详细见书1.2 解: 微型计算机:以大规模、超大规模集成电路为重要部件,以集成了计算机重要部件控制器和运算器微解决器为核心,所构造出计算机系统 。PC机:PC(Personal Computer)机就是面向个人单独使用一类微机 。单片机:用于控制微解决器芯片,内部除CPU外还集成了计算机其她某些重要部件,如:ROM、RAM、定期器、并行接口、串行接口,有芯片还集成了A/D、D/A转换电路等。 数字信号解决器DSP:重要面向大流量数字信号实时解决,在宿主系统中充当数据解决中心,在网络通信、多媒体应用等领域正得到越来越多应用1.3 解:微机重要有存储器、I/O设备和I/O接
2、口、CPU、系统总线、操作系统和应用软件构成,各某些功能如下:CPU:统一协调和控制系统中各个部件系统总线:传送信息存储器:存储程序和数据I/O设备:实现微机输入输出功能I/O接口:I/O设备与CPU桥梁操作系统:管理系统所有软硬件资源1.4 解:系统总线:传递信息一组公用导线,CPU通过它们与存储器和I/O设备进行信息互换 。好处:组态灵活、扩展以便 三组信号线:数据总线、地址总线和控制总线 。其使用特点是:在某一时刻,只能由一种总线主控设备来控制系统总线,只能有一种发送者向总线发送信号;但可以有各种设备从总线上同步获得信号。1.5解:(1)用于数值计算、数据解决及信息管理方向。采用通用微机
3、,规定有较快工作速度、较高运算精度、较大内存容量和较完备输入输出设备,为顾客提供以便和谐操作界面和简便快捷维护、扩充手段。(2)用于过程控制及嵌人应用方向。采用控制类微机,规定能抵抗各种干扰、适应现场恶劣环境、保证长时间稳定地工作,规定其实时性要好、强调其体积要小、便携式应用强调其省电。1.6 解:1.7 解: I/O通道:位于CPU和设备控制器之间,其目是承担某些本来由CPU解决I/O任务,从而把CPU从繁杂I/O任务中解脱出来。由10根信号线构成(A9-A0)。1.8解: BIOS:基本输入输出系统。重要功能:用来驱动和管理诸如键盘、显示屏、打印机、磁盘、时钟、串行通信接口等基本输入输出设
4、备1.9 解:基本RAM区:640KB保存RAM区:128KB扩展ROM区:128KB基本ROM区:128KB1.10 解:(1)、数用来直接表征量大小,涉及:定点数、浮点数。(2)、码用来指代某个事物或事物某种状态属性,涉及:二进制、八进制、十进制、十六进制。区别:使用场合不同,详见P16.1.11 解:(1)(2)(3)1.12 解:原码 反码 补码+37 00100101/25H 00100101/25H 00100101/25H-37 10100101/A5H 11011010/DAH 11011011/DBH1.13 解: +37 -3716位 32位16位 32位00 25H00
5、00 00 25HFF 5BHFF FF FF 5BH1.14 解:无符号数:70D补码有符号数:70DBCD码:46DASCII:F1.15 解:1)、相加后若浮现和不不大于9,则将和减去10后再向高位进12)、若浮现组间进位,则将低位加61.16 解:详见课本16页。1.17 解:C3 40 20 001.18 解:5050H十进制值5080二进制十六进制二进制十六进制0011 0010B32H0101 0000B50H1.19 解:D:44Hd:64HCR:0DHLF:0AH0:30HSP:20HNUL:00H1.20 解:国标码:36 50H机内码:B6 B0H第二章21算术逻辑单元A
6、LU、寄存器组和控制器;总线接口单元BIU:管理8088与系统总线接口负责cpu对接口和外设进行访问执行单元EU:负责指令译码、执行和数据运算;8位cpu在指令译码前必要等待取指令操作完毕,8088中需要译码指令已经取到了指令队列,不需要等待取指令。而取指令是cpu最为频繁操作,因而8088构造和操作方式节约了大量等待时间,比8位cpu节约了时间,提高了性能。228个8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL;8个16位寄存器:累加器AX、基址寄存器BX、计数器CX、数据寄存器DX、源地址寄存器SI、目地址寄存器DI、基址指针BP、堆栈指针SP。23标志用于反映指令执行成果或者
7、控制指令执行形式。状态标志用于记录程序运营成果状态信息;控制标志用于控制指令执行形式。24例:有运算:3AH+7CH=B6H 作为无符号数运算,没有进位,CF=0; 作为有符号数运算,成果超过范畴,OF=1.2.58088中每个存储单元有唯一20位地址,称为物理地址。解决器通过总线存取存储器数据时,采用这个物理地址。在顾客编程过程中采用“段地址:偏移地址”形式称为逻辑地址。将逻辑地址中段地址左移4位,加上偏移地址就得到物理地址。1MB最多能提成65536个逻辑段。26 代码段:存储程序指令序列; 堆栈段:拟定堆栈所在主存储区; 数据段:存储当前运营程序数据; 附加段:附加数据段,用于数据保存。
8、此外串操作指令将其作为目操作数存储区。278088存储空间分段管理,程序设计时采用逻辑地址。由于段地址在默认或指定段寄存器中,因此只需要偏移地址,称为有效地址EA.操作数在主存中有如下几种寻址方式:直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址。28(1)及时数寻址 ax:1200H(2)寄存器寻址 ax:0100H(3)存储器直接寻址 ax:4C2AH(4)寄存器间接寻址 ax:3412H(5)寄存器间接寻址 ax:4C2AH(6)基址变址寻址 ax:7856H(7)相对基址变址寻址 ax:65B7H29(1)cx为字寄存器,dl为字节寄存器,类型不匹配。(2)mo
9、v指令目操作数只能是寄存器或者主存单元,ip是指针。(3)不容许及时数到段寄存器传送。(4)不容许段寄存器之间直接传送。(5)数据溢出。(6)sp不能用于寄存器间接寻址。(7)格式不对。应为:mov ax,bx+di(8)mov指令操作数不能是及时数。210(1)bx得到table偏移地址,bx=200H.(2)将及时数8送到al。(3)换码,al=12H.211(1)al=89H(2)al=12H,cf=1,zf=0,sf=0,of=1,pf=1(3)al=0AFH,cf=0,zf=0,sf=1,of=0,pf=1(4)al=0AFH,cf=1,zf=0,sf=1,of=1,pf=1(5)a
10、l=0,cf=0,zf=1,sf=0,of=0,pf=1(6)al=0FFH,cf=0,zf=0,sf=1,of=0,pf=1(7)al=0,cf=0,zf=1,sf=0,of=0,pf=1212(1) add dx,bx(2) add al,bx+si(3) add word ptrbx+0B2H,cx(4) add word ptr0520H,3412H(5)add al,0A0H213运算公式:。商存储在ax,余数存储在dx。214(1)ax=1470H(2)ax=1470H,cf=0,of=0,sf=0,zf=0,pf=0(3)ax=1470H,cf=0,of=0,sf=0,zf=0,
11、pf=0(4)ax=0,cf=0,of=0,sf=0,zf=1,pf=1(5)ax=0FFFFH,cf=0,of=0,sf=0,zf=1,pf=1(6)ax=0FFFFH,cf=0,of=0,sf=1,zf=0,pf=12.15相对寻址方式、直接寻址方式、间接寻址方式。216(1)1256H(2)3280H217(1)ax=1E1EH(2)alD0、D7位不全为0(3)cx64H218执行65536次。219功能:将数组中每个字元素相加,成果存储于total。220(1)lea si,string Mov dh,si Mov dl,si+5(2)mov ax word ptr buffer1
12、Sub ax word ptr buffer2 Mov dx word ptr buffer1+2 Sbb dx word ptr buffer2+2(3) test dx,0F000Hjz eveneven:mov ax,0(4) mov cx,4again:sar dx,1 rcr ax,1 loop again(5) mov cx,100mov si,0again:mov al,0FFH add al,arraysi mov arraysi,al inc si loop again2.21Htoasc proc Mov bl,al Mov al,ah Mov bh,10 Mul bh A
13、nd ax,00FFH Add al,blHtoend:retHtoasc endp2.22计算机系统运用中断为顾客提供硬件设备驱动程序。在IBM-PC系列微机中,基本输入输出系统ROM-BIOS和DOS都提供了丰富中断服务程序,称为系统功能调用。调用环节(1)AH中设立系统功能调用号 (2)在指定寄存器中设立入口参数 (3)使用中断调用指令执行功能调用 (4)依照出口参数分析调用状况223Htoasc proc And al,0FH Add al,90H Daa Adc al,40H Daa Mov ah,02H Mov dl,al Int 21H RetHtoasc endp2.24Num
14、out proc Xor ah,ah Aam Add ax,3030H Mov dl,ah Mov ah,02H Int 21H Mov dl,al Mov ah,02H Int 31H RetNumout endp2.25Msgkey db”input number 0-9”,”$”Msgwrg db”error”,”$” Mov ah,09H Mov dx,offset msgkey Int 21HAgain: mov ah,01H Int 21H Cmp al,30H Jb disp Cmp al,39H Ja disp Mov dl,al Mov ah,02H Int 21H Jmp
15、doneDisp: mov dx,offset msgwrg Mov ah,09H Int 21H Jmp againDone: mov ah,02H Mov dl,al Int 21H第3章 3.1解:汇编语言是一种以解决器指令系统为基本低档程序设计语言,它采用助记符表达指令操作码,采用标记符号表达指令操作数,可以直接、有效地控制计算机硬件,因而容易创立代码序列短小、运营迅速可执行程序3.2 解:(1)完整汇编语言源程序由段构成(2)一种汇编语言源程序可以包括若干个代码段、数据段、附加段或堆栈段,段与段之间顺序可随意排列(3)需独立运营程序必要包括一种代码段,并批示程序执行起始点,一种程序只
16、有一种起始点(4)所有可执行性语句必要位于某一种代码段内,阐明性语句可依照需要位于任一段内(5)普通,程序还需要一种堆栈段3.3 解:存储模式特 点TINYCOM类型程序,只有一种不大于64KB逻辑段(MASM 6.x支持)SMALL小应用程序,只有一种代码段和一种数据段(含堆栈段),每段不不不大于64KBCOMPACT代码少、数据多程序,只有一种代码段,但有各种数据段MEDIUM代码多、数据少程序,可有各种代码段,只有一种数据段LARGE大应用程序,可有各种代码段和各种数据段(静态数据不大于64KB)HUGE更大应用程序,可有各种代码段和各种数据段(对静态数据没有限制)FLAT32位应用程序
17、,运营在32位80x86CPU和Windows 9x或NT环境3.4 解:开始位置:用标号指明返回DOS:运用DOS功能调用4CH子功能来实现汇编停止:执行到一条END伪指令时,停止汇编3.5 解:段定位、段组合和段类型。3.6 解:stack segment stackdb 1024(0)stack endsdata segment string db Hello,Assembly!,0dH,0aH,$data ends code segment codeassume cs:code,ds:data,ss:stackstart: mov dx,offset stringmov ah,9int
18、 21hcode endsend start3.7 解:(1). EXE程序程序可以有各种代码段和各种数据段,程序长度可以超过64KB普通生成EXE构造可执行程序(2). COM程序只有一种逻辑段,程序长度不超过64KB需要满足一定条件才干生成COM构造可执行程序(MASM 6.x需要采用TINY模式)3.8 解:符号定义伪指令有“等价EQU”和“等号”:符号名 EQU 数值表达式符号名 EQU 符号名 数值表达式EQU用于数值等价时不能重复定义符号名,但“”容许有重复赋值。例如:X= 7;等效于:X equ 7X= X+5;“X EQU X+5”是错误3.9 解:(1) al=67h(2)
19、ax=133h,dx=4h(3) ax=0230h(4) al=41h(4) ax=7654h3.10 解:(1)41h42h43h1010h45h46h-1?444-1?444-1?444(2)10h00h0fbh0ffh?3.11 解:.data my1b db Personal Computermy2b db 20my3b db 14hmy4b db 00010100bmy5w dw 20 dup(?)my6c = 100my7c = 3.12 解:运用定位伪指令控制,如org,even,align3.13 解:涉及逻辑地址和类型两种属性。3.14 解:;数据段org 100hvarwd
20、w1234h,5678hvarbdb3,4varddd12345678hbuffdd10dup(?)messdbHello;代码段movax,offsetvarb+ offsetmessmovax,typebuff+ typemess+typevardmovax,sizeofvarw+ sizeofbuff+ sizeof messmovax,lengthofvarw+ lengthofvard3.15 解:(1) 1000超过一种字节所能表达最大整数(2)SI应为偶数(3)两个内存单元不能直接运算(4)应改为al+1(5)条件转移指令背面应接标号,而不是变量3.16 解:mov ah,1;只
21、容许输入小写字母int 21hsub al,20h;转换为大写字母mov dl,almov ah,2int 21h;显示3.17 解:mov bx,offset LEDtablemov al,lednumxlat3.18 解:mov ax,bufXcmp ax,bufYjae donemov ax,bufYdone:mov bufZ,ax3.19 解:.model small.stack.databufXdw -7signXdb ?.code.startupcmp bufX,0;test bufX,80hjl next;jnz nextmov signX,0jmp donenext:mov s
22、ignX,-1done:.exit 0end3.20 解:mov dl,2mov ax,bufXcmp ax,bufYje next1dec dlnext1:cmp ax,bufZje next2dec dlnext2:mov ah,2int 21h3.21 解:;代码段mov al,numbermov bx,0;BX记录为1位数restart:cmp al,0;AL0结束jz doneagain:shr al,1;最低位右移进入CFjc next;为1,转移inc bx;不为1,继续jmp againnext:push axpush bxshl bx,1;位数乘以2(偏移地址要用2个字节单元
23、)jmp addrsbx;间接转移:IPtableBX;如下是各个解决程序段fun0:mov dl,0jmp dispfun1:mov dl,1jmp dispfun2:mov dl,2jmp dispfun3:mov dl,3jmp dispfun4:mov dl,4jmp dispfun5:mov dl,5jmp dispfun6:mov dl,6jmp dispfun7:mov dl,7jmp disp;disp:mov ah,2;显示一种字符int 21hpop bxpop axjmp restartdone: 3.22 编制程序完毕12H、45H、0F3H、6AH、20H、0FEH、
24、90H、0C8H、57H和34H等10个字节数据之和,并将成果存入字节变量SUM中(不考虑溢出和进位)。;wjxt322.asm.model small.stack.datab_datadb 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始数据numequ 10;数据个数sumdb ?;预留成果单元.code.startupxor si,si;位移量清零xor al,al;取第一种数mov cx,num;累加次数again:add al,b_datasi;累加inc si;指向下一种数loop again;如未完,继续累加mov sum,al;完了,存
25、成果.exit 0end3.23 求主存0040h:0开始一种64KB物理段中共有多少个空格?;wjxt323.asm.model small.codestart:mov ax,0040h;送段地址mov ds,axmov si,0;偏移地址mov cx,si;计数(循环次数)xor ax,ax;空格计数器清零again:cmp byte ptr si,20h;与空格ASCII码比较jne next;不是空格,转inc ax;是空格,空格数加1next:inc si;修改地址指针loop again;cxcx1,如cx0 退出循环.exit 0end start3.24 编写计算100个16位
26、正整数之和程序。如果和不超过16位字范畴(65535),则保存其和到wordsum,如超过则显示overflow。答:;数据段countequ 100parraydw count dup(?);假设有100个数据wordsumdw 0msgdb overflow,$;代码段mov cx,countmov ax,0mov bx,offset parrayagain:add ax,bxjnc nextmov dx,offset msgmov ah,9int 21h;显示溢出信息jmp done;然后,跳出循环体next:add bx,2loop againmov wordsum,axdone:3.
27、25 编程把个16位无符号二进制数转换成为用8421BCD码表达5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以l00、10和l,得到“百位”、“十位”和“个位”。;wjxt325.asm .model small .stack 256 .data arraydw ?;源字数据 dbcddb 5 dup(?);五位bcd成果,高对高低对低 .code .startup mov dx,array;取源数据(余数) mov bx,10000;除数 mov cx,10;除数系数 mov si,4;目数据高位位移量 again:m
28、ov ax,dx;dx.ax中存储被除数 mov dx,0div bx;除于bx,商ax,余数dx mov dbcdsi,al;商10,存成果 push dx;暂存余数mov ax,bx;除数除于10 mov dx,0div cx;dx.ax除于cx,商ax、余数0存在dx mov bx,ax;bx是除数 pop dxdec si;目数据位移量减1jnz againmov dbcd,dl;存个位数( 10 ) .exit 0end3.26 解:(1)汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下:过程名PROC NEAR|FAR;过程体过程名ENDP(2)保护用到寄存器内
29、容,以便子程序返回时进行相应恢复。(3)改错:crazyprocpishbxpushcxxorax,axxordx,dxagain:adda,bxadcdx,0incbxincbxloopagainpopcxpopbx3.27 解(不需调用HTOASC子程序):again:mov ah,1int 21hcmp al,1bh;ESCASCII码是1bhje donemov dl,almov ah,2int 21h;是大写字母则转换为小写字母jmp againdone:3.28 解答:asctobprocpush cxand dh,0fh;先转换十位数shl dh,1;十位数乘以10(采用移位指令
30、)mov ch,dhshl dh,1shl dh,1add dh,chand dl,0fh;转换个位数add dh,dl;十位数加个位数mov al,dh;设立出口参数pop cxretasctobendp3.29 解:DIPASCproc;入口参数:AL要显示一种16进制数push cxpush dxpush axmov cl,4;转换高位shr al,clcall HTOASCmov dl,al;显示mov ah,2int 21hpop ax;转换低位call HTOASCmov dl,al;显示mov ah,2int 21hmov dl,H;显示一种字母“H”mov ah,2int 21
31、hpop dxpop cxretDIPASCendpHTOASCproc;将AL低4位表达一位16进制数转换为ASCII码and al,0fhcmp al,9jbe htoasc1add al,37h;是0AH0FH,加37H转换为ASCII码ret;子程序返回htoasc1:add al,30h;是09,加30H转换为ASCII码ret;子程序返回HTOASCendp3.30 解:lucaseprocpush bxmov bx,offset stringcmp al,0je case0cmp al,1jz case1cmp al,2jz case2jmp donecase0:cmp byte
32、 ptr bx,0je donecmp byte ptr bx,Ajb next0cmp byte ptr bx,Zja next0add byte ptr bx,20hnext0:inc bxjmp case0case1:cmp byte ptr bx,0je donecmp byte ptr bx,ajb next1cmp byte ptr bx,zja next1sub byte ptr bx,20hnext1:inc bxjmp case1case2:cmp byte ptr bx,0je donecmp byte ptr bx,Ajb next2cmp byte ptr bx,Zja
33、 next20add byte ptr bx,20hjmp next2next20:cmp byte ptr bx,ajb next2cmp byte ptr bx,zja next2sub byte ptr bx,20hnext2:inc bxjmp case2done:pop bxretlucaseendp3.31 解:(1)用寄存器传递参数:最简朴和惯用参数传递办法是通过寄存器,只要把参数存于商定寄存器中就可以了由于通用寄存器个数有限,这种办法对少量数据可以直接传递数值,而对大量数据只能传递地址采用寄存器传递参数,注意带有出口参数寄存器不能保护和恢复,带有入口参数寄存器可以保护、也可以不
34、保护,但最佳可以保持一致(2)用共享变量传递参数子程序和主程序使用同一种变量名存取数据就是运用共享变量(全局变量)进行参数传递如果变量定义和使用不在同一种源程序中,需要运用PUBLIC、EXTREN声明如果主程序还要运用本来变量值,则需要保护和恢复运用共享变量传递参数,子程序通用性较差,但特别适合在各种程序段间、特别在不同程序模块间传递数据(3)用堆栈传递参数参数传递还可以通过堆栈这个暂时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈获得它们采用堆栈传递参数是程式化,它是编译程序解决参数传递、以及汇编语言与高档语言混合编程时常规办法3.32
35、解:办法:主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈获得它们注意:压栈与弹栈必要要一一相应。3.33 解:办法1:neg32proc;入口参数:DX.AX32位有符号数neg ax;实现0DX.AX功能neg dx sbb dx,0;这条指令也可以用dec dx代替retneg32endp;出口参数:DX.AX32位有符号数补码办法2:neg32proc;入口参数:DX.AX32位有符号数not ax;实现DX.AX求反加1not dx add ax,1adc dx,0retneg32endp;出口参数:DX.AX32位有符号数补码3.34 解:
36、;数据段arraydb 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h;数组countequ $-array;数组元素个数resultdb ?;校验和;代码段mov bx,offset array;BX数组偏移地址mov cx,count;CX数组元素个数call checksum;调用求和过程mov result,al;解决出口参数mov ax,4c00hint 21h;计算字节校验和通用过程;入口参数:DS:BX数组段地址:偏移地址,CX元素个数;出口参数:AL校验和;阐明:除AX/BX/CX外,不影响其她寄存器checksumprocxor al,al
37、;累加器清0sum:add al,bx;求和inc bx;指向下一种字节loop sumretchecksumendpend3.35 解:.model small.stack.datawdatadw 34abh.code.startupmov ax,wdatacall dispa.exit 0;dispaprocpush cxpush dxmov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop
38、 dxpop cxretdispaendp;dldispprocpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1:mov ah,2int 21hpop axretdldispendpend.model small.stack.datawdatadw 34abhwordtempdw ?.code.startupmov ax,wdatamov wordtemp,axcall dispa.exit 0;dispaprocpush cxpush dxmov cl,4mov dl,byte ptr wordtemp+1shr dl,clcall dldispmov dl,byte ptr wordtemp+1and dl,0fhcall dldispmov dl,byte ptr wordtempshr dl,clcall dldispmov dl,byte ptr wordtempand dl,0fhcall dldisppop dxpop cxretdispaendp;dldispprocpush axor dl,30hcmp dl,39hjbe dldisp1