钱晓捷-汇编语言程序设计课后习题(作业新)_第1页
钱晓捷-汇编语言程序设计课后习题(作业新)_第2页
钱晓捷-汇编语言程序设计课后习题(作业新)_第3页
钱晓捷-汇编语言程序设计课后习题(作业新)_第4页
钱晓捷-汇编语言程序设计课后习题(作业新)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录

习题1....................................................................................................1

习题2...................................................................................................4

习题3....................................................................................................10

习题4....................................................................................................13

习题5....................................................................................................15

习题6....................................................................................................18

习题7...................................................................................................21

习题8...................................................................................................24

习题9...................................................................................................27

习题1

1.1简述计算机系统的硬件组成及各部分作用。

1.2明确下列概念或符号:

主存和辅存,RAM和ROM,存储器地址和I/O端口,KB,MB,GBTB0

1.3什么是汇编语言源程序、汇编程序、目标程序?

1.4汇编语言与高级语言相比有什么优缺点?

1.5将下列十六进制转化为二进制和十进制表示。

(l)FFH(2)0H(3)5EH(4)EFH

(5)2EH(6)10H(7)1FH(8)ABH

1.6将下列十进制数转换为BCD码表示。

(1)12(2)24(3)68(4)127

(5)128(6)255(7)1234(8)2458

解答:

十进制数BCD码

1200010010

2400100100

6801101000

127000100100111

128000100101000

255001001010101

12340001001000110100

24580010010001011000

L7将下列BCD码转换为十进制数。

(1)10010001(2)10001001(3)00110110(4)10010000

(5)00001000(6)10010111(7)10000001(8)00000010

解答:

BCD码十进制数

1001000191

1000100189

0011011036

1001000090

0000100008

1001011197

1000000181

0000001002

1.8将下列十进制数分别用八位二进制数的原码、反码和补码表示。

(1)0(2)-127(3)127(4)-57(5)126(6)-126(7)-128

(8)68

1.9完成下列二进制数的计算。

(1)1011+1001(2)1011-1001(3)1011X1001(4)10111000/1001

(5)1011A1001(6)1011V1001(7)~1011(8)1011©1001

1.10数码0〜9,大写字母A〜Z,小写字母a〜z,对应的ASCH码分别是多

少?ASCH码为OdH,OaH对应的是什么字符?

解答:

大写字母A〜Z,对应的ASCH码分别是41H-5AH

小写字母a〜z,对应的ASCH码分别是61H〜7AH

ASCH码为OdH,OaH分别对应“回车”、“换行”

1.11计算机中有一个“01100001”编码,如果把它认为是无符号数,它是十进

制什么数?如果你认为它是BCD码,则表示什么数?如果它是某个ASCH码,则

代表哪个字符?

1.12简述Intel80x86系列微处理器在指令集方面的发展。

1.13什么是DOS和ROM-BIOS?

1.14简述PC最低1MB贮存空间的使用情况。

1.15罗列8086CPU的8个8位和16位通用寄存器,并说明各自的作用。

1.16什么是标志?它有什么用途?状态标志和控制标志有什么区别?画出标志

寄存器FLAGS,说明各个标志的位置和含义。

1.17举例说明CF和OF标志的差异。

解答:溢出标志OF和进位标志CF是两个意义不同的标志

进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志

表示有符号数运算结果是否超出范围,运算结果已经不正确

例1:3AH+7CH=B6H

无符号数运算:58+124=182,范围内,无进位

有符号数运算:58+124=182,范围外,有溢出

例2:AAH+7cH=(1)26H

无符号数运算:170+124=294,范围外,有进位

有符号数运算:—86+124=28,范围内,无溢出

1.18字和双字在存储器中如何存放,什么是“小端方式”?对字和双字存储单

元,什么是它们的对齐地址?为什么要对齐地址?

1.19什么是8086中的逻辑地址和物理地址?逻辑地址如何转换为物理地址?

请将如下逻辑地址用物理地址表示(表达地址默认采用十六进制):

(1)FFFF:0(2)40:17(3)2000:4500(4)B821:4567

解答:对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从

OOOOOH-FFFFFH

在8086内部和用户编程时,采用的段基地址:段内偏移地址形式称为逻辑地

将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址

请将如下逻辑地址用物理地址表达:

(1)FFFFh:O=FFFFOH

(2)40h:17h=00417H

(3)2000h:4500h=24500H

(4)B821h:4567h=BC777H

1.208086有哪4种逻辑段?各种逻辑段分别是什么用途?

解答:代码段(CodeSegment)用来存放程序的指令序列。处理器利用CS:IP

取得下一条要执行的指令

堆栈段(StackSegment)确定堆栈所在的主存区域。处理器利用SS:SP操作

堆栈中的数据

数据段(DataSegment)存放当前运行程序所用的数据。处理器利用DS:EA

存取数据段中的数据

附加段(ExtraSegment)是附加的数据段,也用于数据的保存。处理器利用ES:

EA存取数据段中的数据

1.21数据的默认段是哪个?是否允许其他段存放数据?如果允许,如何实现?

有什么要求?

1.22什么是操作码、操作数和寻址方式?有哪三种给出操作数的方法?

1.23什么是有效地址EA?8086的操作数如果在主存中,有哪些寻址方式可以存

取它?

1.24说明下列指令中源操作数的寻址方式?如果BX=2000H,DI=40H,给出DX

的值或有效地址EA的值。

(l)Movdx,[1234h]

(2)Movdx,1234h

(3)Movdx,bx

(4)Movdx,[bx]

(5)Movdx,[bx+1234h]

(6)Movdx,Ebx+di]

(7)Movdx,[bx+di+1234h]

解答:(1)movdx,[1234h];直接寻址,EA=1234h

(2)movdx,1234h;立即数寻址,DX=1234h

(3)movdx,bx;寄存器寻址,DX=2000h

(4)movdx,[bx];间接寻址,EA=2000h

(5)movdx,[bx+1234h];相对寻址,EA=3234h

(6)movdx,[bx+di]

;基址变址寻址,EA=2040h

(7)movdx,[bx+di+1234h]

;相对基址变址寻址,EA=3274h

习题2

2.1已知DS=2000H,BX=0100H,SI=0002H,存储单元[20100田”[20103]依次存放

12345678H,[21200H]〜[21203H]依次存放2A4CB765H,说明下列每条指令

执行后AX寄存器的内容。

(l)Movax,1200h

(2)Movax,bx

(3)Movax,[1200h]

(4)Movax,[bx]

(5)Movax,[bx+llOOh]

(6)Movax,[bx+si]

(7)Movax,[bx][si+llOOh]

解答:(1)movax,1200h;AX=1200h

(2)movax,bx;AX=OlOOh

(3)movax,[1200h];AX=4C2Ah

(4)movax,[bx];AX=3412h

(5)movax,[bx+HOOh];AX=4C2Ah

(6)movax,[bx+si];AX=7856h

(7)movax,[bx][si+llOOh];AX=65B7h

2.2指出下列指令的错误

(l)movex,dl(2)movip,ax

(3)moves,1234h(4)moves,ds

(5)moval,300(6)mov[sp],ax

(7)movax,bx+di(8)mov20h,ah

2.3已知数字0〜9对应的格雷码依次为:

18H,34H,05H,06H,09H,OAH,OCH,11H,12H,14H,它存在于以table为首地址(设

为200H)的连续区域中。为如下程序段的每条指令加上注释,说明每条指令的

功能和执行结果。

Leabx,table

Moval,8

Xlat

2.4什么是堆栈?他的工作原则是什么?它的基本操作有哪两个?对应哪两种

指令?

2.5已知SS=2200H,SP二OOBOH,画图说明执行下列指令序列时,堆栈区和SP的

内容如何变化?

Movax,8057h

Pushax

Movax,0f79h

Pushax

Popbx

Pop[bx]

解答:movax,8057h

pushax

movax,0f79h

pushax

popbx;bx=0f79h

pop[bx]

;DS:[0f79h]=8057h

2.6给出下列各条指令执行后AL的值,以及CF,ZF,SF,OF,PF的状态:

Moval,89h

Addal,al

Addal,9dh

Cmpal,Obch

Subal,al

Decal

Incal

解答:

moval,89h;AL=89hCFZFSFOFPF

addal,al;AL=12h10011

addal,9dh;AL=0afh00101

cmpal,Obch;AL=0afh10101

subal,al;AL=OOh01001

decal;AL=Offh00101

incal;AL=OOh01001

2.7设X,Y,Z均为双字数据,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元

中,它们的运算结果存入W单元。阅读以下程序段,给出运算公式。

Movax,X

Movdx,X+2

Addax,Y

Adcdx,Y+2

Addax,24

Adcdx,0

Subax,Z

Sbbdx,Z+2

MovW,ax

movW+2,dx

解答:W=X+Y+24-Z

2.8请分别用一条汇编语言指令完成如下功能:

(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。

ADDDX,BX

(2)用寄存器BX和SI的基址变址寻址方式把存储器的1字节与AL寄存器的

内容相加,并把结果送到AL中。

ADDAL,[BX+SI]

(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄

存器的内容相加,并把结果送回存储器中。

ADD[BX+0B2H],CX

(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,

并把结果送回该存储单元中。

ADDWORDPTR[0520H],3412H

(5)把数OAOH与AL寄存器的内容相加,并把结果送回AL中。

ADDAL,OAOH

2.9设X,Y,Z,V均为十六位带符号数,分别装在X,Y,Z,V存储单元中,阅读以下

程序段,得出它的运算公式,并说明运算结果存于何处。

Movax,X

ImulY

Movex,ax

Movbx,dx

Movax,Z

Cwd

Addex,ax

Adebx,dx

Subex,540

Sbbbx,0

Movax,v

Cwd

Subax,ex

Sbbdx,bx

IdivX

2.10指出下列指令的错误

(l)xchg[si]30h

(2)Popcs

(3)Sub[si],[di]

(4)Pushah

(5)Adcax,ds

(6)Add[si],80h

(7)Inal,3fch

(8)Outdx,ah

解答:(1)xchg[si],30h:xchg的操作数不能是立即数

(2)popCS;不能对CS直接赋值

(3)sub[si],[di];两个操作数不能都是存储单元

(4)pushah;堆栈的操作数不能是字节量

(5)adcax,ds;adc的操作数不能是段寄存器

(6)add[si],80h;没有确定是字节还是字操作

(7)inal,3fch;in不支持超过FFH的直接寻址

(8)outdx,ah;out只能以AL/AX为源操作数

2.11给出下列各条指令执行后的结果,以及状态标志CF,OF,SF,ZF,PF的状态。

Movax,1470h

Andax,ax

Orax,ax

Xorax,ax

Notax

Testax,OfOfOh

2.12假设例题2.34中的程序段中,AX=08h,BX=1OH,请说明每条指令执行后的

结果和各个标志位的状态

2.13编写程序段完成如下要求

(1)用位操作指令实现AL(无符号数)乘以10o

答;不考虑进位:考虑进位

movbl,alxorah,ah

movcl,3movbx,ax

shlal,clmovcl,3

addal,bl;shlbl,1shlax,cl

addal,bladdax,bx;shlbx,l

addax,bx

(2)用逻辑运算指令实现数字0到9的ASCII码与非压缩BCD码的互相转换。

答:数字0〜9的ASCII码是:30h-39h

非压缩BCD码的0〜9是:00h〜09h

方法一:

andal,Ofh;实现ASCII到非压缩BCD码的转换

oral,30h;实现非压缩BCD码到ASCII的转换

(一)testal,30h

jnzASCII

oral,30h;非压缩BCD码到ASCII的转换

jmpdone

ASCII:andal,Ofh;ASCII到非压缩BCD码的转换

done:…

方法二:

xoral,30h;求反D5D4位,其他不变

;即高4位为3,则变为0;高4位为0,则变为3

(3)把DX,AX中的双字右移4位。

答:movcl,4

again:shrdx,1;实现逻辑右移

;采用“sardx,r,则实现算术右移

rcrax,1

deccl

jnzagain

2.14已知AL=F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以

2的程序段,并说明各自执行后,所得的商是什么?

2.15已知数据段500H到600H处存放了一个字符串,说明下列程序段执行后的

结果:

Movsi,600h

Movdi,601h

Movdx,ds

Moves,ax

Movex,256

Std

Repmovsb

2.16说明下列程序段的功能

Cid

Movax,Ofefh

Movex,5

Movbx,3000h

Moves,bx

Movdi,2000h

Repstosw

2.17指令指针IP是通用寄存器还是专用寄存器?有指令能够直接赋值么?哪类

指令的执行会改变它的值?

2.18控制转移指令中有哪三种寻址方式?

2.19什么是短转移shortjump、近转移nearjump和远转移farjump?什么是

段内转移和段间转移?8086有哪些指令可以实现段间转移?

2.208086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范

围的条件转移?

2.21假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=2OA1H,

[232F7H]=3280H,[264E5H]=2450H,试问执行下列段间接寻址的转移指令后,转移

的目的地址是什么?

(l)JMPBX

(2)JMPTABLE[BX]

(3)JMP[BX],[SI]

2.22判断下列程序段跳转的条件

(l)xorax,leleh

Jeequal

(2)testal,10000001b

Jnzthere

(3)empex,64h

Jbthere

答:(1)xorax,leleh

jeequal

;AX=leleh(异或后为0)

(2)testal,10000001b

jnzthere

;AL的DO或D7至少有一位为1

(3)empex,64h

jbthere

;CX(无符号数)V64h

2.23设置CX=0,则LOOP指令将循环多少次?例如:

movex,0

Delay:loopdelay

2.24假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较

指令和条件转移指令实现以下判断:

(1)若DX>DI,转到above执行

(2)若AX>SI,转到greater执行;

(3)若CX=0,转到zero执行;

(4)若AX-SI产生溢出,转到overflow执行;

(5)若SI<=AX,转到less_eq执行;

(6)若DI<=DX,转到below_eq执行;

答:(1)若DX>DI,转到above执行

empdx,di

jaabove;=jnbeabove

(2)若AX>SI,转到greater执行

empax,si

jggreater;=jnlegreater

(3)若CX=0,转到zero执行

empex,0jexzzero

jzzero

(4)若AX—SI产生溢出,转到overflow执行;

empax,di

jooverflow

(5)若SI<AX,转到less_eq执行;

empsi,axempax,si

jleless_eqjgeless_eq

(6)若DKDX,转到below_eq执行。

empdi,dxempdx,di

jbebelow_eqjaebelow_eq

2.25有一个首地址为array的20个字的数组,说明下列程序段的功能。

movex,20

Movax,0

Movsi,ax

Sum_loop:addax,array[si]

Addsi,2

Loopsum_loop

Movtotal,ax

2.26按照下列要求,编写相应的程序段:

(1)其实地址为string的主存单元中存放有一个字符串(长度大于6),把该

字符串的第一个和第六个字符(字节量)传送给DX寄存器。

(2)从主存buffer开始的4字节中保存了4个非压缩BCD码,现按低(高)地

址对低(高)位的原则,将他们合并到DX中。

(3)编写一个程序段,在DX高4位全为0时,使用AX=0;否则AX=-1。

答:testdx,OfOOOh;testdh,OfOh

jznext;jnznext

movax,-1;movax,0

jmpagain

next:movax,0;movax,Offffh

again:・・・

⑷有两个64位数值,按“小端方式”存放在两个缓冲区bufferl和buffer2,

编写程序段完成bufferl-buffer2功能。

⑸假设从B800h:0开始存放有100个16位无符号数,编程求他们的和,并把

32位的和保存在DX.AX中。

(6)已知字符串string包含有32KB内容,将其中的飞,符号替换成空格。

答1:;不使用串操作指令,更好

movsi,offsetstring

movex,8000h

again:empbyteptr[si],=24h

jnznext

movbyteptr[si],'';,,=20h

next:incsi

loopagain;decex

;jnzagain

答2:;使用串操作指令

movdi,offsetstring

moval,'$'

movex,8000h

cld

again:scasb

jnznext

movbyteptres:[di-l],i'

next:loopagain

(7)有一个100字节元素的数组,其首地址为array,将每个元素减1(不考虑

溢出)存于原处。

答1:movsi,offsetarray

movex,100

again:decbyteptr[si]

incsi

loopagain

答2:movsi,offsetarray

movdi,si

movax,ds

moves,ax

movex,100

cld

again:lodsb

decal

stosb

loopagain

(8)统计以'$'结尾的字符串srting的字符个数。

2.27对以下要求,分别给出3种方法,每种方法只用一条指令。

⑴使CF=0

⑵使AX=0

(3)使AX=0和CF=0

2.28参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态

其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代

码的字节数为3,段间直接调用指令则为5字节。

2.29已知AX,BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序

的功能和出口参数。

Addal,bl

Daa

Xchgal,ah

Adcal,bh

Daa

Xchgal,ah

Ret

答:压缩BCD码加法:

AX-AX+BX

出口参数:

AX=BCD码和

2.30ADD指令是用于除法指令之前,进行压缩BCD码调整的。实际上,处理器

的调整过程是:AL<-AHX10+AL,AH<-0o如果指令系统没有ADD指令,请用一个

子程序完成这个调整工作。

2.31解释如下有关中断的概念:

(1)内部中断和外部中断

(2)单步中断和断点中断

(3)除法错中断和溢出中断

(4)中断向量号和中断向量表

2.32试比较INTn和段间CALL指令,IRET和段间RET指令的功能。

2.33什么是系统功能调用?汇编语言中,它的般格式是怎样的?

2.34补充例2.40,当有溢出时显示"Error!Overflow!",无溢出显示"OK"。

补充例2.42,显示的个数,注意首先将个数转换为ASCH码。

okmsgdb'OK','$'

errmsgdb*Error!Overflow!','$'

movax,X

subax,Y

jooverflow

movdx,offsetokmsg

jmpnext

overflow:movdx,errmsg

next:movah,9

int21h

2.36先提示输入数字“InputNumber:0to9”,然后在下一行显示输入的数字,

结束;如果不是键入了0到9数字,就提示错误"Error",继续等待输入数

字。

2.37从键盘输入一个字符串(不超过255)个,将其中的小写字母转换成大写

字母,然后按原来的顺序在屏幕上显示。

2.38指令对状态标志的作用可以分成多中情况,例如无影响、无定义、按结果

影响、特别说明的影响等,你能区别这些情况么?分别用具体的指令来说

明。

2.398086指令系统分成哪6个功能组?各组主要包含什么指令?举例说明。

2.40总结8086指令系统所采用的各种寻址方式,包括一般的数据寻址、外设数

据寻址、堆栈数据寻址、串操作数据寻址、转移指令目的地址的寻址等,

并举例说明。

习题3

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

3.2什么是标识符?汇编程序中标识符怎样组成?

3.3什么是保留字?汇编语言的保留字有哪些类型?并举例说明。

3.4汇编语句有哪两种?每个语句由哪四部分组成?

3.5汇编语言程序的开发有哪4个步骤?分别利用什么程序完成、产生什么输

出文件?

答:1.编辑文本编辑程序汇编语言源程序asm

2.汇编汇编程序目标模块文件.obj

3.连接连接程序可执行文件.exe或.com

4.调试调试程序应用程序

3.6将第2章习题2.36采用简化段定义格式编写成一个完整的源程序。

3.7将第2章习题2.37采用完整段定义格式编写成一个完整的源程序。

3.8区分下列概念:

(1)变量和标号(2)数值表达式和地址表达式(3)符号常量和字符串常量

3.9假设myword是一^1^字变量,mybytel和mybyte2是2字节变量,指出下列

语句中的错误原因

答:(1)movbyteptr[bx],1000

;1000超出了一个字节范围

(2)movbx,offsetmyword[si]

;寄存器的值只有程序执行时才能确定,

;而offset是汇编过程计算偏移地址,故无法确定

;可以改为leabx,myword[si]

(3)cmpmybytel,mybyte2

;两个都是存储单元,指令不允许

(4)moval,mybytel+mybyte2

;变量值只有执行时才确定,汇编过程不能计算

(5)subal,myword

;字节量AL与字量myword,类型不匹配

(6)jnzmyword

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

3.100PR1是一个常量,问下列语句中两个AND操作有什么区别?

ANDAL,OPRIANDOfeh

3.11给出下列语句中,指令立即数(数值表达式)的值:

(l)moval,23hAND45hor67h

(2)Movax,1234h/16+10h

(3)Movax,NOT(65535XOR1234h)

(4)Moval,LOW1234hORHIGH5678h

(5)Movax,23hSHL4

(6)Movax,1234hSHR6

(7)Moval,'a'AND(NOTCa-A*))

(8)Moval,*H*OROOlOOOOOb

(9)Movax,(76543LT32768)XOR7654h

3.12为第2章立体2.54定义变量count、block、dplus和dminus。

3.13为第2章例题2.55定义相应的变量,并形成一个完整的汇编语言程序。

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

(l)byte_varDB'ABC*,10,lOh,'EF',3DUP(-1,?,3DUP(4))

(2)Word_varDWlOh,-5,'EF',3DUP(?)

答:(1)byte_varDB'ABC',10,lOh,'EF',3DUP(-1,?,3DUP(4))

'A''B''C'10lOh'E'T'-1-444

41h42h43hOahlOh45h46hffli-04h04h04h

3个

(2)word_varDWlOh,-5,'EF',3DUP(?)

lOh0FBhFFh46h47h

lOh-5'EF'???

3.15请设置一个数据mydataseg,按照如下定义变量:

(l)mylb为字符串变量:PersonalConputer

(2)my2b为用十进制数表示的字节变量:20

(3)My3b为用十六进制数表示的字节变量:20

(4)My4b为用二进制数表示的字节变量:20

⑸My5w为20个未赋值的字节变量

(6)My6c为100的常量

(7)My7c表示字符串:PersonalComputer

答:mydatasegsegment

mylbdb'PersonalComputer'

my2bdb20

my3bdb14h;20h

my4bdb00010100b

my5wdw20dup(?)

my6cequ100;my6c=100

my7cequ<PersonalComputer>

mydatasegends

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

3.17修改例题3.3,现在用字定义伪指令dw,字符串传送指令movsw和字符串

显示9号功能调用实现

3.18变量和标号有什么属性?

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

容:

Mydatasegment

ORG100H

VARWDW1234H,5678H

VARBDB3,4

ALIGN4

VARDDD12345678H

EVEN

BUFFDB1ODUP(?)

MESSDB'HELLO'

BEGIN:MOVAX,OFFSETMESS

MOVAX,TYPEBUFF+TYPEMESS+TYPEVARD

MOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESS

MOVAX,LENGTHOFVARW+LENGTHOFVARD

MOVAX,LENGTHOFBUFF+SIZEOFVARW

MOVAX,TYPEBEGIN

MOVAX,OFFSETBEGIN

3.20利用简化段定义格式,必须具有.MODEL语句。MASM定义了哪7种储存模式?

TINY和SMALL模式创建什么类型(EXE或COM)程序?设计32位程序应该采用

什么模式?

3.21源程序中如何指明执行的起始点?源程序应该采用哪个DOS功能调用,实

现程序返回DOS?

3.22在SMALL储存模式下,简化段定义格式的代码段,数据段和堆栈段的默认

段名,定位,组合以及类别属性分别是什么?

3.23如何用指令代码代替.startup和.exit指令,使得例题3.la能够在MASM

5.x下汇编通过?

3.24创建一个COM程序完成例题3.1的功能。

3.25按下面的要求写一个简化段定义格式的源程序

(1)定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5

个字单元中依次存放-1,0,2,5和4,最后一个单元初值不变;

(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后

一个字单元中。

3.26按下面的要求写一个完整段定义格式的源程序

(1)数据段从双字边界开始,其中定义一个100字节的数组,同时该段还作为

附加段;

(2)堆栈段从节边界开始,组合类型为stack;

(3)代码段的类型是‘code'指定段寄存器对应的逻辑段;主程指定从100H开

始,给有关段寄存器付初始值;将数组元素全部设置为64H

3.28编制程序完成12H,45H,0F3H,6AH,20H,OFEH,90H,0C8H,57H和34H等10字

节数据之和,并将结果存入字节变量SUM中(不考虑溢出)。

3.29结构数据类型如何说明?结构变量如何定义?结构字段如何引用?

3.30记录数据类型如何说明?记录变量如何定义?Width和mask操作符起什么

作用?

习题4

4.1例题4.2如果要求算术右移8位,如何修改程序?

4.2例题4.2如果要求算术左移7位,如何用移位指令实现?

4.3制作一个程序,将AX寄存器中的16位数连续4位分成一组,共4组,然后

把这4组数分别放在AL,BL,CL和DL寄存器。

答:

DATASENGMENT

AX1DW?

AL1DB0

BL1DB0

CL1DB0

DL1DB0

DATAENDS

CODESENGMENT

ASSUMECS:CODEDS:DATA

START:MOVAX,DATA

MOVDS,AX

MOVAX,AX1

ANDAL,OFH

MOVDL,AL

ANDAH,OFH

MOVDH,AH

MOVAX,AX1

MOVCL,4

SHRAL,CL

MOVBL,AL

MOVCL,4

SHRAH,CL

MOVAL,AH

MOVCL,DH

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

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

答:

DATASENGMENT

BUFDB0

DATAENDS

CODESENGMENT

ASSUMECS:CODEDS;DATA

START:MOVAX,DATA

MOVDS,AX

MOVAH,1

INT21H

CMPAL,'a'

JBN

CMPAL,'z'

JAN

SUBAL,20H

N:MOVDL,AL

MOVAH,2

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

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

LEDtableDBOcOh,0f9h,0a4h,ObOh,99h,92h,82h,0f8h

DB80h,90h,88h,83h,0c6h,Oclh,86h,8eh

它依次表示0到9,A到F这16个数码的显示代码。现编写一个程序现实将

lednum中的一个数字转换成对应的LED显示代码。

4.6请问第2章例题2.41/2.43/2,45/2.48的分支是单分支、双分支或多分支

结构?

4.7分析第2章例题2.42的分支结构,画出流程图。

4.8如果在例题4.4的table中依次填入msgl到msg8,程序应该怎样修改?

4.9编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则

把其中之一存入bufZ中。假设变量存放的是8位无符号数。

答:

.modelsmall

・stack

.data

Moval,bufz

Movbl,bufx

Movcl,bufy

Cmpbl,cl

JneL

Movbufz,bl

Jmpexit

L:jgLI

Movbufz,cl

Jmpexit

LI:movbufz,bl

Exit:

4.10设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如

果X大于等于0,保存0;如果X小于0,保存一l(ffh)。编写该程序。

答:

.modelsmall

,stack

,data

bufxdw?

signxdb0

Start::movax,data

movds,ax

moval,bufx

cmpal,0

jge1

movsignx,-1

jmpexit

1:movsignx,0

exit:movah,4ch

int21h

end

4.11bufX,bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程

序:

(1)如果这3个数都不相等,则显示0;

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

(3)如果这3个数都相等,则显示2;

答:

.modelsmall

.stack

.data

Movax,bufx

Movbx,bufy

Movex,bufz

Cmpax,ex

JeL2

Cmpbx,ex

JeL2

Movdl,'O'

Movah,2

Int21h

Jmpexit

L:cmpbx,ex

JeLI

L2:movdl,1

Movah,2

Int21h

Jmpexit

LI:movdl,,2,

Movah,2

Int21h

exit

4.12分析第2章例题2.42,2.52,.2.53的结构,分别画出他们的流程图。

4.13例题4.8内外循环次数共是多少?如果要求按从大到小排序,程序如何修

改?

4.14串操作指令常要利用循环结构,现在不用串结构指令如何实现字符串

String1内容传送到字符串Sring2,字符串长度为count.

答:

DSEGSEGMENTLEASI,string1

StringlDB'abcdefg'LEASI,string2

count=$-stringmovCX,count

string?DBcountDUP(O)L:MOVALJSI]

DSESESEGMENTMOV[DI],AL

SSEGSEGMENTSTACK/NCSI

STKDBcountDUP(O)/NCDI

SSEGENDSLOOPL

CSEGSEGMENTMOVAH,4CH

ASSUMEDS:DSEG,INT21H

ES:ESEGSSrSSEG,CSEGENDS

CS:CSEGENDSTART

START:MOVAS,DSEG

MOVDS,AX

MOVAX,ESEG

MOVES,AX

MOVAS,SSEG

MOVSS,AX

MOVSP,LENGTHSTK

4.15不用串操作指令求主存0040H:0开始的一个64KB物理段中共有多少个空

格?

4.16编程实现把键入的一个字符,用二进制形式(0/1)显示出它的ASCII代码

答:

MOVAH,1

INT21H

MOVBL,AL

MOVAH,2

MOVDL,(_9

INT21H

MOVCX,8

AGAIN:SHLBL,1

MOVDL,0

ADCDL,30H

MOVAH,2

INT21H

LOOPAGAIN

4.17编写程序,要求从键盘接收一个数beHN(0到9),然后铃声bellN次

4.18编程写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:

正数组arrayP和负数组arrayN,并分别把这两个数组的数据个数显示出来。

答:

DATASEGMENT

arrayMDW1,2,3,-2.-4....,8

arrayMDW20DUP(?)

arrayNDW20DUP(?)

countPDW?

countNDW?

DATAENDS

Codesegment

assumeCS:code,DS:DATA

START:MOVAX,DATA

MOVDS,AX

LEABX,arrayM

MOVSI,0

MOVDI,0

MOVCX,20

MOVcountP,0

MOVcountN,0

NEXT:MOVAX,[BX]

CMPAX,0

JLNN

MOVarrayp[SI],AX

ADDSI,2

INCcountP

JMPPP

NN:MOVaiTayNfDI],AX

ADDDI,2

INCcountN

PP:ADDBX,2

LOOPNEXT

MOVAH,40H

INT21H

CODEENDS

ENDSTART

4.19编写计算100个正数之和的程序,如果和不超过16位字的范围(65535),

则保存其和到wordsum,如果超过则显示**overflow

答:

.modelsmall

.stack

.data

DIDWdl,d2......dlOO

N=$-Dl

wordsumdw?

.code

.Startup

xorax,ax

LEASI,D1

movcx,N

agaim:addax,[SI]

JCoverflow

ADDSI,2

movwordsum,ax

JMPEXIT

overflow:movdx,offsetstring

movah,09h

int21H

EXIT:........

.EXIT

4.20变成判断主存0070h:0开始的1KB中有无字符串‘DEBUG'这是一个字符串包

含的问题,可以采用逐个向后比较的简单算法。

4.21编程把一个16位无符号二进制数转换成用8421BCD码表示的5位十进制数。

转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,

得到“千位”;依次用余数除以100,10和1,得到“百位”、“十位”和“个位”。

4.22过程定义的一般格式是怎样的?子程序入口为什么常有PUSH指令,出口为

什么有POP指令?下面的程序段有什么不妥么?若有,请改正:

CrazyPROC

Pushax

Xorax,ax

Xordx,dx

Again:addax,[bx]

Adcdx,0

Incbx

Incbx

Loopagain

Ret

ENDPcrazy

答:

crazyPROC;crazyPROC字量求和子程序

pushax;

xorax,ax;xorax,ax入口参数:

11*=数据首址

CX=数据个数

出口参数:

人*=和的低字

xordx,dx;xordx,dx

again:addax,[bx];again:addax,[bx]

adcdx,0;adcdx,0

incbx;incbx

incbx;incbx

loopagain;loopagain

ret;ret

ENDPcrazy;crazyENDP

4.23子程序的参数传递有哪些方法?比较

答:

(1)寄存器传递参数,优点:速度快,缺点:寄存器有限,适合少量数据。

(2)变量传递参数,优点:变量可定义,适应较多数据,缺点:速度慢。

(3)堆栈传递参数,优点:适合特殊数据的处理,缺点:繁琐易出错。

(4)地址表传递参数,优点:适合大量数据,缺点:较繁琐。

4.24采用堆栈传递参数的一般方法是什么?为什么应该特别注意堆栈平衡问

题?

4.25什么是之程序的嵌套,递归和重入?

4.26将例题4.7的大写之母转换为小写字母写成过程,利用AL作为入口参数、

出口参数完成。

4.27请按如下子程序说明编写过程:

;子程序功能:把用ASCH码表示的2位十进制数转换为对应的二进制数

;入口参数:D+十位数的ASCH码,DL=j位数的ASCH码

;出口参数:AL/寸应的二进制数

4.28写一个子程序根据入口参数AL=0/l/2,分别实现大写字母转换成小写,小

写转换成大写或大小写字母互换,欲转换的字符串在String中,用0表示

结束。

答:

.modelsmall

.stack

.data

Stringdb.Hello,everYDAY;0

.code

.startup

movbx,offsetString

MOVAH,1

1/NT21H

CMPAL/O'

JNELI

CALLSUBO

L1:CMPAL,T

JNEL2

CALLSUB1

L2:CMPAL,’2’

JNEL3

CALL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论