最新16。32位微机原理、汇编语言及接口技术(第二版)第三章课后习题答案。 下载本文

内容发布更新时间 : 2024/9/25 12:33:56星期一 下面是文章的全部内容请认真阅读。

精品文档

第3章

3.1:汇编语言有什么特点 解:

汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数,可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序

3.2编写汇编语言源程序时,一般的组成原则是什么? 解:

(1)完整的汇编语言源程序由段组成

(2)一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列

(3)需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点

(4)所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内

(5)通常,程序还需要一个堆栈段 3.3 MODEL伪指令是简化段定义源程序格式中必不可少的语句,它设计了哪7种存储模式?各用于创建什么性质的程序? 解: 存储模式 TINY SMALL COMPACT MEDIUM LARGE HUGE FLAT 特 点 COM类型程序,只有一个小于64KB的逻辑段(MASM 6.x支持) 小应用程序,只有一个代码段和一个数据段(含堆栈段),每段不大于64KB 代码少、数据多的程序,只有一个代码段,但有多个数据段 代码多、数据少的程序,可有多个代码段,只有一个数据段 大应用程序,可有多个代码段和多个数据段(静态数据小于64KB) 更大应用程序,可有多个代码段和多个数据段(对静态数据没有限制) 32位应用程序,运行在32位80x86CPU和Windows 9x或NT环境 3.4如何规定一个程序执行的开始位置,主程序执行结束应该如何返回DOS,源程序在何处停止汇编过程? 解:

开始位置:用标号指明

返回DOS:利用DOS功能调用的4CH子功能来实现 汇编停止:执行到一条END伪指令时,停止汇编

3.5逻辑段具有哪些属性? 解:

段定位、段组合和段类型。 精品文档

精品文档

3.6给出采用一个源程序格式书写的例题3.1源程序

例题3.1:创建一个在屏幕上显示一段信息的程序…… 解: stack segment stack db 1024(0) stack ends

data segment

string db 'Hello,Assembly!',0dH,0aH,‘$’ data ends

code segment 'code'

assume cs:code,ds:data,ss:stack start: mov dx,offset string mov ah,9 int 21h code ends

end start

3.7DOS支持哪两种可执行程序结构,编写这两种程序时需要注意什么? 解:

(1). EXE程序

程序可以有多个代码段和多个数据段,程序长度可以超过64KB 通常生成EXE结构的可执行程序 (2). COM程序

只有一个逻辑段,程序长度不超过64KB

需要满足一定条件才能生成COM结构的可执行程序(MASM 6.x需要采用TINY模式)

3.8举例说明等价“EUQ”伪指令和等号“=”伪指令的用途 解:

符号定义伪指令有“等价EQU”和“等号=”: 符号名 EQU 数值表达式 符号名 EQU <字符串> 符号名 = 数值表达式

EQU用于数值等价时不能重复定义符号名,但“=”允许有重复赋值。例如: X= 7 ;等效于:X equ 7 X= X+5 ;“X EQU X+5”是错误的

3.9 给出下列语句中,指令立即数(数值表达式)的值 (1)mov al,23h AND 45h OR 67h (2)mov ax,1234h/16+10h 3:mov ax,23h SHL 4

4:mov al, ‘a’and(NOT(‘a’-‘A’)) 5:mov ax,(76543 LT 32768) XOR 7654h 解:

(1) al=67h

(2) ax=133h,dx=4h (3) ax=0230h (4) al=41h (4) ax=7654h

3.10画图说明下列语句分配的存储空间及初始化的数据值

(1)byte_var db ‘abc’,10,10h,‘EF’,3 dup(-1,?,3,dup(4)) 精品文档

精品文档

(2:)word_var dw 10h,-5,3,dup(?) 解: (1) 441145h 46h -1 ? 4 4 4 -1 ? 4 4 4 -1 ? 4 230 0h h h (2) 10h 00h 0fbh 0ffh ? ? ? ? ? ? 3.11

请设置一个数据段,按照如下要求定义变量:

(1)my1b为字符串常量,表示字符串“personal Computer” (2)my2b为用十进制数表示的字节变量,这个数的大小为20 (3)my3b为用十六进制数表示的字节变量,这个数的大小为20 (4)my4b为用二进制数表示的字节变量,这个数的大小为20 (5)my5w为20个未赋值的字变量 (6)my6c为100的符号常量

(7)my7c为字符串常量,代替字符串“personal Computer” 解:.data

my1b db 'Personal Computer' my2b db 20 my3b db 14h

my4b db 00010100b my5w dw 20 dup(?) my6c = 100

my7c = <'Personal Computer'>

3.12 希望控制变量或程序代码在段中的偏移地址,应该使用哪个伪指令? 解:

利用定位伪指令控制,如org,even,align

3.13名字和符号有什么属性? 解:

包括逻辑地址和类型两种属性。

3.14设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:

;数据段 Org 100h

Varw dw 1234h,5678h Varb db 3,4

Vard dd 12345678h Buff db 10 dup(?) Mess db ‘hello’ ;代码段

Mov ax,offset mess

Mov ax,type buff+type mess+type vard

Mov ax,sizeof varw+sizeof buff+sizeof mess Mov ax,lengthof varw+lengthof vard 解: 精品文档

41h 4 4 精品文档

;数据段

org 100h

varw dw 1234h , 5678h varb db 3 , 4 vard dd 12345678h buff dd 10 dup(?) mess db 'Hello' ;代码段

mov ax , offset varb + offset mess

mov ax , type buff + type mess + type vard mov ax , sizeof varw+ sizeof buff+ sizeof mess mov ax , lengthof varw+ lengthof vard

3.15假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的具体错误原因。

(1)mov byte ptr {bx},1000 (2)mov bx,offset myword{si} (3)cmp mybyte1,mybyte2 (4)mov mybyte1,al+1 (5)sub al,myword (6)jnz myword

解:

(1) 1000超过一个字节所能表达的最大整数 (2)SI应为偶数

(3)两个内存单元不能直接运算 (4)应改为[al+1]

(5)条件转移指令后面应接标号,而不是变量

3.16编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来

解: mov ah,1 ;只允许输入小写字母 int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示

3.17 已知用于LED数码管的显示代码表为:

LEDtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

db 80h,90h,88h,83h,0c6h,0c1h,86h,8eh

它依次表示0~9,A~F这16个数码的显示代码。现编写一个程序实现将lednum中的一个数字(0~9,a~f)转换成对应的LED显示代码

解: mov bx,offset LEDtable mov al,lednum xlat 精品文档

精品文档

3.18 编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位有符号数。 解: mov ax, bufX cmp ax, bufY jae done mov ax, bufY done: mov bufZ, ax

3.19为有符号16位数,请将它们的符号状态保存在signX,即:如果变量值大于等于0,保存0;如果X小于0,保存-1。编写该程序。

设变量bufX 解: .model small .stack .data bufX dw -7 signX db ? .code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done next: mov signX,-1 done: .exit 0 end

3.20bufX、bufY 和bufZ是3个有符号16进制数,编写一个比较相等关系的程序 (1)如果这3个数都不相等,则显示0

(2)如果这三个数中有两个数相等,则显示1 (3)如果这三个数都相等,则显示2

解: mov dl,’2’ mov ax,bufX cmp ax,bufY je next1 dec dl next1: cmp ax,bufZ je next2 dec dl next2: mov ah,2 int 21h

3.21 例3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段?

解: ;代码段 精品文档