32位汇编习题04
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题解答
13
习题4.17-3
• 方法2:使用数字输入输出子程序
again: call readuid ;call readsid cmp eax,0 ;数字 < 0? jb erdisp ;jl erdisp cmp eax,9 ;数字 > 9? ja erdisp ;jg erdisp call dispuid ;call dispsid jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again
10
习题解答
习题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
11
习题解答
习题4.17-1
• 编写一个程序,先提示输入数字“ Input
6
习题解答
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
Number : 0 ~ 9”,然后在下一行显示输入的数字,结束;如 果不是键入了 0 ~ 9 数字,就提示错误“Error!”, 继续等待输入数字。 • 方法1:使用字符输入输出子程序 ;数据段 inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error! Input again: ',0 ;代码段 mov eax,offset inmsg ;提示输入数字 call dispmsg
5
习题解答
4.3 填空题-1
(2)MASM 给短转移、近转移和远转移定义的类型名依 次是___、___和___。 • SHORT,NEAR,FAR (3)假设在平展存储模型下,EBX=1256H,双字变量 TABLE 的偏移地址是 20A1H ,线性地址 32F7H 处存 放 3280H ,执行指令“ JMP EBX” 后 EIP = _______ ,执 行指令“JMP TABLE[EBX]”后EIP=_______。 • 1256H,3280H
18
习题解答
习题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
19
习题解答
习题4.29 素数判断程序-3
( 2 )采用只对奇数整除的算法: 1 、 2 和 3 是素 数,所有大于3的偶数不是素数,从5开始的数 字只要除以从 3 开始的奇数,只有都不能整除 才是素数。 • 提示: • 排除4的情况,从3开始除,每次循环加2 mov ebx,3 …… add ebx,2
20
习题解答
8
习题解答
习题4.7
• 定义COUNT(假设为10)个元素的32位数组,输入元
素编号( 0 ~ COUNT-1 ),利用 DISPHD 子程序输出其 地址、利用DISPSID子程序输出其值。
;数据段
count = 10 array dword 0,1,2,3,4,5,6,7,8,9
;代码段
call readuid lea eax,array[eax*4] call disphd mov eax,array[eax*4] call dispsid
9
;输入N,小于10 ;EAX=地址 ;显示地址 ;EAX=变量值 ;显示数值
习题解答
习题4.15-1
• IA-32 处理器的指令 CDQ 将 EAX 符号扩展到 EDX 。假若
没有该指令,编程实现该指令功能。 (1)按照符号扩展的含义编程,即:EAX最高为0,则 EDX=0;EAX最高为1,则EDX=FFFFFFFFH。 test eax,8000h ;测试最高位 jz next1 ;最高位为0,转移 mov edx,0ffffffffh ;最高位为1,设置EDX=FFFFFFFFH jmp done ;跳过另一个分支 next1: mov dx,0 ;设置EDX=0 done:
7
习题解答
习题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
14
习题解答
习题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
3
习题解答
4.1 简答题-2
(9)如果循环体的代码量远超过128个字节,还能用 LOOP指令实现计数控制循环吗? • 不能,因为LOOP指令的目标地址采用相对短转移, 只能在-128~+127字节之间循环 (10)什么是“先循环、后判断”循环结构? • 指先执行循环体,然后判断是否继续循环的结构, 这种结构通常至少执行一次循环体
32位汇编语言习题解答
课件制作: 钱晓捷
钱晓捷,32位汇编语言程序设计,机械工业出版社
第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
4.1 简答题-1
(2)数据的直接寻址和指令的直接寻址有什么区别? • 数据的直接寻址给出数据所在的存储器地址,指令 的直接寻址给出指令所在的存储器地址。 (5)什么是奇偶校验? • 数据通信时,数据的某一位用做传输数据的奇偶校 验位,数据中包括校验位在内的“1”的个数恒为奇 数,就是奇校验;恒为偶数,就是偶校验 (6)助记符JZ和JE为什么表达同一条指令? • 两个数相减,差值为0(JZ)与两个数相等(JE)是 一个含义
4
习题解答
4.2 判断题
2)指令的相对寻址都是近转移。 •对 4)JMP指令对应高级语言的GOTO语句,所以不能使用 • 错,需要使用 6)JA和JG指令的条件都是“大于”,所以是同一个指 令的两个助记符。 • 错,JA针对无符号数,JG针对有符号数 7)JC和JB的条件都是CF=1,所以是同一条指令。 • 对。无符号小于(JB)必然借位(JC) 10)若ECX=0,则LOOP指令和JECX指令都发生转移。 •对
16
习题解答
习题4.27-3
add ebx,2 add edx,1 dec esi jnz again0 mov eax,offset table call dispmsg
17
习题解答
习题4.29 素数判断程序-1
• ( 1 )采用直接简单的算法:假设输入 N ,将其逐个
除以2~N-1,只要能整除(余数为0)说明不是素数, 只有都不能整除才是素数。 • (1)核心程序片段如下: cmp eax,3 jbe doney ;小于等于3的都是素数 cdq mov esi,eax ;EDI.ESI=N>3 mov edi,edx mov ebx,2 ;EBX从2开始
tab1
byte 6 dup(36 dup(?),13,10) byte 0
15
习题解答
习题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
12
习题解答
习题4.17-2
• 方法1:使用字符输入输出子程序
again: call readc cmp al,'0' jb erdisp cmp al,'9' ja erdisp call dispcrlf call dispc jmp done ;等待按键 ;数字 < 0? ;数字 > 9?
mov eax,offset ermsg call dispmsg jmp again done:
13
习题4.17-3
• 方法2:使用数字输入输出子程序
again: call readuid ;call readsid cmp eax,0 ;数字 < 0? jb erdisp ;jl erdisp cmp eax,9 ;数字 > 9? ja erdisp ;jg erdisp call dispuid ;call dispsid jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again
10
习题解答
习题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
11
习题解答
习题4.17-1
• 编写一个程序,先提示输入数字“ Input
6
习题解答
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
Number : 0 ~ 9”,然后在下一行显示输入的数字,结束;如 果不是键入了 0 ~ 9 数字,就提示错误“Error!”, 继续等待输入数字。 • 方法1:使用字符输入输出子程序 ;数据段 inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error! Input again: ',0 ;代码段 mov eax,offset inmsg ;提示输入数字 call dispmsg
5
习题解答
4.3 填空题-1
(2)MASM 给短转移、近转移和远转移定义的类型名依 次是___、___和___。 • SHORT,NEAR,FAR (3)假设在平展存储模型下,EBX=1256H,双字变量 TABLE 的偏移地址是 20A1H ,线性地址 32F7H 处存 放 3280H ,执行指令“ JMP EBX” 后 EIP = _______ ,执 行指令“JMP TABLE[EBX]”后EIP=_______。 • 1256H,3280H
18
习题解答
习题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
19
习题解答
习题4.29 素数判断程序-3
( 2 )采用只对奇数整除的算法: 1 、 2 和 3 是素 数,所有大于3的偶数不是素数,从5开始的数 字只要除以从 3 开始的奇数,只有都不能整除 才是素数。 • 提示: • 排除4的情况,从3开始除,每次循环加2 mov ebx,3 …… add ebx,2
20
习题解答
8
习题解答
习题4.7
• 定义COUNT(假设为10)个元素的32位数组,输入元
素编号( 0 ~ COUNT-1 ),利用 DISPHD 子程序输出其 地址、利用DISPSID子程序输出其值。
;数据段
count = 10 array dword 0,1,2,3,4,5,6,7,8,9
;代码段
call readuid lea eax,array[eax*4] call disphd mov eax,array[eax*4] call dispsid
9
;输入N,小于10 ;EAX=地址 ;显示地址 ;EAX=变量值 ;显示数值
习题解答
习题4.15-1
• IA-32 处理器的指令 CDQ 将 EAX 符号扩展到 EDX 。假若
没有该指令,编程实现该指令功能。 (1)按照符号扩展的含义编程,即:EAX最高为0,则 EDX=0;EAX最高为1,则EDX=FFFFFFFFH。 test eax,8000h ;测试最高位 jz next1 ;最高位为0,转移 mov edx,0ffffffffh ;最高位为1,设置EDX=FFFFFFFFH jmp done ;跳过另一个分支 next1: mov dx,0 ;设置EDX=0 done:
7
习题解答
习题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
14
习题解答
习题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
3
习题解答
4.1 简答题-2
(9)如果循环体的代码量远超过128个字节,还能用 LOOP指令实现计数控制循环吗? • 不能,因为LOOP指令的目标地址采用相对短转移, 只能在-128~+127字节之间循环 (10)什么是“先循环、后判断”循环结构? • 指先执行循环体,然后判断是否继续循环的结构, 这种结构通常至少执行一次循环体
32位汇编语言习题解答
课件制作: 钱晓捷
钱晓捷,32位汇编语言程序设计,机械工业出版社
第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
4.1 简答题-1
(2)数据的直接寻址和指令的直接寻址有什么区别? • 数据的直接寻址给出数据所在的存储器地址,指令 的直接寻址给出指令所在的存储器地址。 (5)什么是奇偶校验? • 数据通信时,数据的某一位用做传输数据的奇偶校 验位,数据中包括校验位在内的“1”的个数恒为奇 数,就是奇校验;恒为偶数,就是偶校验 (6)助记符JZ和JE为什么表达同一条指令? • 两个数相减,差值为0(JZ)与两个数相等(JE)是 一个含义
4
习题解答
4.2 判断题
2)指令的相对寻址都是近转移。 •对 4)JMP指令对应高级语言的GOTO语句,所以不能使用 • 错,需要使用 6)JA和JG指令的条件都是“大于”,所以是同一个指 令的两个助记符。 • 错,JA针对无符号数,JG针对有符号数 7)JC和JB的条件都是CF=1,所以是同一条指令。 • 对。无符号小于(JB)必然借位(JC) 10)若ECX=0,则LOOP指令和JECX指令都发生转移。 •对
16
习题解答
习题4.27-3
add ebx,2 add edx,1 dec esi jnz again0 mov eax,offset table call dispmsg
17
习题解答
习题4.29 素数判断程序-1
• ( 1 )采用直接简单的算法:假设输入 N ,将其逐个
除以2~N-1,只要能整除(余数为0)说明不是素数, 只有都不能整除才是素数。 • (1)核心程序片段如下: cmp eax,3 jbe doney ;小于等于3的都是素数 cdq mov esi,eax ;EDI.ESI=N>3 mov edi,edx mov ebx,2 ;EBX从2开始
tab1
byte 6 dup(36 dup(?),13,10) byte 0
15
习题解答
习题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
12
习题解答
习题4.17-2
• 方法1:使用字符输入输出子程序
again: call readc cmp al,'0' jb erdisp cmp al,'9' ja erdisp call dispcrlf call dispc jmp done ;等待按键 ;数字 < 0? ;数字 > 9?
mov eax,offset ermsg call dispmsg jmp again done: