位汇编语言程序设计部分课后习题答案.ppt

上传人:jun****875 文档编号:1868906 上传时间:2019-11-09 格式:PPT 页数:115 大小:1.30MB
返回 下载 相关 举报
位汇编语言程序设计部分课后习题答案.ppt_第1页
第1页 / 共115页
位汇编语言程序设计部分课后习题答案.ppt_第2页
第2页 / 共115页
位汇编语言程序设计部分课后习题答案.ppt_第3页
第3页 / 共115页
点击查看更多>>
资源描述
32位汇编语言习题解答,课件制作: 钱晓捷,钱晓捷,32位汇编语言程序设计,机械工业出版社,第1章习题:汇编语言基础,1.1 简答题(1、3、6、7、8) 1.2 判断题(1、6、7、8、9) 1.3 填空题(3、4、5、7、10) 1.9、1.13、1.15、1.16,3,1.1 简答题-1,(1)哪个处理器的指令系统成为Intel 80x86系列处理器的基本指令集? 8086 (3)什么是通用寄存器? 一般指处理器最常使用的整数寄存器,可用于保存整数数据、地址等 (6)最高有效位MSB是指哪一位? 数据的最高位,例如对8、16、32位数据,MSB依次指D7、D15和D31位,4,1.1 简答题-2,(7)汇编语言中的标识符与高级语言的变量和常量名的组成原则有本质的区别吗? 没有 (8)汇编语言的标识符大小写不敏感意味着什么? 表示字母大小写不同、但表示同一个符号,5,1.2 判断题,1)EAX也被称为累加器,因为它使用最频繁。 对,EAX中的A来自英文累加器(Accumulator) 6)处理器的传送指令MOV属于汇编语言的执行性语句 对 7)汇编语言的语句由明显的4部分组成,不需要分隔符区别。 错,使用了分隔符才有了明显的4部分 8)MASM汇编语言的注释用分号开始,不能用中文分号 对,源程序中的分隔符以及各种标识符都是英文 9)程序终止执行也就意味着汇编结束,所以两者含义相同。 错,两者完全是两个概念,6,1.3 填空题-1,(3)IA-32处理器有8个32位通用寄存器,其中EAX,_,_和EDX,可以分成16位和8位操作;还有另外4个是_,_,_,和_。 EBX,ECX,ESI,EDI,EBP,ESP (4)寄存器EDX是_位的,其中低16位的名称是_,还可以分成两个8位的寄存器,其中D0D7和D8D15部分可以分别用名称_和_表示。 32,DX,DL,DH (5)IA-32处理器有_个段寄存器,它们都是_位的。 6,16,7,1.3 填空题-2,(7)逻辑地址由_和_两部分组成。代码段中下一条要执行的指令由CS和_寄存器指示,后者在实地址模型中起作用的仅有_寄存器部分。 段基地址,偏移地址,EIP,IP (10)MASM要求汇编语言源程序文件的扩展名是_,汇编产生扩展名为OBJ的文件被称为_文件,编写32位Windows应用程序应选择_存储模型。 ASM,目标模块,FLAT,8,习题1.9,IA-32处理器有哪三类基本段,各是什么用途? 解答: 代码段:存放程序的指令代码 数据段:存放当前运行程序所用的数据 堆栈段:主存中堆栈所在的区域,9,习题1.13,汇编语言语句有哪两种,每种语句由哪4个部分组成 解答: 汇编语句有两种 执行性语句(处理器指令) 说明性语句(伪指令) 每个语句有4部分组成 标号 指令助记符 操作数或参数 注释,10,习题1.15,MASM汇编语言中,下面哪些是程序员可以使用的自定义标识符。 FFH,DS,Again,next,data,h_ascii,6364b,flat 解答: FFH,Again,next,h_ascii 其他符号错误的原因: DS是数据段寄存器名 6364b是数字开头 data是汇编语言使用预定义符号,表示数据段地址 flat是表示平展存储模型的关键字,11,习题1.16,汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。 解答: 汇编语言程序的开发有4个步骤: 编辑:用文本编辑器形成一个以ASM为扩展名的源程序文件。 汇编:用汇编程序将ASM文件转换为OBJ模块文件。 连接:用连接程序将一个或多个目标文件链接成一个EXE或COM可执行文件。 调试:用调试程序排除错误,生成正确的可执行文件。,第2章习题:数据表示和寻址,2.1 简答题(2、3、4、7、8) 2.2 判断题(2、4、8、9、10) 2.3 填空题(1、2、3、8、9) 2.10、2.14、2.15、2.17,13,2.1 简答题-1,(2)字符“F”和数值46H作为MOV指令的源操作数有区别吗? 没有,因为字符“F”的ASCII码就是数值46H (3)为什么可以把指令“MOV EAX, (3467H)*3”中的数值表达式看成是常量? 汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,故称数值表达式为常量 (4)汇编语言为什么规定十六进制数若以AF开头,需要在前面加个0? 以便与标识符区别,因为标识符要求以字母(或特殊符号)开头,14,2.1 简答题-2,(7)为什么将查找操作数的方法称为数据寻“址”方式? 指令的操作数需要通过存储器地址或I/O地址,才能查找到数据本身,故称数据寻址方式 (8)为什么变量VAR在指令“MOV EAX, VAR”中表达直接寻址? 因为这里的变量名VAR实际上表达了从变量所存放的主存单元,即地址,15,2.2 判断题-1,(2)常用的BCD码为8421 BCD码,其中的8表示D3位的权重。 对 (4)用“BYTE”和“DWORD”定义变量,如果初值相同,则占用的存储空间也一样多。 错。用BYTE只占一个存储单元,而DWORD要占4个存储单元 (8)立即数寻址只会出现在源操作数中。 对,16,2.2 判断题-2,(9)存储器寻址方式的操作数当然在主存了。 对 (10)指令“MOV EAX, VAR+2”与“MOV EAX, VAR2”功能相同。 对,仅是不同的形式罢了,17,2.3 填空题-1,(1)计算机中有一个“01100001”编码。如果把它认为是无符号数,它是十进制数_;如果认为它是BCD码,则表示真值_;又如果它是某个ASCII码,则代表字符_。 97,61,小写字母a (2)C语言用“n”表示让光标回到下一行首位,在汇编语言中需要输出两个控制字符:一个是回车,其ASCII码是_,它将光标移动到当前所在行的首位;另一个是换行,其ASCII码是_,它将光标移到下一行。 0DH(13),0AH(10),18,2.3 填空题-2,(3)定义字节变量的伪指令助记符是_,获取变量名所具有的偏移地址的操作符是_。 BYTE,OFFSET (8)指令“MOV EAX, OFFSET MSG”的目的操作数和源操作数分别采用_和_寻址方式。 寄存器寻址,立即数寻址 (9)已知ESI04000H,EBX20H,指令“MOV EAX, ESI+EBX*2+8”中访问的有效地址是_。 04000H20H2804048H,19,习题2.10-1,按照如下要求定义变量或符号常量: (1) my1b为字符串变量:Personal Computer my1b byte Personal Computer (2) my2b为用十进制数表示的字节变量:20 my2b byte 20 (3) my3b为用十六进制数表示的字节变量:20 my3b byte 14h (4) my4b为用二进制数表示的字节变量:20 my4b byte 00010100b,20,习题2.10-2,按照如下要求定义变量或符号常量: (5) my5w为20个未赋值的字变量 my5w word 20 dup(?) (6) my6c为100的常量 my6c = 100 (7) my7c表示字符串:Personal Computer my7c equ ,21,习题2.14,按照如下输出格式,在屏幕上显示ASCII表 编程在数据段直接构造这样的表格、填写相应ASCII代码值(不是字符本身),然后使用字符串显示子程序DISPMSG实现显示,22,习题2.14解答1,.data table byte |0 1 2 3 4 5 6 7 8 9 A B C D E F, 13,10 byte -+-, 13,10 byte 20 |,20h,20h,21h,20h,22h,20h,23h,20h, 24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h byte 2ah,20h,2bh,20h,2ch,20h,2dh,20h,2eh,20h, 2fh,20h,13,10 byte 30 |,30h,20h,31h,20h,32h,20h,33h,20h, 34h,20h,35h,20h,36h,20h,37h,20h,38h,20h,39h,20h byte 3ah,20h,3bh,20h,3ch,20h,3dh,20h,3eh,20h, 3fh,20h,13,10 byte 0,23,习题2.14解答2, ca =2 cas =20h byte ca,0 |,cas,20h,cas+1,20h,cas+2,20h, cas+3,20h,cas+4,20h,cas+5,20h,cas+6,20h,cas+7,20h byte cas+8,20h,cas+9,20h,cas+0ah,20h,cas+0bh,20h, cas+0ch,20h,cas+0dh,20h,cas+0eh,20h,cas+0fh,20h,13,10 cas =cas+10h ca =ca+1 byte ca,0 |,cas,20h,cas+1,20h,cas+2,20h, cas+3,20h,cas+4,20h,cas+5,20h,cas+6,20h,cas+7,20h byte cas+8,20h,cas+9,20h,cas+0ah,20h,cas+0bh,20h, cas+0ch,20h,cas+0dh,20h,cas+0eh,20h,cas+0fh,20h,13,10 ,24,习题2.15,数据段有如下定义: var dword 12345678h 现以字节为单位按地址从低到高的顺序,写出这个变量内容。 var变量的内容:78H、56H、34H、12H 并说明如下指令的执行结果: mov eax,var ;EAX12345678H mov bx,word ptr var ;BX5678H mov cx,word ptr var+2 ;CX1234H mov dl,byte ptr var ;DL78H mov dh,byte ptr var+3 ;DH12H,25,习题2.17,说明源操作数的寻址方式,(1)mov edx,1234h 立即数 (2)mov edx,vard 直接 (3)mov edx,ebx 寄存器 (4)mov edx,ebx 寄存器间接 (5)mov edx,ebx+1234h 寄存器相对 (6)mov edx,vardebx 寄存器相对 (7)mov edx,ebx+edi 基址变址 (8)mov edx,ebx+edi+1234h 相对基址变址 (9)mov edx,vardesi+edi 相对基址变址 (10)mov edx,ebp*4 带比例寻址,第3章习题:通用数据处理指令,3.1 简答题(1、2、5、7、9) 3.2 判断题(1、4、5、7、10) 3.3 填空题(2、4、5、8、10) 3.4、3.6、3.11、3.14、3.16 3.21、3.22,27,3.1 简答题-1,(1)如何修改“MOV ESI, WORD PTR 250”语句使其正确? 删除“WORD PTR”即可 (2)为什么说“XCHG EDX,CX”是一条错误的指令? 源、目标寄存器位数不同,不能用该指令进行数据交换 (5)执行了一条加法指令后,发现ZF1,说明结果是什么? (5)表明运算结果为0,28,3.1 简答题-2,(7)大小写字母转换使用了什么规律? 大小写字母转换利用它们的ASCII码相差20H (9)除法指令“DIV ESI”的被除数是什么? 被除数64位,在EDX和EAX中,EDX保存高32位、EAX保存低32位,29,3.2 判断题-1,(1)指令“MOV EAX,0”使EAX结果为0,所以标志ZF1。 错,MOV指令不影响标志 (4)虽然ADD指令和SUB指令执行后会影响标志状态,但执行前的标志并不影响它们的执行结果。 对 (5)80减90(8090)需要借位,所以执行结束后,进位标志CF1。 对,减法时借位也用CF标志反映,30,3.2 判断题-2,(7)无符号数在前面加零扩展,数值不变;有符号数前面进行符号扩展,位数加长一位、数值增加一倍。 错,符号扩展也不改变数值大小 (10)SHL指令左移一位,就是乘10。 错,左移一位,相当于乘2。这里的位是二进制比特位,31,3.3 填空题-1,(2)指令“POP EDX”的功能也可以用MOV和ADD指令实现,依次应该是_和_指令。 MOV EDX,ESP,ADD ESP,4 (4)进行8位二进制数加法:BAH6CH,8位结果是_,标志PF_。如果进行16位二进制数加法:45BAH786CH,16位结果是_,标志PF_。 26H,0,BE26H,0,32,3.3 填空题-2,(5)已知AX98H,执行“NEG AX”指令后,AX_,标志SF_。 68H,0 (8)指令“XOR EAX, EAX”和“SUB EAX, EAX”执行后,EAX_,CFOF_。而指令“MOV EAX, 0”执行后,EAX_,CF和OF没有变化。 0,0,0 (10)欲将EDX内的无符号数除以16,使用指令“SHR EDX, _”,其中后一个操作数是一个立即数。 4,33,习题3.4,请给每种组合各举一个实例 (1)mov reg, imm (2)mov mem, imm (3)mov reg, reg (4)mov mem, reg (5)mov seg, reg (6)mov reg, mem (7)mov seg, mem (8)mov reg, seg (9)mov mem, seg,34,习题3.6,使用MOV指令实现交换指令“XCHG EBX,EDI”功能。 解答: mov eax,ebx mov ebx,edi mov edi,eax,35,习题3.11-1,执行如下程序片断,说明每条指令的执行结果 (1) mov eax,80h ;EAX80H add eax,3 ;EAX83H,CF0,SF0 add eax,80h ;EAX103H,CF0,OF0 adc eax,3 ;EAX106H,CF0,ZF0,36,习题3.11-2,执行如下程序片断,说明每条指令的执行结果 (2) mov eax,100 ;EAX100(64H) add ax,200 ;EAX300(12CH),CF0 (3) mov eax,100 ;EAX100(64H) add al,200 ;EAX44(2CH),CF1 (包含256的进位含义:25644300),37,习题3.11-3,执行如下程序片断,说明每条指令的执行结果 (4) mov al,7fh ;AL7FH sub al,8 ;AL77H,CF0,SF0 sub al,80h ;ALF7H,CF1,OF1 sbb al,3 ;ALF3H,CF0,ZF0,38,习题3.14-1,请分别用一条汇编语言指令完成如下功能: (1)把EBX寄存器和EDX寄存器的内容相加,结果存入EDX寄存器。 add edx,ebx (2)用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 add al,ebx+esi,39,习题3.14-2,请分别用一条汇编语言指令完成如下功能: (3)用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加,并把结果送回存储器中。 add bx+0b2h,cx (4)将32位变量VARD与数3412H相加,并把结果送回该存储单元中。 add varw,3412h (5)把数0A0H与EAX寄存器的内容相加,并把结果送回EAX中。 (5) add eax,0a0h,40,习题3.16-1,执行如下程序片断,说明每条指令的执行结果 (1) mov esi,10011100b ;ESI 9CH and esi,80h ;ESI 80H or esi,7fh ;ESI FFH xor esi,0feh ;ESI 01H (2) mov eax,1010b ;EAX 1010B(可有前导0) shr eax,2 ;EAX 0010B,CF1 shl eax,1 ;EAX 0100B,CF0 and eax,3 ;EAX 0000B,CF0,41,习题3.16-2,执行如下程序片断,说明每条指令的执行结果 (3) mov eax,1011b ;EAX 1011B(可有前导0) rol eax,2 ;EAX 101100B,CF0 rcr eax,1 ;EAX 10110B,CF0 or eax,3 ;EAX 10111B,CF0 (4) xor eax,eax ;EAX0,CF0,OF0 ;ZF1,SF0,PF1,42,习题3.21,如下程序片段实现EAX乘以某个数X的功能,请判断X? 请使用一条乘法指令实现上述功能。 mov ecx, eax shl eax, 3 lea eax, eax+eax*8 sub eax, ecx 解答: 8*8+8-171 imul eax, 71,43,习题3.22,请使用移位和加减法指令编写一个程序片段计算:EAX21,假设乘积不超过32位。提示:21242220。 解答: mov ebx,eax ;EBXEAX20 shl ebx,2 ;EBXEAX22 add eax,ebx ;EAXEAX(2220) shl ebx,2 ;EBXEAX24 add eax,ebx ;EAXEAX(242220),第4章习题:程序结构,4.1 简答题(2、5、6、9、10) 4.2 判断题(2、4、6、7、10) 4.3 填空题(2、3、4、5、6) 4.4、4.7、4.15、4.17、4.27、4.29,45,4.1 简答题-1,(2)数据的直接寻址和指令的直接寻址有什么区别? 数据的直接寻址给出数据所在的存储器地址,指令的直接寻址给出指令所在的存储器地址。 (5)什么是奇偶校验? 数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括校验位在内的“1”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验 (6)助记符JZ和JE为什么表达同一条指令? 两个数相减,差值为0(JZ)与两个数相等(JE)是一个含义,46,4.1 简答题-2,(9)如果循环体的代码量远超过128个字节,还能用LOOP指令实现计数控制循环吗? 不能,因为LOOP指令的目标地址采用相对短转移,只能在128127字节之间循环 (10)什么是“先循环、后判断”循环结构? 指先执行循环体,然后判断是否继续循环的结构,这种结构通常至少执行一次循环体,47,4.2 判断题,2)指令的相对寻址都是近转移。 对 4)JMP指令对应高级语言的GOTO语句,所以不能使用 错,需要使用 6)JA和JG指令的条件都是“大于”,所以是同一个指令的两个助记符。 错,JA针对无符号数,JG针对有符号数 7)JC和JB的条件都是CF1,所以是同一条指令。 对。无符号小于(JB)必然借位(JC) 10)若ECX0,则LOOP指令和JECX指令都发生转移。 对,48,4.3 填空题-1,(2)MASM给短转移、近转移和远转移定义的类型名依次是_、_和_。 SHORT,NEAR,FAR (3)假设在平展存储模型下,EBX1256H,双字变量TABLE的偏移地址是20A1H,线性地址32F7H处存放3280H,执行指令“JMP EBX” 后EIP_,执行指令“JMP TABLEEBX”后EIP_。 1256H,3280H,49,4.3 填空题-2,(4)“CMP EAX,3721H”指令之后是JZ指令,发生转移的条件是EAX_,此时ZF_。 3721H,1 (5)执行“SHR EBX,4”指令后,JNC发生转移,说明EBX的D3_。 0 (6)在EDX等于0时转移,可以使用指令“CMP EDX,_”、也可以使用“TEST EDX,_”构成条件,然后使用JE指令实现转移。 0,EDX,50,习题4.4,已知var1、var2、var3和var4是32位无符号整数,用汇编语言程序片段实现如下C+语句: var4=(var1*6)/( var2-7)+var3 mov eax,var1 mov ebx,6 mul ebx ;var1*6 mov ebx,var2 sub ebx,7 ;var2-7 div ebx ;(var1*6)/( var2-7) add eax,var3 ;(var1*6)/( var2-7)+var3 mov var4,eax,51,习题4.7,定义COUNT(假设为10)个元素的32位数组,输入元素编号(0COUNT-1),利用DISPHD子程序输出其地址、利用DISPSID子程序输出其值。 ;数据段 count = 10 array dword 0,1,2,3,4,5,6,7,8,9 ;代码段 call readuid ;输入N,小于10 lea eax,arrayeax*4 ;EAX地址 call disphd ;显示地址 mov eax,arrayeax*4 ;EAX变量值 call dispsid ;显示数值,52,习题4.15-1,IA-32处理器的指令CDQ将EAX符号扩展到EDX。假若没有该指令,编程实现该指令功能。 (1)按照符号扩展的含义编程,即:EAX最高为0,则EDX0;EAX最高为1,则EDXFFFFFFFFH。 test eax,8000h ;测试最高位 jz next1 ;最高位为0,转移 mov edx,0ffffffffh ;最高位为1,设置EDXFFFFFFFFH jmp done ;跳过另一个分支 next1: mov dx,0 ;设置EDX0 done:,53,习题4.15-2,编程实现指令CDQ,将EAX符号扩展到EDX (2)使用移位等指令进行优化编程。 方法1: mov edx,eax sar edx,31 方法2: rol eax,1 rcr edx,1 sar edx,31 ror eax,1,54,习题4.17-1,编写一个程序,先提示输入数字“Input Number:09”,然后在下一行显示输入的数字,结束;如果不是键入了09数字,就提示错误“Error!”,继续等待输入数字。 方法1:使用字符输入输出子程序 ;数据段 inmsg byte Input number(09): ,0 ermsg byte 0dh,0ah,Error! Input again: ,0 ;代码段 mov eax,offset inmsg ;提示输入数字 call dispmsg,55,习题4.17-2,方法1:使用字符输入输出子程序 again: call readc ;等待按键 cmp al,0 ;数字 9? ja erdisp call dispcrlf call dispc jmp done,erdisp: mov eax,offset ermsg call dispmsg jmp again done:,56,习题4.17-3,方法2:使用数字输入输出子程序 again: call readuid ;call readsid cmp eax,0 ;数字 9? ja erdisp ;jg erdisp call dispuid ;call dispsid jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again,57,习题4.27-1,习题2.14在屏幕上显示ASCII表,现仅在数据段设置表格缓冲区,编程将ASCII代码值填入留出位置的表格,然后调用显示功能实现(需要利用双重循环)。 table byte |0 1 2 3 4 5 6 7 8 9 A B C D E F,13,10 byte -+-,13,10 tab1 byte 6 dup(36 dup(?),13,10) byte 0,58,习题4.27-2,mov ebx,offset tab1 mov edx,| 02 mov ax,2020h mov esi,6 again0: mov ebx,edx add ebx,4 mov ecx,16 again1: mov word ptr ebx,ax add ebx,2 inc al loop again1,59,习题4.27-3,add ebx,2 add edx,1 dec esi jnz again0 mov eax,offset table call dispmsg,60,习题4.29 素数判断程序-1,(1)采用直接简单的算法:假设输入N,将其逐个除以2N-1,只要能整除(余数为0)说明不是素数,只有都不能整除才是素数。 (1)核心程序片段如下: cmp eax,3 jbe doney ;小于等于3的都是素数 cdq mov esi,eax ;EDI.ESI=N3 mov edi,edx mov ebx,2 ;EBX从2开始,61,习题4.29 素数判断程序-2,again: div ebx test edx,edx jz donen ;余数为0,能整除,不是素数 inc ebx cmp ebx,esi ;EBX到N-1结束 mov eax,esi mov edx,edi jb again,62,习题4.29 素数判断程序-3,(2)采用只对奇数整除的算法:1、2和3是素数,所有大于3的偶数不是素数,从5开始的数字只要除以从3开始的奇数,只有都不能整除才是素数。 提示: 排除4的情况,从3开始除,每次循环加2 mov ebx,3 add ebx,2,第5章习题:模块化程序设计,5.1 简答题(1、4、5、6、7) 5.2 判断题(2、5、6、7、8) 5.3 填空题(1、4、5、6、7) 5.7、5.8、5.11、5.13,64,5.1 简答题-1,(1)指令“CALL EBX”采用了指令的什么寻址方式? 寄存器间接寻址 (4)参数传递的“传值”和“传址”有什么区别? 传值是传递参数的拷贝,传址是传递参数的地址 (5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题? 子程序保持堆栈平衡才能保证正确返回 主程序保持堆栈平衡,才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能致使堆栈溢出,65,5.1 简答题-2,(6)INCLUDE语句和INCLUDELIB有什么区别? INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件 (7)什么是子程序库? 子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用,66,5.2 判断题-1,(2)CALL指令的执行并不影响堆栈指针ESP。 错,要改变,因为返回地址要压入堆栈 (5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。 错,不能保护传递出口参数的寄存器 (6)利用INCLUDE包含的源文件实际上只是源程序的一部分。 对,67,5.2 判断题-2,(7)宏调用与子程序调用一样都要使用CALL指令实现。 错,宏调用是通过宏展开实现的调用,不用CALL指令 (8)宏定义与子程序一样一般书写与主程序之后。 错,宏需要先定义后调用,一般在源程序开头部分。,68,5.3 填空题-1,(1)指令“RET i16”的功能相当于“RET”指令和“ADD ESP, _”组合。 i16 (4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:_。如果将该编码加37H,则为_,它是字符_的ASCII码值。 A,41H,A (5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_。 EBP,69,5.3 填空题-2,(6)MASM汇编语言中,声明一个共用的变量应使用_伪指令;而使用外部变量要使用_伪指令声明。 PUBLIC,EXTERN (7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是_。宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是_。 TEST ENDP,ENDM,70,习题5.7-1,编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下退格键(对应ASCII码是08H)则程序退出。请调用书中的HTOASC子程序 ;代码段,主程序 again: call readc cmp al,08h ;退格键BS=08H jz done mov bl,al mov al,: call dispc,71,习题5.7-2,mov al,bl rol al,4 call htoasc ;调用子程序 call dispc ;显示一个字符 mov al,bl call htoasc ;调用子程序 call dispc ;显示一个字符 call dispcrlf jmp again done:,72,习题5.8-1,编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。 ;代码段,主程序 mov eax,8F98FF00H call dispbd ;调用子程序 ;代码段,子程序 dispbd proc ;32位二进制数的输出 push ecx mov ecx,32 ;要输出的字符个数 dbd: rol eax,1 ;AL循环左移一位,73,习题5.8-2,push eax and al,01h ;取AL最低位 add al,30h ;转化成相应的ASCLL码值 call dispc ;以二进制的形式显示 pop eax loop dbd pop ecx ret dispbd endp,74,习题5.11,;计算字节校验和的通用过程 ;入口参数:DS:EBX数组的段地址:偏移地址 ECX元素个数 ;出口参数:AL校验和 ;说明:除EAX/EBX/ECX外,不影响其他寄存器 checksum proc xor al,al ;累加器清0 sum: add al,ebx ;求和 inc ebx ;指向下一个字节 loop sum ret checksum endp,75,习题5.13-1,利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX主存偏移地址,ECX字节个数(主存区域的长度)。同时编写一个主程序进行验证。 ;数据段 var byte This is a test! ;主程序 mov eax,offset var mov ecx,sizeof var call dispmem,76,习题5.13-2,;子程序 dispmem proc push ebx mov ebx,eax dispm1: cmp ecx,0 jz dispm2 mov al,ebx call disphb mov al, call dispc,inc ebx dec ecx jmp dispm1 dispm2: pop ebx ret dispmem endp,第6章习题:Windows编程,6.1 简答题(3、5、6、7) 6.2 判断题(1、3、4) 6.3 填空题(1、3、6) 6.4、6.6、6.7,78,6.1 简答题-1,(3)运行Windows应用程序,有时为什么会提示某个DLL文件不存在? Windows程序在运行时需要加载其配套的动态连接库DLL文件,当其没有被搜索到时就会提示不存在。 (5)ExitProcess函数可以按汇编语言习惯全部使用小写字母表示吗? 不能,因为Windows的API函数按照C语言习惯区别大小写字母,是不同的,79,6.1 简答题-2,(6)Win32 API中可以使用哪两种字符集? 8位的ASCII字符集和16位的Unicode字符集 (7)为什么调用API函数之后,ECX等寄存器改变了? 因为API函数并不是按照汇编语言的规则编写的,它的规则是不保护它们,80,6.2 判断题,(1)Windows可执行文件中包含动态连接库中的代码。 错,不含,运行时才加载 (3)INVOKE语句只能传递主存操作数,不能传递寄存器值。 错,可以使用寄存器参数 (4)Windows控制台是命令行窗口,也就是MS-DOS窗口。 错,Windows控制台与DOS窗口本质不同,81,6.3 填空题,(1)Windows系统有3个最重要的系统动态连接库文件,它们是_、_和_。 KERNEL32.DLL,USER32.DLL,GDI32.DLL (3)获得句柄函数GetStdHandle执行结束,使用_提供返回结果。 EAX (6)WriteConsole和ReadConsole函数的参数类似,都有5个,第1个参数是_,第2个参数是输出或输入缓冲区的_,第3个参数是输出或输入的字符_,第4个参数指向实际输出或输入字符个数的变量,最后1个参数一般要求代入_。 句柄实例,地址,个数,0,82,习题6.4-1,执行CPUID指令,直接使用控制台输出函数将处理器识别字符串显示出来。 .686 .model flat,stdcall option casemap:none includelib binkernel32.lib ExitProcess proto,:dword,83,习题6.4-2,GetStdHandle proto,:dword WriteConsoleA proto,:dword,:dword,:dword,:dword,:dword WriteConsole equ STD_OUTPUT_HANDLE = -11 .data outhandle dword ? outbuffer byte The processor , 12 dup(0) outbufsize = sizeof outbuffer outsize dword ?,84,习题6.4-3,mov eax,0 cpuid ;执行处理器识别指令 mov dword ptr outbuffer+outbufsize-12,ebx mov dword ptr outbuffer+outbufsize-8,edx mov dword ptr outbuffer+outbufsize-4,ecx invoke GetStdHandle,STD_OUTPUT_HANDLE mov outhandle,eax invoke WriteConsole,outhandle, addr outbuffer,outbufsize,addr outsize,0 invoke ExitProcess,0,85,习题6.6-1,直接使用控制台输出函数实现主存区域内容的显示 显示形式 每行显示16个字节(128位) 每行开始先显示首个主存单元的偏移地址 然后用冒号分隔主存内容,86,习题6.6-2,.data var byte This is a test!,ABCDEFG,0123456789 _outsize dword ? _outhandle dword ? _membuffer byte 57 dup(20h),13,10 .code start: mov eax,offset var mov ecx,sizeof var call dispmem invoke ExitProcess,0,87,习题6.6-3,dispmem proc test ecx,ecx ;个数为0,不显示 jz dispm11 ;退出 pushad mov esi,ecx ;ESI=要显示内容的字节数 mov edi,eax ;EDI=要显示内容的地址 invoke GetStdHandle,STD_OUTPUT_HANDLE mov _outhandle,eax ;获得输出句柄,88,习题6.6-4,;1.显示缓冲区全部填充为空格 dispm1: xor ebx,ebx ;指示显示缓冲区 dispm2: mov _membufferebx, inc ebx cmp ebx,(sizeof _membuffer)-2 jb dispm2 ;2.显示内容所在的存储器地址 xor ebx,ebx mov ecx,8 ;地址是十六进制8位 mov eax,edi,89,习题6.6-5,dispm3: rol eax,4 mov dl,al and dl,0fh or dl,30h cmp dl,39h jbe dispm4 add dl,7 dispm4: mov _membufferebx,dl inc ebx loop dispm3 mov _membufferebx,: ;显示冒号 add ebx,2,90,习题6.6-6,mov ecx,16 ;一行最多显示16个字节 ;3.显示一个字节内容 dispm5: mov al,edi mov dl,al shr dl,4 or dl,30h cmp dl,39h jbe dispm6 add dl,7 dispm6: mov _membufferebx,dl inc ebx,91,习题6.6-7,and al,0fh or al,30h cmp al,39h jbe dispm7 add al,7 dispm7: mov _membufferebx,al add ebx,2 inc edi ;指向下一个要显示的字节 dec esi jz dispm10 ;没有要显示的内容,退出 loop dispm5,92,习题6.6-8,invoke WriteConsole,_outhandle, addr _membuffer,sizeof _membuffer, addr _outsize,0 jmp dispm1 dispm10: invoke WriteConsole,_outhandle, addr _membuffer,sizeof _membuffer, addr _outsize,0 popad dispm11: ret dispmem endp,93,习题6.7-1,执行CPUID指令,在消息窗口显示处理器识别字符串,要求该消息窗有OK和Cancel两个按钮。 MessageBoxA proto :dword,:dword,:dword,:dword MessageBox equ NULL equ 0 MB_OK equ 1 .data szCaption byte 消息窗口,0 outbuffer byte 本机的处理器是, 12 dup(0),0 outbufsize = sizeof outbuffer-1,94,习题6.7-2,.code start: mov eax,0 cpuid ;执行处理器识别指令 mov dword ptr outbuffer+outbufsize-12,ebx mov dword ptr outbuffer+outbufsize-8,edx mov dword ptr outbuffer+outbufsize-4,ecx invoke MessageBox,NULL,addr outbuffer, addr szCaption,MB_OK invoke ExitProcess,NULL end start,第7章习题:与Visual C+的混合编程,7.1 简答题(1、3、5、6) 7.2 判断题(5、6、7) 7.3 填空题(1、4、5) 7.4、7.6,96,7.1 简答题,(1)什么是混合编程? 组合多种程序设计语言,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程 (3)汇编语言与C+语言的混合编程有哪两种方法? 嵌入汇编和模块连接 (5)C+语言函数通过什么方式传递入口参数? 堆栈 (6)堆栈帧是一个什么作用的堆栈空间? 用于传递参数,保存返回地址、局部变量,保护寄存器,97,7.2 判断题,(5)MASM汇编语言的C语言类型对应C+语言的_cdecl。 对 (6)局部变量是通过堆栈创建的。 对 (7)使用寄存器替代频繁访问的变量,可以提升程序性能。 对,因为减少了相对耗时的存储器访问操作,98,7.3 填空题,(1)有一个数据100,要在嵌入汇编指令中作为立即数,且用十六进制形式表达,可以像汇编语言中一样表达为_,也可以像C+语言一样表达为_。 64H,0x64 (4)函数调用中,通常通过EBP指向堆栈帧,其值减_访问第一个局部变量,其值加_访问第一个入口参数,返回地址则由其值加_指向。 4,8,4 (5)C+函数返回一个32位整数,返回值使用_保存。 EAX,99,习题7.4,阅读如下嵌入汇编的C+程序,说明显示结果。 #include int power2(int,int); void main(void) coutpower2(5,6)endl; int power2(int num,int power) _ _asm mov eax,num mov ecx,power shl eax,cl ,320,100,习题7.6-1,如下C+程序中调用汇编语言子程序对这两个数求积 编写汇编语言子程序模块 #include extern “C“ int multi(int x,int y); void main(void) int x,y; cinx; ciny; cout multi(x,y)endl; ,101,习题7.6-2,解答: .686 .model flat,c .code multi proc ,var1:dword,var2:dword mov eax,var1 imul var2 ret multi endp end,第8章习题:DOS环境的程序设计,8.1 简答题(1、2、4) 8.2 判断题(2、4、6、7) 8.3 填空题(1、2、7) 8.6、8.14,103,8.1 简答题,(1)实地址方式的段基地址为什么常只给出高16位? 在20位物理地址中,段起始地址的低4位规定必须是0 (2)实地址存储模型下,逻辑地址如何转换为物理地址? 高16位段地址左移4位加偏移地址 (4)80x86处理器的MOV指令支持外设数据传送吗? 不支持,外设数据传送使用IN和OUT指令,104,8.2 判断题,(2)8086中,“MOV AX,BX”是非法指令。 对,8086不支持使用AX进行寄存器间接寻址 (4)DOS程序和Windows程序一样使用同一个退出函数(功能)实现退出。 错 (6)指令“OUT DX,AX”的两个操作数均采用寄存器寻址方式,一个来自处理器、一个来自外设。 错,OUT指令的DX表示采用寄存器间接寻址I/O地址 (7)指令“IN BX,20H”正确,表示从20H端口输入一个数据、存放到BX寄存器。 错。指令“IN AX,20H”才是正确的,105,8.3 填空题,(1)DOS平台下使用实地址存储模型,只能访问_存储空间,仍进行分段管理,但每段不大于_容量,且起始物理地址的低4位必须是_。 1MB,64KB,0000 (2)在实地址工作方式下,逻辑地址“7380H400H”表示的物理地址是_,并且该段起始于_物理地址。 73C00H,73800H (7)IA-32处理器支持4GB主存,具有_个8位外设端口,在IN和OUT指令中使用_寄存器可以访问到全部端口。 64K,DX,106,习题8.6,使用DOS系统功能编写DOS应用程序,要求如下: 提示“Press ESC to Exit”,等待用户输入字符。如果用户按下ESC(其ASCII码是1BH)则退出,否则继续等待输入字符。 解答: 在例8-2程序中,显示信息之后,加入如下按键及判断的程序片段即可。 again: mov ah,1 ;等待按键 int 21h cmp al,1bh jnz again,107,习题8.14-1,利用CMOS RAM的系统时间,将年月日时分秒星期等时间完整的显示出来。 解答:参考例8-7程序 难点是星期的显示,可以利用地址表方法如下实现 .data week1 byte Sunday,0 week2 byte Monday,0 week7 byte Saturday,0 week word week1,week2,week3,week7,108,习题8.14-2,mov al,6 ;AL6(从6号单元获取星期数据) out 70h,al in al,71h dec al shl al,1 xor ah,ah ;查表获得星期字符串 mov bx,offset week add bx,ax mov ax,bx call dispmsg ;显示星期,第9章习题:浮点、多媒体及64位指令,9.1 简答题(1、5、7) 9.2 判断题(1、2、3) 9.3 填空题(1、2、3) 9.4、9.5、9.6,110,9.1 简答题,(1)浮点数据为什么要采用规格化形式? 浮点数据采用规格化形式可以表达更大、更精确的数据,也避免编码的多样性 (5)为什么浮点数据编码有舍入问题,而整数编码却没有? 浮点数据编码无法表达任意精度的数据,所以需要舍入。但整数编码表达的数据都是精确的数据 (7)多媒体指令为什么常被称为SIMD指令? 多媒体指令的一个突出特点是一条指令同时处理多组数据,即单指令多数据SIMD,111,9.2 判断题,(1)浮点数据格式不能表达整数。 错,当然可以。整数可以认为是小数部分为0的实数 (2)一个32位数据是全0,不管它是整数编码还是单精度浮点编码,都表示真值0。 对 (3)x87 FPU有8个80位浮点数据寄存器,可以随机存取。 错,采用堆栈结构、不是随机存取,112,9.3 填空题,(1)对真值-125,用补码表示是_;标准偏移码与补码只有一位不同,所以是_;而浮点阶码则再减1、是_。 10000011,000000011,00000010 (2)单精度浮点数据格式共有_位,其中符号位占一位,阶码部分占_位,尾数部分有_位。 32,8,23 (3)通过例9-2知道实数“100.25”的浮点格式编码是42C88000H,则“100.25”的浮点格式编码是_。 C2C88000H,113,习题9.4,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!