1、少年易学老难成,一寸光阴不可轻-少年易学老难成,一寸光阴不可轻-百度文库--汇编语言程序设计第四版【课后习题答案】第1章汇编语言基础知识习题1.1简述计算机系统的硬件组成及各部分作用。解答存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。外部设备:实现人机交换和机间的通信。习题1.2明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。解答可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,
2、它由磁盘或光盘构成,其成本低、容量大,但速度慢。RAMCPURAMRAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器ROM后能保存信息。存储器由大量存储单元组成。为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。KBMBGBTB习题1.3什么是汇编语言源程序、汇编程序、目标程序?解答编程序;由汇编程序编译通过的程序就是目标程序。习题1.4汇编语言与高级语言相比有什么优缺点?解答方面最有效的程序。汇编语言与高级语言相比的缺点:由于与处
4、十进制数转换为BCD码表示(1)12(2)24(3)68(4)127(5)128(6)255(7)1234(8)2458解答(1)1200010010(2)2400100100(3)6801101000(4)127000100100111(5)128000100101000(6)255001001010101(7)12340001001000110100(8)24580010010001011000习题1.7将下列BCD码转换为十进制数(1)10010001(2)10001001(3)0011011010010000(5)00001000(6)10010111(7)100000
5、0100000010解答(1)91(2)89(3)36(4)90(4)(8)(5)08(6)97(7)81(8)021.88(1)0(2)-127(3)127(4)-57(5)126(6)-126(7)-128(8)68解答(1)0+0000000000000000000000000-0100000001111111100000000(2)-127111111111000000010000001(3)127011111110111111101111111(4)-57101011111101000011010001(5)126011111100111111001111110(6)-126111
6、111101000000110000010(7)-12810000000(8)68010001000100010001000100习题1.9完成下列二进制数的运算(1)10111001(2)10111001(3)10111001(4)101110001001(5)10111001(6)10111001(7)101110111001解答(1)10111001=10100(2)10111001=0010(3)10111001=1100011(4)101110001001=10100,余数1000(5)10111001=1001(6)10111001=1011(7)1011=
7、0100(8)10111001=0010(代表异或)1.1009AZazASCII0dh、0ah解答数码09:30H39H大写字母AZ:41H5AH小写字母az:61H7AHASCII码为0dh、0ah分别对应回车和换行控制字符。1.1101100001BCDASCII解答:01100001B61H97BCD61ASCII:a习题1.12简述Intel80x86系列微处理器在指令集方面的发展。解答1978年Intel,正式推出了16位8086CPU,1979年Intel推出了准168086Intel80286CPU,80286801861
8、5年,Intel80x86推出微处理器地进入第三代80386CPU,803861632增了有关位操作、条件设置指令以及控制、调试和测试寄存器的传送指令等,198980486CPU,80486FPURISCCache6Intel5863232新增了一条8字节比较交换指令和一条处理器识别指令,以及4条系统专用指令,1996年推出了MMXPentium57,1995IntelPentium3条指令,1999年推出了Pentium新增了70条SSE指令,2000年推出的Pentium476SSE2习题1.13什么是DOS和ROM-BIOS?解答D
9、OS是DisketteOperatingsystem的缩写,意思是磁盘操作系统,DOS5年的个人电脑上使用的一种主要的操作系统。BIOS(BasicInputOutputSystem)即基本输入输出系统,通常是固化在只读存储器(ROM)中,所以又称为ROMBIOSROMBIOS制的程序。习题1.14简述PC机最低1MB主存空间的使用情况。解答RAM(00000H9FFFFH)DOSRAM(A0000H-BFFFFFH)126KB分地址空间实际上并没有全部使用。ROM(C0000H-DFFFFH)128KB可安排在这一段,系统的会对它进行确认和连接。ROM(E0000H
10、-FFFFFH)128KB,由系统占用,它ROM-BIOSBIOS,是操作系统的重要组成ROM-BIOSCMOS1.158086CPU8816解答数据寄存器:AX称为累加器,使用频度最高,用于算术、逻辑运算16是源变址寄存器,DI是目的变址寄存器,一般与DS联用确定数DSDIESDISP与BP寄存器均可与SS段寄存器联合使用以确定堆栈段中的存储单元地址。习题1.16什么是标志,它有什么用途?状态标志和控制标志有什么区别?画出标志寄存器FLAGS,说明各个标志的位置和含义。解答少年易学老难成,一寸光阴不可轻-百度文库行都将相应地设置它,控制标志位可由程序根据需要用指
11、令设置,用来控制处理器执行指令的方式。CF是进位标志;ZF是零标志;SF是符号标志;PF奇偶标志;OF溢出标志;AF辅助进位标志;DF方向标志;IF中断允许标志;TF陷阱标志。习题1.17举例说明CF和OF标志的差异。解答溢出标志OF和进位标志CF是两个意义不同的标志。志表示有符号数运算结果是否超出范围,运算结果已经不正确。例1:3AH+7CHB6H无符号数运算:58124182,范围内,无进位有符号数运算:58124182,范围外,有溢出例2:AAH7CH(1)26H无符号数运算:170124294,范围外,有进位有符号数运算:8612428
12、,范围内,无溢出习题1.18字和双字在存储器中如何存放,什么是“小端方式”?对字和双字存储单元,什么是它们的对齐地址?为什么要对齐地址?解答字或双字在存储器中占相邻的2个或4个存储单元;存放时,低字节存入-10-少年易学老难成,一寸光阴不可轻-少年易学老难成,一寸光阴不可轻-百度文库--4数据的地址对齐,以取得较高的存取速度。习题1.19什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:(3)2000h:4500h(4)B821h:4567h解答在8086处理器中,对应每个物理存储单元都有一个唯一的20位
13、编号,就是物理地址,从00000HFFFFFH。80864(1620如下逻辑地址用物理地址表达:FFFFh:0FFFF0H(2)40h:17h00417H(3)2000h:4500h24500H(4)B821h:4567hBC777H(不要算错)习题1.208086有哪4种逻辑段,各种逻辑段分别是什么用途?解答代码段(CodeSegment)用来存放程序的指令序列。处理器利用CS:IP取得下一条要执行的指令。堆栈段(StackSegment)确定堆栈所在的主存区域。处理器利用SS:SP操作堆栈中的数据。数据段(DataSegment)存放当前运行程序所用的数据。处
14、理器利用DS:EA存取数据段中的数据。附加段(ExtraSegment)是附加的数据段,也用于数据的保存。处理器利用ES:EA存取数据段中的数据习题1.21数据的默认段是哪个,是否允许其他段存放数据?如果允许,如何实现,有什么要求?解答放在任何一种逻辑段中,这时,只要明确指明是哪个逻辑段就可以了。习题1.22什么是操作码、操作数和寻址方式?有哪三种给出操作数的方法?解答出。习题1.23什么是有效地址EA?8086的操作数如果在主存中,有哪些寻址方式可以存取它?解答DSEA8086式、相对基址变址寻址方式。习题1.24说明下列指令中源操作数的寻址方式?如果BX20
15、00H,DI40H,给出DX的值或有效地址EA的值。(1)movdx,1234hmovdx,1234hmovdx,bxmovdx,bxmovdx,bx+1234hmovdx,bx+dimovdx,bx+di+1234h解答直接寻址,EA1234H间接寻址,EA2000H相对寻址,EA3234H基址变址寻址,EA2040H相对基址变址寻址,EA3274H2章8086习题2.1已知DS2000H、BX0100H、SI0002H,存储单元20100H20103H1234562A4CB765H,说明下列每条指令执行完后AX寄存器的内容。movax,1200hmo
16、vax,bx(3)movax,1200hmovax,bxmovax,bx+1100hmovax,bx+simovax,bxsi+1100h解答(1)AX1200H(2)AX0100H(3)AX4C2AH(4)AX3412H(5)AX4C2AH=bx+1100h=1200h(6)AX7856H=bx+si=0100h+0002h=0102h(7)AX65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h习题2.2指出下列指令的错误movcx,dlmovip,axmoves,1234hmoves,dsmoval,300movsp,axmovax,bx+d
17、imov20h,ah解答两操作数类型不匹配IP立即数不允许传给段寄存器段寄存器之间不允许传送两操作数类型不匹配SI源操作数应为BX+DI立即数不能作目的操作数2.30934H05H06H、09H0AH0CH11H12Htable(200H)leabx,tablemoval,8xlat解答leabx,table;获取table的首地址,BX200Hmoval,8;传送欲转换的数字,AL8xlat;转换为格雷码,AL12HP35习题2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?解答SSPUSHPOP。习题2.5已知SS=2200H、SP
18、=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?movax,8057hpushaxmovax,0f79hpushaxpopbxpopbx解答movax,8057hpushaxmovax,0f79hpushaxpopbx;bx=0f79hpopbx;DS:0f79h=8057h--百度文库P,00B0七SS=220,-12.6ALCFZFSFOFPF的状态:addal,aladdal,9dhcmpsubal,aldecalincal解答少年易学老难成,一寸光阴不可轻-少年易学老难成,一寸光阴不可轻-百度文库-
19、-moval,89h;AL=89hCFZFSFOFPFaddal,al;AL=12h10011;10001001+10001001100010010addal,9dh;00010010+100110101111cmpal,0bch;10101111-10111100*01000011subal,al;AL=0afh00101;AL=0afh10101;AL=00h01001decal;AL=0ffh00101;00000000-00000001*11111111incal;AL=00h01001;11111111+00000001*1111
20、1111习题2.7设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。阅读如下程序段,给出运算公式。movax,Xmovaddax,Yadcaddax,24adcdx,0subax,Zsbbdx,Z+2movW,axmovW+2,dx解答WX+Y+24-Z习题2.8请分别用一条汇编语言指令完成如下功能:BXDXDXBXSIALALBX0B2HCX0520H3412H相加,并把结果送回该存储单元中。0A0HALAL解答ADDDX,BXADDAL,BX+SIADDBX+0B2H,CXAD
21、DWORDPTR0520H,3412HADDAL,0A0H习题2.9设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。movax,X;ax=XimulYmovcx,ax;cx=X*Y的低16位moxbx,dx;bx=X*Y的高16位movax,Zcwdaddcx,ax;cx=Z16+X*Y16adcbx,dx;bx=Z的高16+X*Y16subcx,540;cx=Z16+X*Y16-540sbbbx,0;bx=Z的高16+X*Y16位movax,VcwdbxV的低16Z16+X*Y6-5
22、40)sbbdx,bx;dx=V的高16(Z16+X*Y16idivX;/X解答V-(X*Y+Z-540)/XAX存商,DX存余数习题2.10指出下列指令的错误:xchgsi,30hpopcssubsi,dipushahadcax,dsaddsi,80hinal,3fchoutdx,ah解答xchgCS两个操作数不能都是存储单元堆栈的操作数不能是字节量adc没有确定是字节还是字操作inFFHoutAL/AX习题2.11给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。movax,1470handax,axorax,axxorax,a
23、xnotaxtestax,0f0f0h解答movax,1470h;AX1470HCFZFSFOFPFandax,ax;AX1470H00000;0001010001110000orax,ax;AX1470H00000xorax,ax;AX0000H01001notax;AXFFFFH01001testax,0f0f0h;AXFFFFH00101NOTCFOF0据结果影响其他标志位。2.122.34每条指令执行后的结果和各个标志位的状态。解答指令;执行结果CFOFSFZFPFmovsi,ax;SI=AX=0008Hshlsi,1;SI=2*
24、AX=0010H00000addsi,ax;SI=3*AX=0018H00001movdx,bx;DX=BX=0010H00001movcl,03h;CL=03H00001shldx,cl;DX=8*BX=0080H0u000subdx,bx;DX=7*BX=0070H00000adddx,si;DX=7*BX+3*AX=0088H00001N2NN2NSF,ZF,PF。在进行一位移位时,根据最高符号位是否改变设置OF,如改变则OF1。另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。习题2.13编写程序段完成如下要求:AL(无符号数)1009ASCI
25、IBCDDX.AX4解答;不考虑进位movbl,almovcl,3shlal,claddal,bl;shlbl,1addal,bl;考虑进位xorah,ahmovbx,axmovcl,3shlax,claddax,bx;shladdax,bx09ASCII30h39h非压缩BCD码的09是:00h09h方法一:andal,0fh;实现ASCII到非压缩BCD码的转oral,30h;实现非压缩BCD码到ASCII的转换方法二:xoral,30hD5D4;即高4位为3,则变为0;高4位为0,则变为3movcl,4again:shrdx,1;实现
26、逻辑右移;采用“sardx,1”,则实现算术右移rcrax,1deccljnzagain2.14ALSARIDIV2解答sarmoval,0f7h;-9送AL11111001saral,1;结果:AL=11111100B=0FBH即-5idivmoval,0f7h;-9alcbw;字节符号扩展位字movbl,2;注意除数不可为立即数idivbl;结果:商为al=fch(-4);余数:ah=ffh(-1)结论:符号数的除法用idiv准确。习题2.15指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?解答指令
27、指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。习题2.16控制转移类指令中有哪三种寻址方式?解答(可以分成寄存器和存储器间接寻址)。习题2.17什么是短转移shortjump、近转移nearjump和远转移farjump?什么是段内转移和段间转移?8086有哪些指令可以实现段间转移?解答短转移:指段内128127之间的转移,位移量用一个字节表示近转移:指段内32K之间的转移,位移量用一个字表示远转移:指段间1MB范围的转移段内转移:指在同一个代码段内的转移,可以是短转移或者近转移段间转移:
28、指转移到另外一个代码段,就是远转移8086/8088CPU的JMP、CALL和INTn指令可以实现段间转移习题2.188086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?解答8086的条件转移的转移范围:在当前指令地址的+127-128之内。转移到范围外的目标地址。习题2.19假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,232F7H=3280H,264E5H=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?JMPBXJMPTABLEBXJMPBXSI解答(1
29、)转移的有效地址EA=BX=1256H(2)EADS:20A1H+1256H=232F7=3280H(3)EADS:1256H+528FH=264E5H=2450H习题2.20判断下列程序段跳转的条件(1)xorax,1e1ehjeequal(2)testal,10000001bjnzthere(3)cmpcx,64hjbthere解答AX1e1eh(0)ALD0D71CX(无符号数)64h习题2.21设置CX=0,则LOOP指令将循环多少次?例如:movcx,0delay:loopdelay解答216次。2.22AXSIDIDXDIaboveAXSI
30、greaterCX0zeroAXSIoverflowSIAXless_eqDIDXbelow_eq解答DXDIabovedx,dijaabove;jnbeaboveAXSIgreaterax,sijggreater;jnlegreaterCX0zerocx,0jzzero;jcxzzeroAXSIoverflowcmpax,sijooverflow若SIAX,转到less_eq执行;cmpsi,ax;cmpjleless_eq;jgeless_eq若DIDX,转到below_eq执行。cmpdi,dx;cmpdx,dijbebelow_eq;jaebelow_eq2.23arra
31、y20功能。movcx,20movax,0movsi,axsum_loop:addax,arraysiaddsi,2loopsum_loopmovtotal,ax解答将首地址为array得20个字的数组求和,并将结果存入total单元中。习题2.24按照下列要求,编写相应的程序段:string(6),16(字节量)DXbuffer44BCD(高)地址对低(高)位的原则,将它们合并到DX中。DX400AX-1。64buffer1buffer1buffer2B800h:010016和,并把32位的和保存在DX.AX中。已知字符串string
32、包含有32KB内容,将其中的$符号替换成空格。有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。统计以$结尾的字符串srting解答解答:movsi,0movdl,stringsi1dl:movdl,stirng0movsi,5movdh,stringsi6dhdl,stirng5解答:xorsi,si;simoval,buffersiincsimovah,buffersimovcl,4shlah,cl;BCDoral,ah;组合成压缩BCDmovdl,al;存入dl寄.incsimoval,buffersiincsimovah,
33、buffersimovcl,4shlah,cl;BCDoral,ah;组合成压缩BCDmovdh,al;存入dh寄.解答:testdx,0f000h;testdh,0f0hjznext;jnznextmovax,-1;movjmpagainnext:movax,0;movax,0ffffhagain:.解答:movax,wordptrbuffer1subax,wordptrbuffer216movdx,wordptrbuffer1+2sbbdx,wordptrbuffer2+21616位解答:movax,0b800hmovds,ax;段地址xorsi
34、,si;地址偏移量si=0xordx,dx;和的高字movcx,99;加的次数movax,si;第一个数again:incsi;指向下一个字单incsiaddax,si;加下一个数jncnoc;无进位转incdx;有进位noc:deccx;次数-1jnzcx,again01:不使用串操作指令(更好)movsi,offsetstringmovcx,8000h;32k=215=8000hagain:cmpbyteptrsi,$;$24hjnznext;不要采用jz进行分支movbyteptrsi,;20hnext:incsiloopagain;deccx;
35、jnzagain2:使用串操作指令movdi,offsetstringmoval,$movcx,8000hcldagain:scasbjnzmovbyteptres:di-1,next:loopagain1:movsi,offsetarraymovcx,100again:decbyteptrincsiloopagain(7)解答2:xorsi,si;si-0movcx,100;循环次again:decarraysiincsiloopagain3:movsi,offsetarraymovdi,simovax,dsmoves,axm
36、ovcx,100cldagain:lodsbdecstosbloopagain解答:xorsi,sicoun:cmpstringsi,$jedoneincsijmpdone:.习题2.25对下面要求,分别给出3种方法,每种方法只用一条指令。(1)使CF=0(2)使AX=0(3)同时使AX=0和CF=0解答解答:clcandax,axorax,ax解答:xorax,axandax,0movax,0解答:andax,0xorax,axsubax,ax习题2.26参照本习题的示意图,分析调用序列,画出每次调用及返回CALL3,5解答主程序转子su
37、ba时段内调用:断点1为2000h:0400h+3,转子是只将IP压栈。subasubb2转子时须将csIPsuba转子subc时段内调用:断点3为2000h:0c021h+3,转子是只将IP压栈。注:压栈时先修改sp再压入断点,弹栈时先弹出断点再修改sp。习题2.27已知AX、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。addxchgadcal,bhxchgal,ahret解答压缩BCD码加法:AXAXBX出口参数:AXBCD码和习题2.28AAD指令是用于除法指令之前,进行非压缩
38、BCD码调整的。实际上,处理器的调整过程是:ALAH10AL,AH0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。解答shlah,1;ah=2*aah=a)movdl,ah;dl=2*amovcl,2;设定移位次数shlah,cl;ah=8*aaddah,dl;ah=10*aaddal,ah;al=10*a+alxorah,ah;ahint3;返回DOS注意:入口:AX中存放有“和”(两非压缩BCD码)出口:AL中已为调整后的二进制数习题2.29解释如下有关中断的概念:内部中断和外部中断单步中断和断点中断除法错中断和溢出中断中断向量号和中
39、断向量表解答内部中断是由于8086CPU内部执行程序引起的程序中断;外部中断8086CPUF130INTOOF12.30nCALLIRETRET解答INTn响应中断时,除象CALLFRCALLIRET返回时,除象RETFR;RET第3章汇编语言程序格式习题3.1伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?解答伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;CPU习题3.2什么是标识符,汇编程序中标识符怎样组成?解答名字通常被称为标识符;汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,?,)组成,不能以数字开头。习题
40、3.3什么是保留字,汇编语言的保留字有哪些类型,并举例说明。解答保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的DB就是伪指令助记符。习题3.4汇编语句有哪两种,每个语句由哪4个部分组成?解答汇编语句有执行性语句和说明性语句;执行性语句由标号、硬指令助记符、操作数和注释四部分组成;说明性语句由名字、伪指令助记符、参数和注释四部分组成习题3.5汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。解答编辑文本编辑程序汇编语言源程序.asm汇编汇编程序目标模块文件.obj连接连接程序可执行文件.exe或.com调试调试程序应用程序3.6区
41、分下列概念:变量和标号数值表达式和地址表达式符号常量和字符串常量解答义的标识符,指向存储单元,表示其存储内容的逻辑地址。达式是由名字、标号以及利用各种的操作符形成的表达式。字符串常量。习题3.7假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。movbyteptrbx,1000movbx,offsetmywordsicmpmybyte1,mybyte2moval,mybyte1+mybyte2subal,mywordjnzmyword解答(1)1000超出了一个字节范围offsetleabx,mywordsi两个都是存储单
42、元,指令不允许变量值只有执行时才确定,汇编过程不能计算ALmyword,类型不匹配Jcc3.8OPR1AND0feh解答前者为“与”操作硬指令助记符,可汇编成机器代码。后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。习题3.9给出下列语句中,指令立即数(数值表达式)的值:(1)moval,23hAND45hOR67h(2)movax,1234h/16+10hmovax,NOT(65535XOR1234h)moval,LOW1234hORHIGH5678hmovax,23hSHL4movax,1234hSHR6moval,aAND(NOT(a-A
43、)(8)moval,HOR00100000b(9)movax,(76543LT32768)XOR7654h解答注:对于逻辑运算,有关操作数可化为二进制数。(1)67h(2)133h(3)1234h(4)76h(5)0234h(6)0048h(7)41h(8)68h(9)7654h习题3.10画图说明下列语句分配的存储空间及初始化的数据值:(1)byte_varDBABC,10,10h,EF,3DUP(-1,,3DUP(4)(2)word_varDW10h,-5,EF,3DUP()解答从低地址开始,依次是(十六进制表达):4142430a104546f
44、f040404ff040404ff040404从低地址开始,依次是(十六进制表达):1000FBFF4645习题3.11请设置一个数据段mydataseg,按照如下要求定义变量:my1bPersonalComputermy2b20my3b20my4b20my5w20my6c100my7cPersonalComputer解答mydatasegsegmentmy1bdbPersonalComputermy2bdb20my3bdb14hmy4bdb00010100bmy5wdw20dup()my6cequ100;my6c=my7cequmydat
45、asegends习题3.12分析例题3.2的数据段,并上机观察数据的存储形式。解答以字节为单位从低地址向高地址依次是:160012FFHFFHFFHFFH00000000000000001234545H23H0000000000000000abcHello1310$12个字符串month,每个字符串从低地址到高地址依次是:month254个字节未定义初值的存储单元,操作系统设置为03.133.3wmovsw9解答.modelsmall.stack.datasourcedw3433h,3635ht
46、argetdw40dup(),$.code.startupmovax,dsmoves,axcldmovsi,offsetsourcemovdi,offsettargetmovcx,40repmovswmovsi,0movdx,offsettargetmovah,9int21h.exit0end习题3.14变量和标号有什么属性?解答段地址:表示变量和标号所在代码段的段地址;偏移地址:表示变量和标号所在代码段的段内偏移地址;它所在同一个段nearfar习题3.15设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:mydatase
47、gmentORG100HVARWDW1234H,5678HVARBDB3,4ALIGN4VARDDD12345678HEVENBUFFDB10DUP()MESSDBBEGIN:MOVAX,OFFSETMESSMOVAX,TYPEBUFF+TYPEMESS+TYPEVARDMOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESSMOVAX,LENGTHOFVARW+LENGTHOFVARDMOVAX,LENGTHOFBUFF+SIZEOFVARWMOVAX,TYPEBEGINMOVAX,OFFSETBEGIN解答
48、MOVAX,OFFSETMESS;AX116HMOVAX,TYPEBUFF+TYPEMESS+TYPEVARD;AX1+1+4=06HMOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESSAX=4+10+5=19=13HMOVAX,LENGTHOFVARW+LENGTHOFVARD;AX=2+1=03HMOVAX,LENGTHOFBUFF+SIZEOFVARW;AX10+4=14=0EHMOVAX,TYPEBIGIN)MOVAX,OFFSETBEGIN;AX=1BH3.16.MODELMASM7SMALL(EX
49、E程序?32解答MASM7TINY(微型模式、SMALL(小型模式)、紧凑模式中型模式大型模式HUGE(巨大模式)、FLAT(平展模式);TINY用于创建COM类型程序、一般程序都可以选用SMALL模式;设计32位的程序应该采用FLAT模式。习题3.17源程序中如何指明执行的起始点?源程序应该采用哪个DOS功能调用,实现程序返回DOS?解答源程序中运用STARTUP伪指令指明执行的起始点;源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。3.18SMALL解答段定义伪指令段名定位组合类别组名.CODE_TEXTWORDPUBLICCOD
50、E.DATA_DATAWORDPUBLICDATADGROUP.DATA?_BSSWORDPUBLICBSSDGROUP.STACKSTACKPARASTACKSTACKDGROUP3.19.startup.exit3.1aMASM5.x解答;lt301a.asm(文件名).modelsmall.stack.datastringdbHello,Everybody!,0dh,0ah.$.codestart:movax,datamovds,axmovdx,offsetstringmovah,9int21hmovax,4c00hint21hendstart习题3.
51、20创建一个COM程序完成例题3.1的功能。解答;lt301a,asm.modeltiny.code.startupmovdx,offsetstringmovah,9int21h.exit0stringdbHello,Everybody!0dh,0ah,$;end习题3.21按下面要求写一个简化段定义格式的源程序51、0、2、541datalistnumdatalist1解答.modelsmall.stack.datanumequ5datalistdw-1,0,2,5,4,.code.startupmovbx,offsetdatalistmovcx,
52、numxorax,axagain:addincbxincbxloopmovbx,ax.exit0end习题3.22按下面要求写一个完整段定义格式的源程序100作为附加段;stack;100h64h。解答stacksegmentparadw512dup()stackendsdatasegmentarraydb100dataendscodesegmentcodeassumecs:code,ds:data,es:data,ss:stackorg100hstart:movax,datamovds,axmoves,axmovdi,offsetarraymoval
53、,64hmovcx,100cldrepstosbmovax,4c00hint21hcodeendsend习题3.23编制程序完成两个已知双精度数(4字节)A和B相加并将结果存入双精度变量单元SUM中(不考虑溢出)。解答;xt327.asm.modelsmall.stack256256.dataAdd11223344h义两个双字的数(随意)Bdd77553311hsumdd;定义结果,执行后为:88776655h.code.startupxorsi,si;相对于变量的位移量清零movcx,2高低字分别相加,共两次clc;清零cfagain:movax,
54、wordptrAsi;取第一个数的一个字(先低字后高字)adcax,ptrBsimovwordptrsumsi,ax;存和的一个字(先低字后高字)incsi;修改位移量指向下一个字(加2)incsiloopagain;cx=cx-1,ifcx0,jumpagain.exit0end3.2412H45H0F3H6AH20H0FEH90H、0C8H57H34H10SUM(不考虑溢出)。解答.startupxorsisi;位移量清零moval,bdatasi;取第一个movcx,num-1;累加次数again:incsi;指向下一个adcal,bdatasi;累加loop
55、again;如未完,继续累movsum,al;完了,存结果.exit0end习题3.25结构数据类型如何说明、结构变量如何定义、结构字段如何引用?解答结构类型的说明使用一对伪指令STRUCT(MASM5.x是STRUC,功能相同)和ENDS。它们的格式为:结构名STRUCT结构名ENDS结构变量定义的格式为:变量名,结构名字段初值表引用结构字段,采用圆点“.”操作符,其格式是:结构变量名.结构字段名。3.26mask操作符是什么作用?解答记录类型的说明采用伪指令RECORD,它的格式为:记录名RECORD位段,位段定义记录变量的格式:记录变量名记录名段初值表W
56、idth记录名/记录位段名操作符返回记录或记录位段所占用的位数。mask记录位段名操作符返回一个8位或16位数值,其中对应该位段的个位为1,其余位为0。第4章基本汇编语言程序设计习题4.1例题4.2如果要求算术右移8位,如何修改程序。解答思路:首先由最高位字节向次低位字节传送次低位字节向最低位字节70hffh.modelsmall.stack256.dataqvardq1234567887654321h.code.startupmovcx,7movsi,1again:moval,byteptrqvarsimovbyteptrqvars
57、i-1,alincsiloopagaintestal,80hjzezzmovbl,0ffhjmpdoneezz:movbl,0done:movbyteptrqvar7,bl.exit0end习题4.2例题4.2如果要求算术左移7位,如何用移位指令实现。解答8一次,次低位字节至最高位字节依次带CF位循环左移一次(内循环共7.modelsmall.stack256.dataqvardq1234567887654321h.code.startupmovdx7;外循环次数movax,byteptrqvar0axlpp:shlax,1d7m
58、ovsi,1movcx7;内循环次数again:rclbyteptrqvarsi1;高位字节依次左移P50incsiloopagaindecdxjnzlpp.exit0.end习题4.3将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。解答ALBLCLDLmovbl,al;将al中的两组分andal,0fh;屏蔽高四位后送almovcl4al4blshrblclmovdl,ah;将ah中的两组分开anddl,0f0h;屏蔽低高四位后送dlmovcl4ah4dlshrdlclmov
59、clahandcl0fh习题4.4编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。解答movah1;从键盘输入,出口:al21hcmpal,a判键值是小写字母?jbgetkaycmpal,zjagetkaysubal,20hdl,almovah02hint21h习题4.5已知用于LED数码管显示的代码表为:LEDtableDB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示09、AF这16个数码的显示代码。现编写一个程序实现将lednum中的一
60、个数字(09、AF)转换成对应的LED显示代码。解答.modelsmall.stack256.dataLEDtableDB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80h,90h,88h,83h,0c6h,0clh、86h,8ehlednumDB.code.startupmovbx,offsetLEDtablemoval,lednumxlat;alLED.exit0end习题4.6编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数