2023年12月8日发(作者:福建奔驰凌特)

汇编语言作业答案

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

见教材P4

1.10 数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码为0Dh、0aH对应的是什么字符?

见教材P8

1.11 计算机中有一个“‘编码,如果把它认为是无符号数,它是十进制什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符?

97,61h,a

1.13什么是DOS和POM-BIOS?

DOS:磁盘操作系统;POM-BIOS:可编程的基本输入输出系统

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

见教材P20-21

2.5 什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:

(1)FFFFh:0 (2)40h:17h (3)2000h:4500h (4)B821h:4567h

见教材P22-23 FFFF0h 417h 24500h BC777h

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

见教材P23

2.10 说明下列指令中源操作数的寻址方式?如果BX=2000H,DI=40H,给出DX的值或有效地址EA的值。

(1)mov dx,[1234h] 直接寻址

(2) mov dx,1234h 立即寻址

(3) mov dx,bx 寄存器寻址

(4) mov dx,[bx] 寄存器间接寻址

(5) mov dx,[bx+123h] 寄存器相对寻址

(6) mov dx,[dx+di] 基址变址寻址

(7) mov dx,[bx+di+1234h] 相对基址变址寻址

2.11 已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行后AX寄存器的内容。

(1)mov ax,1200h 1200h

(2) mov ax,bx 0100h

(3) mov ax,[1200h] 2a4ch

(4) mov ax,[bx] 1234h

(5) mov ax,[bx+1100h] 2a4ch

(6) mov ax,[bx+si] 5678h

(7) mov ax,[bx][si+1100h] b765h

2.15 已知SS=FFAOH、SP=00B0H,画图说明执行下列指令序列时,堆栈区和SP的内容如何变化?

mov ax,8057h

push ax SP=00B2 [00B1]=80h

mov ax,0f79h

push ax SP=00B2 [00B2]=0f79h

pop bx BX=0f79h SP=00B1

pop [bx] SP=00B0h 2.16 给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:

mov al ,89h 不影响标志

add al, al 见教材P38

add al, 9dh 见教材P38

cmp al, 0bch 见教材P40

sub al, al 见教材P39

dec al 见教材P39

inc al 见教材P38

2.17 设均为双字数据,分别存放在地址为的存储单元中,他们的运算结果存入单元。阅读如下程序段,给出运算公式。

mov ax,X

mov dx,X+2

add an,Y

adc dx,Y+2

add ax,24

adc dx,0

sub ax,Z

sbb dx,Z+2

mov W,ax

mov W+2,dx Y+X+24-Z

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

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

(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 ADD AL,[BX+SI]

(3)用BX和位移量OB2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回寄存器中。ADD CX,[BX+0B2H]

(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数4312H相加,并把结果送回该存储单元中。

ADD [0520H],4321H

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

2.20 指出下列指令的错误

(1)xchg[si],30h 不能用立即数 (2)pop cs 没有错误

(3) sub[si],[di] 不能全为mem (4)push ah ah应为字数据

(5) adc ax,ds 不能用段寄存器 (6)add [si],80h [si]应为reg或mem

(7)in al ,3fch 位数不对 (8)out dx,ah ah只能用al或ax

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

mov ax,1470h

and ax,ax

or ax,ax

xor ax,ax

not ax

test ax,0f0f0h 参考教材P20

2.23 编写程序段完成如下要求:

(1)用位操作指令实现AL(无符号数)乘以10参考教材P49例2.32

(2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的相互转换 参考教材P47例2.28

(3)把中的双字右移4位参考教材P49例2.32

2.25 已知数据段500h~600h处存放了一个字符串,说明下列程序段执行后的结果:

mov si,600h

mov di,601h

mov ax,ds

mov s,ax

mov cx,256

std 数据段向后移动一个字,即数据段首地址为501h和-601h

rep movsb

2.26 说明下列程序段的功能

cld

mov ax,0fefh

mov cx,5

move s,bx

mov di,2000h

rep stows 将0fefh开始的五个字的内容,送致32000H开始的单元中

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

(1)xor ax,leleh

je equal ax=1e1eh

(2)test al,b

jnz there al=或 或

(3)cmp cx,64h

jb there cx<64h

2.34 假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:

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

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

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

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

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

(6) 若DI<=DX,转到below_eq执行。 CMP DI,DX JBE below_eq

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

mov ex,20

mov ax,0

mov si,ax

sun_loop: add ax,array[si]

add si,2

loop sum_loop

mov total,ax 把array中的20个字的内容相加,并把结果送至total中。

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

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

参考教材P48例2.30 (6)以知字符串string包含有32KB内容,将其中的‘$’符号替换成空格。

参考教材P52例2.37

(7)有一个100个字节元素的数组,其首地为array,将每个元素减1(不考虑溢出)存于原处。参考教材P52例2.36

2.39以知AX、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。

add al,bl

daa

xchg al,ah

adc al,bh

daa

xchg al,ah

实现AX、BX中的的4位BCD数相加,结果仍为BCD表示的十进制数,存于AX中,出口参数为ax.

2.44 补充例2.42,当有溢出时显示“Error!Overflow!”,无溢出时显示“OK”。

参看教材P59例2.42 和P66例2.49

3.17 修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符传显示9号功能调用实现。参看教材P79例3.1a 和P93例3.3

3.22 在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段和却省段名、定位、组合以及类别属性分别是什么?参看教材P99(2)SMALL

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

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

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

Num equ 5

Datalist dw -1,0,2,5,4,?

Mov cx,num

Mov bx,offset datalist

Mov bx,0

Again: add ax,[bx]

Add bx,2

Loop again

Mov [bx],ax

3.,26 按下面要求写一个完整段定义格式的源程序

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

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

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

参考教材P79例3.1b

4.11 编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数。

参考教材P115例4.3a

4.12 设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存—1(ffh)。编写该程序。 参考教材P121例4.6

4.13 bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序;

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

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

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

参考教材P119例4.3b,子程序中加一段显示程序即可。

4.23 编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。

参考教材P121例4.6,

4.24 编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。

Parry dw 23,32,56,…;假设有100个数据

Wordsum dw 0

Msg db ‘overflow’,’$’

Mov cx,100

Mov ax,0

Mov bx,offset parray

Again: add ax,[bx]

Jnc next

Mov dx,offset msg

Mov ah,9

Int 21h

Jmp done

Next: add bx,2

Loop again

Mov wordsum,ax

Done: …

4.34 编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。

(1) 采用AX寄存器传递这个16位二进制数。

(2) 采用wordTEMP变量传递这个16位二进制

(3) 采用堆栈方法传递这个16位二进制数

参考教材P126例4.10,

4.35 设有一个数组存放学生的成绩(0—100),编制一个子程序统计0—59分,60—69分,70—79分,80—89分,90—100分的人数,并分别存放到scoreE、scoreD、scoreC、scoreB及scoreA单元中。编写一个主程序与之配合使用。

Sarray db 90,85,70,57,95,…

Count db $-sarray

ScoreE db 0;记录0-59分之间的人数

ScoreD db 0;记录60-69分之间的人数

ScoreC db 0;记录70-79分之间的人数

ScoreB db 0;记录80-89分之间的人数

ScoreA db 0;记录90-100分之间的人数

Snum proc Push ax

Push dx

Push si

Again: mov al,[bx]

Cmp al,60

Jb next0

Cmp al,90

Jae next1

Mov dl,10

Mov ah,0

Div dl

Sub al,5

Mov ah,0

Mov si,ax

Jmp next2

Next0: mov si,0

Jmp next2

Next1: mov si,4

Next2: inc scoreE[si]

Inc bx

Loop again

Pop si

Pop dx

Pop ax

Ret

Snum endp

Mov bx,offset sarray

Mov cx,count

Call snum

4.51 将例题4.7的大写转换为小写字母写成宏完成。

参考教材P122例4.7,和P115例4.13b,

4.52 请用宏结构实现例题4.4数据段中8个标号组成的地址表,以及代码段的8个处理程序段;然后运行通过。自己上机实现

4.57 从键盘输入一个字符串,先将它原样显示一遍;然后将其中的小写字母转换为大写 ,再将其中的大写字母转换为小写显示,最后将其中的大小写字母互换显示。显示字符串的功能调用采用宏,大写转换、小写转换和大小写互换写成子程序。

(1) 编写一个完整的源程序完成题目要求

(2) 把子程序单独写在一个文件中,用源程序包含的方法完成题目要求

(3) 把子程序单独汇编,用目标文件连接的方法完成题目要求

(4) 把子程序加入到一个子程序库中,用子程序库调入的方法完成题目要求

以下的解答请参考教材。

5.5 为什么说32位通用寄存器比16位通用寄存器更通用?参考教材P170

5.14 回答下列问题:

(1) ADD ECX,AX指令错在哪里? (2) INC[BX]指令错在哪里?

(3) 说明IMUL BX,DX,100H指令的操作

(4) JECXZ指令什么条件下转移?

(5) MOV AX,[EBX+ECX]指令正确吗?

(6) 32位x86 CPU的Jcc指令的转移范围可有多大?

(7) 如何让汇编程序识别80386指令?

(8) 如何让汇编程序形成16位段和32位段?

5.20 填空如下程序段的运行结果:

mov eax,h ;EAX=________

mov edx,5ABCDEF9h ;EDX=________

shrd ead,edx,4 ;EAX=________,EDX=_________,CF=____________

shrd eax,edx,8 ;EAX=________,EDX=_________,CF=____________

shld dx,ax,1 ;EAX=________,EDX=_________,CF=____________,OF=_____

上机调试例题2.31:移位指令的功能

mov cl,4

mov al,0f0h ;al=f0h

shl al,1 ;al=e0h,CF=1,SF=1、ZF=0 、PF=0, OF=0

shr al,1 ;al=70h,CF=0,SF=0、ZF=0 、PF=0, OF=1

sar al,1 ;al=38h,CF=0,SF=0、ZF=0 、PF=0, OF=0

sar al,cl ;al=03h,CF=1,SF=0、ZF=0 、PF=0, OF=1

上机调试例题2.36:将数据段source指示的100个字符数传送到附加段destination指令的主存区

mov si,offset source ;汇编伪指令source的偏移地址

mov di,offset destination

mov cx,100 ;cx 传送次数

cld ;设置DF=0,实现地址增加

again:movsb ;传送一个字节

dec cx ;传送次数减1

jnz again ;判断传送次数cx是否为0。不为0(ZF=0),

;则转移到again位置继续执行;否则,结束

上机调试例2.47:利用子程序完成将AL低4位中的一位16进制数转换成对应的ASCII码

;主程序

mov al,0fh ;提供参数al

call htoasc ;调用子程序

;子程序

htoasc: and al,0fh ;只取al的低4位

or al,30h ;al高4位变成3

cmp al,39h ;是0~9,还是0ah~0fh

jbe htoend

add al,7 ;是0ah~0fh,其ASCII还要加上7(见表1.1) htoend: ret ;子程序返回

上机调试例2.49:用09号DOS系统功能调用在显示器输出一个字符串

string db’hello,Everybody!’,0dh,0ah,’$’ ;在数据段定义要显示的字符串

mov ah,09h ;设置功能号:ah 09h

mov dx,offset string ;提供入口参数:dx 字符串的偏移地址

int 21h ;DOS功能调用:显示

更多推荐

指令,下列,显示,数据