位汇编语言习题及答案(全部)(钱晓捷版).ppt

上传人:max****ui 文档编号:6319722 上传时间:2020-02-22 格式: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 哪个处理器的指令系统成为Intel80 x86系列处理器的基本指令集 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位的寄存器 其中D0 D7和D8 D15部分可以分别用名称 和 表示 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 为什么可以把指令 MOVEAX 34 67H 3 中的数值表达式看成是常量 汇编程序在汇编过程中对数值表达式计算 得到一个确定的数值 故称数值表达式为常量 4 汇编语言为什么规定十六进制数若以A F开头 需要在前面加个0 以便与标识符区别 因为标识符要求以字母 或特殊符号 开头 14 2 1简答题 2 7 为什么将查找操作数的方法称为数据寻 址 方式 指令的操作数需要通过存储器地址或I O地址 才能查找到数据本身 故称数据寻址方式 8 为什么变量VAR在指令 MOVEAX VAR 中表达直接寻址 因为这里的变量名VAR实际上表达了从变量所存放的主存单元 即 地址 15 2 2判断题 1 2 常用的BCD码为8421BCD码 其中的8表示D3位的权重 对 4 用 BYTE 和 DWORD 定义变量 如果初值相同 则占用的存储空间也一样多 错 用BYTE只占一个存储单元 而DWORD要占4个存储单元 8 立即数寻址只会出现在源操作数中 对 16 2 2判断题 2 9 存储器寻址方式的操作数当然在主存了 对 10 指令 MOVEAX VAR 2 与 MOVEAX VAR 2 功能相同 对 仅是不同的形式罢了 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 指令 MOVEAX OFFSETMSG 的目的操作数和源操作数分别采用 和 寻址方式 寄存器寻址 立即数寻址 9 已知ESI 04000H EBX 20H 指令 MOVEAX ESI EBX 2 8 中访问的有效地址是 04000H 20H 2 8 04048H 19 习题2 10 1 按照如下要求定义变量或符号常量 1 my1b为字符串变量 PersonalComputermy1bbyte PersonalComputer 2 my2b为用十进制数表示的字节变量 20my2bbyte20 3 my3b为用十六进制数表示的字节变量 20my3bbyte14h 4 my4b为用二进制数表示的字节变量 20my4bbyte00010100b 20 习题2 10 2 按照如下要求定义变量或符号常量 5 my5w为20个未赋值的字变量my5wword20dup 6 my6c为100的常量my6c 100 7 my7c表示字符串 PersonalComputermy7cequ 21 习题2 14 按照如下输出格式 在屏幕上显示ASCII表编程在数据段直接构造这样的表格 填写相应ASCII代码值 不是字符本身 然后使用字符串显示子程序DISPMSG实现显示 22 习题2 14解答1 datatablebyte 0123456789ABCDEF 13 10byte 13 10byte 20 20h 20h 21h 20h 22h 20h 23h 20h 24h 20h 25h 20h 26h 20h 27h 20h 28h 20h 29h 20hbyte2ah 20h 2bh 20h 2ch 20h 2dh 20h 2eh 20h 2fh 20h 13 10byte 30 30h 20h 31h 20h 32h 20h 33h 20h 34h 20h 35h 20h 36h 20h 37h 20h 38h 20h 39h 20hbyte3ah 20h 3bh 20h 3ch 20h 3dh 20h 3eh 20h 3fh 20h 13 10 byte0 23 习题2 14解答2 ca 2 cas 20hbyteca 0 cas 20h cas 1 20h cas 2 20h cas 3 20h cas 4 20h cas 5 20h cas 6 20h cas 7 20hbytecas 8 20h cas 9 20h cas 0ah 20h cas 0bh 20h cas 0ch 20h cas 0dh 20h cas 0eh 20h cas 0fh 20h 13 10cas cas 10hca ca 1byteca 0 cas 20h cas 1 20h cas 2 20h cas 3 20h cas 4 20h cas 5 20h cas 6 20h cas 7 20hbytecas 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 数据段有如下定义 vardword12345678h现以字节为单位按地址从低到高的顺序 写出这个变量内容 var变量的内容 78H 56H 34H 12H并说明如下指令的执行结果 moveax var EAX 12345678Hmovbx wordptrvar BX 5678Hmovcx wordptrvar 2 CX 1234Hmovdl byteptrvar DL 78Hmovdh byteptrvar 3 DH 12H 25 习题2 17 说明源操作数的寻址方式 1 movedx 1234h立即数 2 movedx vard直接 3 movedx ebx寄存器 4 movedx ebx 寄存器间接 5 movedx ebx 1234h 寄存器相对 6 movedx vard ebx 寄存器相对 7 movedx ebx edi 基址变址 8 movedx ebx edi 1234h 相对基址变址 9 movedx vard esi edi 相对基址变址 10 movedx 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 163 21 3 22 27 3 1简答题 1 1 如何修改 MOVESI WORDPTR250 语句使其正确 删除 WORDPTR 即可 2 为什么说 XCHGEDX CX 是一条错误的指令 源 目标寄存器位数不同 不能用该指令进行数据交换 5 执行了一条加法指令后 发现ZF 1 说明结果是什么 5 表明运算结果为0 28 3 1简答题 2 7 大小写字母转换使用了什么规律 大小写字母转换利用它们的ASCII码相差20H 9 除法指令 DIVESI 的被除数是什么 被除数64位 在EDX和EAX中 EDX保存高32位 EAX保存低32位 29 3 2判断题 1 1 指令 MOVEAX 0 使EAX结果为0 所以标志ZF 1 错 MOV指令不影响标志 4 虽然ADD指令和SUB指令执行后会影响标志状态 但执行前的标志并不影响它们的执行结果 对 5 80减90 80 90 需要借位 所以执行结束后 进位标志CF 1 对 减法时借位也用CF标志反映 30 3 2判断题 2 7 无符号数在前面加零扩展 数值不变 有符号数前面进行符号扩展 位数加长一位 数值增加一倍 错 符号扩展也不改变数值大小 10 SHL指令左移一位 就是乘10 错 左移一位 相当于乘2 这里的位是二进制比特位 31 3 3填空题 1 2 指令 POPEDX 的功能也可以用MOV和ADD指令实现 依次应该是 和 指令 MOVEDX ESP ADDESP 4 4 进行8位二进制数加法 BAH 6CH 8位结果是 标志PF 如果进行16位二进制数加法 45BAH 786CH 16位结果是 标志PF 26H 0 BE26H 0 32 3 3填空题 2 5 已知AX 98H 执行 NEGAX 指令后 AX 标志SF 68H 0 8 指令 XOREAX EAX 和 SUBEAX EAX 执行后 EAX CF OF 而指令 MOVEAX 0 执行后 EAX CF和OF没有变化 0 0 0 10 欲将EDX内的无符号数除以16 使用指令 SHREDX 其中后一个操作数是一个立即数 4 33 习题3 4 请给每种组合各举一个实例 1 movreg imm 2 movmem imm 3 movreg reg 4 movmem reg 5 movseg reg 6 movreg mem 7 movseg mem 8 movreg seg 9 movmem seg 34 习题3 6 使用MOV指令实现交换指令 XCHGEBX EDI 功能 解答 moveax ebxmovebx edi mov edi eax 35 习题3 11 1 执行如下程序片断 说明每条指令的执行结果 1 moveax 80h EAX 80Haddeax 3 EAX 83H CF 0 SF 0addeax 80h EAX 103H CF 0 OF 0adceax 3 EAX 106H CF 0 ZF 0 36 习题3 11 2 执行如下程序片断 说明每条指令的执行结果 2 moveax 100 EAX 100 64H addax 200 EAX 300 12CH CF 0 3 moveax 100 EAX 100 64H addal 200 EAX 44 2CH CF 1 包含256的进位含义 256 44 300 37 习题3 11 3 执行如下程序片断 说明每条指令的执行结果 4 moval 7fh AL 7FHsubal 8 AL 77H CF 0 SF 0subal 80h AL F7H CF 1 OF 1sbbal 3 AL F3H CF 0 ZF 0 38 习题3 14 1 请分别用一条汇编语言指令完成如下功能 1 把EBX寄存器和EDX寄存器的内容相加 结果存入EDX寄存器 addedx ebx 2 用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加 并把结果送到AL中 addal ebx esi 39 习题3 14 2 请分别用一条汇编语言指令完成如下功能 3 用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加 并把结果送回存储器中 add ebx 0b2h ecx 4 将32位变量VARD与数3412H相加 并把结果送回该存储单元中 addvarw 3412h 5 把数0A0H与EAX寄存器的内容相加 并把结果送回EAX中 addeax 0a0h 40 习题3 16 1 执行如下程序片断 说明每条指令的执行结果 1 movesi 10011100b ESI 9CHandesi 80h ESI 80Horesi 7fh ESI FFHxoresi 0feh ESI 01H 2 moveax 1010b EAX 1010B 可有前导0 shreax 2 EAX 0010B CF 1shleax 1 EAX 0100B CF 0andeax 3 EAX 0000B CF 0 41 习题3 16 2 执行如下程序片断 说明每条指令的执行结果 3 moveax 1011b EAX 1011B 可有前导0 roleax 2 EAX 101100B CF 0rcreax 1 EAX 10110B CF 0oreax 3 EAX 10111B CF 0 4 xoreax eax EAX 0 CF 0 OF 0 ZF 1 SF 0 PF 1 42 习题3 21 如下程序片段实现EAX乘以某个数X的功能 请判断X 请使用一条乘法指令实现上述功能 movecx eaxshleax 3leaeax eax eax 8 subeax ecx解答 8 8 8 1 71imuleax 71 43 习题3 22 请使用移位和加减法指令编写一个程序片段计算 EAX 21 假设乘积不超过32位 提示 21 24 22 20 解答 movebx eax EBX EAX 20shlebx 2 EBX EAX 22addeax ebx EAX EAX 22 20 shlebx 2 EBX EAX 24addeax ebx EAX EAX 24 22 20 第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指令的目标地址采用相对短转移 只能在 128 127字节之间循环 10 什么是 先循环 后判断 循环结构 指先执行循环体 然后判断是否继续循环的结构 这种结构通常至少执行一次循环体 47 4 2判断题 2 指令的相对寻址都是近转移 对4 JMP指令对应高级语言的GOTO语句 所以不能使用错 需要使用6 JA和JG指令的条件都是 大于 所以是同一个指令的两个助记符 错 JA针对无符号数 JG针对有符号数7 JC和JB的条件都是CF 1 所以是同一条指令 对 无符号小于 JB 必然借位 JC 10 若ECX 0 则LOOP指令和JECX指令都发生转移 对 48 4 3填空题 1 2 MASM给短转移 近转移和远转移定义的类型名依次是 和 SHORT NEAR FAR 3 假设在平展存储模型下 EBX 1256H 双字变量TABLE的偏移地址是20A1H 线性地址32F7H处存放3280H 执行指令 JMPEBX 后EIP 执行指令 JMPTABLE EBX 后EIP 1256H 3280H 49 4 3填空题 2 4 CMPEAX 3721H 指令之后是JZ指令 发生转移的条件是EAX 此时ZF 3721H 1 5 执行 SHREBX 4 指令后 JNC发生转移 说明EBX的D3 0 6 在EDX等于0时转移 可以使用指令 CMPEDX 也可以使用 TESTEDX 构成条件 然后使用JE指令实现转移 0 EDX 50 习题4 4 已知var1 var2 var3和var4是32位无符号整数 用汇编语言程序片段实现如下C 语句 var4 var1 6 var2 7 var3moveax var1movebx 6mulebx var1 6movebx var2subebx 7 var2 7divebx var1 6 var2 7 addeax var3 var1 6 var2 7 var3movvar4 eax 51 习题4 7 定义COUNT 假设为10 个元素的32位数组 输入元素编号 0 COUNT 1 利用DISPHD子程序输出其地址 利用DISPSID子程序输出其值 数据段count 10arraydword0 1 2 3 4 5 6 7 8 9 代码段callreaduid 输入N 小于10leaeax array eax 4 EAX 地址calldisphd 显示地址moveax array eax 4 EAX 变量值calldispsid 显示数值 52 习题4 15 1 IA 32处理器的指令CDQ将EAX符号扩展到EDX 假若没有该指令 编程实现该指令功能 1 按照符号扩展的含义编程 即 EAX最高为0 则EDX 0 EAX最高为1 则EDX FFFFFFFFH testeax 8000h 测试最高位jznext1 最高位为0 转移movedx 0ffffffffh 最高位为1 设置EDX FFFFFFFFHjmpdone 跳过另一个分支next1 movdx 0 设置EDX 0done 53 习题4 15 2 编程实现指令CDQ 将EAX符号扩展到EDX 2 使用移位等指令进行优化编程 方法1 movedx eaxsaredx 31方法2 roleax 1rcredx 1saredx 31roreax 1 54 习题4 17 1 编写一个程序 先提示输入数字 InputNumber 0 9 然后在下一行显示输入的数字 结束 如果不是键入了0 9数字 就提示错误 Error 继续等待输入数字 方法1 使用字符输入输出子程序 数据段inmsgbyte Inputnumber 0 9 0ermsgbyte0dh 0ah Error Inputagain 0 代码段moveax offsetinmsg 提示输入数字calldispmsg 55 习题4 17 2 方法1 使用字符输入输出子程序again callreadc 等待按键cmpal 0 数字9 jaerdispcalldispcrlfcalldispcjmpdone erdisp moveax offsetermsgcalldispmsgjmpagaindone 56 习题4 17 3 方法2 使用数字输入输出子程序again callreaduid callreadsidcmpeax 0 数字9 jaerdisp jgerdispcalldispuid calldispsidjmpdoneerdisp moveax offsetermsgcalldispmsgjmpagain 57 习题4 27 1 习题2 14在屏幕上显示ASCII表 现仅在数据段设置表格缓冲区 编程将ASCII代码值填入留出位置的表格 然后调用显示功能实现 需要利用双重循环 tablebyte 0123456789ABCDEF 13 10byte 13 10tab1byte6dup 36dup 13 10 byte0 58 习题4 27 2 movebx offsettab1movedx 02 movax 2020hmovesi 6again0 mov ebx edxaddebx 4movecx 16again1 movwordptr ebx axaddebx 2incalloopagain1 59 习题4 27 3 addebx 2addedx 1decesijnzagain0moveax offsettablecalldispmsg 60 习题4 29素数判断程序 1 1 采用直接简单的算法 假设输入N 将其逐个除以2 N 1 只要能整除 余数为0 说明不是素数 只有都不能整除才是素数 1 核心程序片段如下 cmpeax 3jbedoney 小于等于3的都是素数cdqmovesi eax EDI ESI N 3movedi edxmovebx 2 EBX从2开始 61 习题4 29素数判断程序 2 again divebxtestedx edxjzdonen 余数为0 能整除 不是素数incebxcmpebx esi EBX到N 1结束moveax esimovedx edijbagain 62 习题4 29素数判断程序 3 2 采用只对奇数整除的算法 1 2和3是素数 所有大于3的偶数不是素数 从5开始的数字只要除以从3开始的奇数 只有都不能整除才是素数 提示 排除4的情况 从3开始除 每次循环加2movebx 3 addebx 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 指令 CALLEBX 采用了指令的什么寻址方式 寄存器间接寻址 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 指令 RETi16 的功能相当于 RET 指令和 ADDESP 组合 i16 4 数值10在计算机内部用二进制 1010 编码表示 用十六进制表达是 如果将该编码加37H 则为 它是字符 的ASCII码值 A 41H A 5 利用堆栈传递子程序参数的方法是固定的 例如寻址堆栈段数据的寄存器是 EBP 69 5 3填空题 2 6 MASM汇编语言中 声明一个共用的变量应使用 伪指令 而使用外部变量要使用 伪指令声明 PUBLIC EXTERN 7 过程定义开始是 TESTPROC 语句 则过程定义结束的语句是 宏定义开始是 DISPMACRO 语句 则宏定义结束的语句是 TESTENDP ENDM 70 习题5 7 1 编写一个源程序 在键盘上按一个键 将其返回的ASCII码值显示出来 如果按下退格键 对应ASCII码是08H 则程序退出 请调用书中的HTOASC子程序 代码段 主程序again callreadccmpal 08h 退格键BS 08Hjzdonemovbl almoval calldispc 71 习题5 7 2 moval blrolal 4callhtoasc 调用子程序calldispc 显示一个字符moval blcallhtoasc 调用子程序calldispc 显示一个字符calldispcrlfjmpagaindone 72 习题5 8 1 编写一个子程序 它以二进制形式显示EAX中32位数据 并设计一个主程序验证 代码段 主程序moveax 8F98FF00Hcalldispbd 调用子程序 代码段 子程序dispbdproc 32位二进制数的输出pushecxmovecx 32 要输出的字符个数dbd roleax 1 AL循环左移一位 73 习题5 8 2 pusheaxandal 01h 取AL最低位addal 30h 转化成相应的ASCLL码值calldispc 以二进制的形式显示popeaxloopdbdpopecxretdispbdendp 74 习题5 11 计算字节校验和的通用过程 入口参数 DS EBX 数组的段地址 偏移地址ECX 元素个数 出口参数 AL 校验和 说明 除EAX EBX ECX外 不影响其他寄存器checksumprocxoral al 累加器清0sum addal ebx 求和incebx 指向下一个字节loopsumretchecksumendp 75 习题5 13 1 利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM 其入口参数 EAX 主存偏移地址 ECX 字节个数 主存区域的长度 同时编写一个主程序进行验证 数据段varbyte Thisisatest 主程序moveax offsetvarmovecx sizeofvarcalldispmem 76 习题5 13 2 子程序dispmemprocpushebxmovebx eaxdispm1 cmpecx 0jzdispm2moval ebx calldisphbmoval calldispc incebxdececxjmpdispm1dispm2 popebxretdispmemendp 第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 Win32API中可以使用哪两种字符集 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 modelflat stdcalloptioncasemap noneincludelibbin kernel32 libExitProcessproto dword 83 习题6 4 2 GetStdHandleproto dwordWriteConsoleA proto dword dword dword dword dwordWriteConsoleequSTD OUTPUT HANDLE 11 dataouthandledword outbufferbyte Theprocessor 12dup 0 outbufsize sizeofoutbufferoutsizedword 84 习题6 4 3 moveax 0cpuid 执行处理器识别指令movdwordptroutbuffer outbufsize 12 ebxmovdwordptroutbuffer outbufsize 8 edxmovdwordptroutbuffer outbufsize 4 ecxinvokeGetStdHandle STD OUTPUT HANDLEmovouthandle eaxinvokeWriteConsole outhandle addroutbuffer outbufsize addroutsize 0invokeExitProcess 0 85 习题6 6 1 直接使用控制台输出函数实现主存区域内容的显示显示形式每行显示16个字节 128位 每行开始先显示首个主存单元的偏移地址然后用冒号分隔主存内容 86 习题6 6 2 datavarbyte Thisisatest ABCDEFG 0123456789 outsizedword outhandledword membufferbyte57dup 20h 13 10 codestart moveax offsetvarmovecx sizeofvarcalldispmeminvokeExitProcess 0 87 习题6 6 3 dispmemproctestecx ecx 个数为0 不显示jzdispm11 退出pushadmovesi ecx ESI 要显示内容的字节数movedi eax EDI 要显示内容的地址invokeGetStdHandle STD OUTPUT HANDLEmov outhandle eax 获得输出句柄 88 习题6 6 4 1 显示缓冲区全部填充为空格dispm1 xorebx ebx 指示显示缓冲区dispm2 mov membuffer ebx incebxcmpebx sizeof membuffer 2jbdispm2 2 显示内容所在的存储器地址xorebx ebxmovecx 8 地址是十六进制8位moveax edi 89 习题6 6 5 dispm3 roleax 4movdl alanddl 0fhordl 30hcmpdl 39hjbedispm4adddl 7dispm4 mov membuffer ebx dlincebxloopdispm3mov membuffer ebx 显示冒号addebx 2 90 习题6 6 6 movecx 16 一行最多显示16个字节 3 显示一个字节内容dispm5 moval edi movdl alshrdl 4ordl 30hcmpdl 39hjbedispm6adddl 7dispm6 mov membuffer ebx dlincebx 91 习题6 6 7 andal 0fhoral 30hcmpal 39hjbedispm7addal 7dispm7 mov membuffer ebx aladdebx 2incedi 指向下一个要显示的字节decesijzdispm10 没有要显示的内容 退出loopdispm5 92 习题6 6 8 invokeWriteConsole outhandle addr membuffer sizeof membuffer addr outsize 0jmpdispm1dispm10 invokeWriteConsole outhandle addr membuffer sizeof membuffer addr outsize 0popaddispm11 retdispmemendp 93 习题6 7 1 执行CPUID指令 在消息窗口显示处理器识别字符串 要求该消息窗有OK和Cancel两个按钮 MessageBoxAproto dword dword dword dwordMessageBoxequNULLequ0MB OKequ1 dataszCaptionbyte 消息窗口 0outbufferbyte 本机的处理器是 12dup 0 0outbufsize sizeofoutbuffer 1 94 习题6 7 2 codestart moveax 0cpuid 执行处理器识别指令movdwordptroutbuffer outbufsize 12 ebxmovdwordptroutbuffer outbufsize 8 edxmovdwordptroutbuffer outbufsize 4 ecxinvokeMessageBox NULL addroutbuffer addrszCaption MB OKinvokeExitProcess NULLendstart 第7章习题 与VisualC 的混合编程 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 0 x64 4 函数调用中 通常通过EBP指向堆栈帧 其值减 访问第一个局部变量 其值加 访问第一个入口参数 返回地址则由其值加 指向 4 8 4 5 C 函数返回一个32位整数 返回值使用 保存 EAX 99 习题7 4 阅读如下嵌入汇编的C 程序 说明显示结果 includeintpower2 int int voidmain void cout power2 5 6 endl intpower2 intnum intpower asm moveax nummovecx powershleax cl 320 100 习题7 6 1 如下C 程序中调用汇编语言子程序对这两个数求积编写汇编语言子程序模块 includeextern C intmulti intx inty voidmain void intx y cin x cin y cout multi x y endl 101 习题7 6 2 解答 686 modelflat c codemultiproc var1 dword var2 dwordmoveax var1imulvar2retmultiendpend 第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 80 x86处理器的MOV指令支持外设数据传送吗 不支持 外设数据传送使用IN和OUT指令 104 8 2判断题 2 8086中 MOV AX BX 是非法指令 对 8086不支持使用AX进行寄存器间接寻址 4 DOS程序和Windows程序一样使用同一个退出函数 功能 实现退出 错 6 指令 OUTDX AX 的两个操作数均采用寄存器寻址方式 一个来自处理器 一个来自外设 错 OUT指令的DX表示采用寄存器间接寻址I O地址 7 指令 INBX 20H 正确 表示从20H端口输入一个数据 存放到BX寄存器 错 指令 INAX 20H 才是正确的 105 8 3填空题 1 DOS平台下使用实地址存储模型 只能访问 存储空间 仍进行分段管理 但每段不大于 容量 且起始物理地址的低4位必须是 1MB 64KB 0000 2 在实地址工作方式下 逻辑地址 7380H 400H 表示的物理地址是 并且该段起始于 物理地址 73C00H 73800H 7 IA 32处理器支持4GB主存 具有 个8位外设端口 在IN和OUT指令中使用 寄存器可以访问到全部端口 64K DX 106 习题8 6 使用DOS系统功能编写DOS应用程序 要求如下 提示 PressESCtoExit 等待用户输入字符 如果用户按下ESC 其ASCII码是1BH 则退出 否则继续等待输入字符 解答 在例8 2程序中 显示信息之后 加入如下按键及判断的程序片段即可 again movah 1 等待按键int21hcmpal 1bhjnzagain 107 习题8 14 1 利用CMOSRAM的系统时间 将年月日时分秒星期等时间完整的显示出来 解答 参考例8 7程序难点是星期的显示 可以利用地址表方法如下实现 dataweek1byte Sunday 0week2byte Monday 0 week7byte Saturday 0weekwordweek1 week2 week3 week7 108 习题8 14 2 moval 6 AL 6 从6号单元获取星期数据 out70h alinal 71hdecalshlal 1xorah ah 查表获得星期字符串movbx offsetweekaddbx axmovax bx calldispmsg 显示星期 第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 x87FPU有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 单精度规格化浮点数BF600000H表达的实数是什么 BF600000H 10111111011000000000000000000000B 10111111011000000000000000000000B符号位为1 表示负数指数编码是01111110 表示指数 126 127 1有效数字部分是11000000000000000000000表示有效数 1 11B 1 75这个实数为 1 75 2 1 1 75 0 5 0 875 114 习题9 5 真值28 75用单精度规格化浮点数据格式表达的编码28 75 00011100 11B 1 110011B 24于是 符号位 0指数部分是48位阶码为10000011 4 127 131 有效数字部分是11001100000000000000000这样 28 75表示成单精度浮点数为 01000001111001100000000000000000B 01000001111001100000000000000000B 41E60000H 115 习题9 6 编程显示单精度浮点数据的编码 十六进制形式 例如用于验证上一个习题结果 实数可以定义在数据段中 解答 数据段f32dreal428 75 单精度浮点数 代码段moveax dwordptrf32d 取浮点格式编码calldisphd
展开阅读全文
相关资源
相关搜索

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


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

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


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