汇编语言程序设计(第四版)第3章

更新时间:2023-11-26 05:20:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编语言程序设计 第四版 【课后习题答案】 --囮裑為檤

第3章 汇编语言程序格式

〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?

〔解答〕

伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;

伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。

〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?

〔解答〕

为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符; 汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?,@)组成,不能以数字开头。

〔习题3.3〕 什么是保留字,汇编语言的保留字有哪些类型,并举例说明。

〔解答

保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。汇编语言对大小写不敏感。如定义字节数和字符串的DB就是伪指令助记符。

〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成?

〔解答〕

汇编语句有执行性语句和说明性语句;

执行性语句由标号、硬指令助记符、操作数和注释四部分组成; 说明性语句由名字、伪指令助记符、参数和注释四部分组成

〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。

〔解答〕

⒈ 编辑 文本编辑程序 汇编语言源程序.asm ⒉ 汇编 汇编程序 目标模块文件.obj ⒊ 连接 连接程序 可执行文件.exe或.com

- 1 -

⒋ 调试 调试程序 应用程序

〔习题3.6〕区分下列概念:

(1)变量和标号

(2)数值表达式和地址表达式 (3)符号常量和字符串常量 〔解答〕

(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。

(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。

(3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。

〔习题3.7〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。

(1) mov byte ptr [bx],1000 (2) mov bx,offset myword[si] (3) cmp mybyte1,mybyte2 (4) mov al,mybyte1+mybyte2 (5) sub al,myword (6) jnz myword 〔解答〕

(1)1000超出了一个字节范围

(2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为lea bx,myword[si]

(3)两个都是存储单元,指令不允许

(4)变量值只有执行时才确定,汇编过程不能计算 (5)字节量AL与字量myword,类型不匹配

(6)Jcc指令只有相对寻址方式,不支持间接寻址方式

〔习题3.8〕OPR1是一个常量,问下列语句中两个AND操作有什么区别?

AND AL,OPR1 AND 0feh 〔解答〕

- 2 -

前者为“与”操作硬指令助记符,可汇编成机器代码。

后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。

〔习题3.9〕给出下列语句中,指令立即数(数值表达式)的值:

(1) mov al,23h AND 45h OR 67h (2) mov ax,1234h/16+10h

(3) mov ax,NOT(65535 XOR 1234h) (4) mov al,LOW 1234h OR HIGH 5678h (5) mov ax,23h SHL 4 (6) mov ax,1234h SHR 6 (7) mov al,?a? AND (NOT(?a?-?A?)) (8) mov al,?H? OR 00100000b

(9) mov ax,(76543 LT 32768) XOR 7654h 〔解答〕

注:对于逻辑运算,有关操作数可化为二进制数。 (1)67h (2)133h (3)1234h (4)76h (5)0234h (6)0048h (7)41h (8)68h (9)7654h

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

(1) byte_var DB ?ABC?,10,10h,?EF?,3 DUP(-1,?,3 DUP(4)) (2) word_var DW 10h,-5,?EF?,3 DUP(?) 〔解答〕

(1)从低地址开始,依次是(十六进制表达):

41 42 43 0a 10 45 46 ff - 04 04 04 ff - 04 04 04 ff - 04 04 04

- 3 -

(2)从低地址开始,依次是(十六进制表达): 10 00 FB FF 46 45 - - - - - -

〔习题3.11〕请设置一个数据段mydataseg,按照如下要求定义变量:

(1) my1b为字符串变量:Personal Computer (2) my2b为用十进制数表示的字节变量:20 (3) my3b为用十六进制数表示的字节变量:20 (4) my4b为用二进制数表示的字节变量:20 (5) my5w为20个未赋值的字变量 (6) my6c为100的常量

(7) my7c表示字符串:Personal Computer 〔解答〕

mydataseg segment

my1b db ?Personal Computer? my2b db 20

my3b db 14h ;20h my4b db 00010100b my5w dw 20 dup(?)

my6c equ 100 ;my6c = 100 my7c equ mydataseg ends

〔习题3.12〕分析例题3.2的数据段,并上机观察数据的存储形式。

〔解答〕

以字节为单位从低地址向高地址依次是: 16 00 12

FFH FFH FFH FFH

00 00 00 00 00 00 00 00 1 2 3 4 5

45H 23H 00 00 00 00 00 00 00 00

- 4 -

?a? ?b? ?c?

?H? ?e? ?l? ?l? ?o? 13 10 ?$?

12个字符串?month?,每个字符串从低地址到高地址依次是:?m? ?o? ?n? ?t? ?h? 25×4个字节未定义初值的存储单元,操作系统设置为0

〔习题3.13〕修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符串显示9号功能调用实现。

〔解答〕

.model small .stack .data

source dw 3433h,3635h target dw 40 dup(?),'$' .code .startup mov ax,ds mov es,ax cld

mov si,offset source mov di,offset target mov cx,40 rep movsw mov si,0

mov dx,offset target mov ah,9 int 21h .exit 0 end

〔习题3.14〕变量和标号有什么属性?

〔解答〕

段地址:表示变量和标号所在代码段的段地址;

- 5 -

偏移地址:表示变量和标号所在代码段的段内偏移地址;

类型:引用变量时,表示是字节、字、双字等数据量。引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。

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

mydata segment ORG 100H VARW DW 1234H,5678H VARB DB 3,4 ALIGN 4 VARD DD 12345678H EVEN BUFF DB 10 DUP(?) MESS DB ?HELLO?

BEGIN: 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 MOV AX,LENGTHOF BUFF+SIZEOF VARW MOV AX,TYPE BEGIN MOV AX, OFFSET BEGIN 〔解答〕

MOV AX, OFFSET MESS ;AX=116H

MOV AX, TYPE BUFF+TYPE MESS+TYPE VARD ;AX = 1+1+4 = 06H

MOV AX,SIZEOF VARW+SIZEOF BUFF+SIZEOF MESS ;AX = 4+10+5 = 19 = 13H MOV AX,LENGTHOF VARW + LENGTHOF VARD ;AX = 2+1 = 03H MOV AX,LENGTHOF BUFF + SIZEOF VARW ;AX = 10+4 =14 = 0EH MOV AX,TYPE BIGIN ;AX = FF02H (近) MOV AX,OFFSET BEGIN ;AX = 1BH

〔习题3.16〕利用简化段定义格式,必须具有.MODEL语句。MASM定义了哪7种存储模式,TINY和SMALL模式创建什么类型(EXE或COM)程序?设计32位程序应该采用什么模式?

- 6 -

〔解答〕

MASM定义的7种存储模式是TINY(微型模式、SMALL(小型模式)、COMPACT(紧凑模式)、MEDIUM(中型模式)、LARGE(大型模式)、HUGE(巨大模式)、FLAT(平展模式);TINY用于创建COM类型程序、一般程序都可以选用SMALL模式;设计32位的程序应该采用FLAT模式。

〔习题3.17〕源程序中如何指明执行的起始点?源程序应该采用哪个DOS功能调用,实现程序返回DOS?

〔解答〕

源程序中运用STARTUP伪指令指明执行的起始点;源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。

〔习题3.18〕在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段的缺省段名、定位、组合以及类别属性分别是什么?

〔解答〕

段定义伪指令 段名 定位 组合 类别 组名 .CODE _TEXT WORD PUBLIC 'CODE'

.DATA _DATA WORD PUBLIC 'DATA' DGROUP .DATA? _BSS WORD PUBLIC 'BSS' DGROUP .STACK STACK PARA STACK 'STACK' DGROUP

〔习题3.19〕如何用指令代码代替.startup和.exit指令,使得例题3.1a能够在MASM 5.x下汇编通过?

〔解答〕

;lt301a.asm(文件名) .model small .stack .data

string db ?Hello,Everybody !?,0dh,0ah.?$? .code

start: mov ax ,@data mov ds,ax

mov dx,offset string mov ah,9 int 21h mov ax ,4c00h

- 7 -

int 21h end start

〔习题3.20〕创建一个COM程序完成例题3.1的功能。

〔解答〕 ;lt301a,asm .model tiny .code .startup

mov dx,offset string mov ah,9 int 21h .exit 0

string db 'Hello,Everybody!'0dh,0ah,'$' ; end

〔习题3.21〕按下面要求写一个简化段定义格式的源程序

(1) 定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;

(2) 代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。 〔解答〕

.model small .stack .data num equ 5

datalist dw -1,0,2,5,4,? .code .startup

mov bx,offset datalist mov cx,num xor ax,ax

- 8 -

again: add ax,[bx] inc bx inc bx loop again mov [bx],ax .exit 0 end

〔习题3.22〕按下面要求写一个完整段定义格式的源程序

(1)数据段从双字边界开始,其中定义一个100字节的数组,同时该段还作为附加段; (2)堆栈段从节边界开始,组合类型为stack;

(3)代码段的类别是?code?,指定段寄存器对应的逻辑段;主程序指定从100h开始,给有关段寄存器赋初值;将数组元素全部设置为64h。

〔解答〕

stack segment para ?stack? dw 512 dup(?) stack ends data segment array db 100 dup(?) data ends

code segment ?code?

assume cs:code,ds:data,es:data,ss:stack org 100h

start: mov ax,data mov ds,ax mov es,ax

mov di,offset array mov al,64h mov cx,100 cld rep stosb

- 9 -

mov ax,4c00h int 21h code ends end start

〔习题3.23〕编制程序完成两个已知双精度数(4字节)A和B相加并将结果存入双精度变量单元SUM中(不考虑溢出)。

〔解答〕 ;xt327.asm .model small

.stack 256 ;定义堆栈段大小为256个字节 .data

A dd 11223344h ;定义两个双字的数(随意) B dd 77553311h

sum dd ? ;定义结果,执行后为:88776655h .code .startup

xor si, si ;相对于变量的位移量清零 mov cx, 2 ;分高低字分别相加,共两次 clc ;清零cf

again: mov ax, word ptr A[si] ;取第一个数的一个字(先低字后高字) adc ax, word ptr B[si] ;取第二个数的一个字(先低字后高字) mov word ptr sum[si], ax ;存和的一个字(先低字后高字) inc si ;修改位移量指向下一个字(加2) inc si

loop again ;cx=cx-1 ,if cx<>0 ,jump again .exit 0 end

〔习题3.24〕编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出)。

〔解答〕

- 10 -

.startup

xor si, si ;位移量清零 mov al, bdata[si] ;取第一个数 mov cx, num-1 ;累加次数 again: inc si ;指向下一个数 adc al, bdata[si] ;累加

loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end

〔习题3.25〕结构数据类型如何说明、结构变量如何定义、结构字段如何引用?

〔解答〕

结构类型的说明使用一对伪指令STRUCT(MASM5.x是STRUC,功能相同)和ENDS。它们的格式为:

结构名 STRUCT

… ;数据定义语句 结构名 ENDS

结构变量定义的格式为:

变量名,结构名 〈字段初值表〉

引用结构字段,采用圆点“.”操作符,其格式是: 结构变量名.结构字段名。

〔习题3.26〕记录数据类型如何说明,记录变量如何定义,width和mask操作符是什么作用?

〔解答〕

记录类型的说明采用伪指令RECORD,它的格式为: 记录名 RECORD 位段[,位段…] 定义记录变量的格式:

记录变量名 记录名 〈段初值表〉

Width记录名/记录位段名操作符返回记录或记录位段所占用的位数。

mask记录位段名操作符返回一个8位或16位数值,其中对应该位段的个位为1,其余位为0。

- 11 -

- 12 -

本文来源:https://www.bwwdw.com/article/lqnt.html

Top