教学工作的资源分享

汇编语言习题解答。

教务系统平台

教务系统平台

汇编语言习题

学习学习时间

——也不轻松

习题1

习题1.17

习题1.19

习题1.20

习题1.24

习题2.11

例示习题1.17 •和OF标记的差异。

溢出标志OF和进位标志CF是含义不同的两个标志

进位标志表示无符号数运算结果是否在范围外、运算结果

依然正确; 溢出标志根据代码数量运算结果是否在范围外、运用

计算结果已经不正确了

示例1:3AH 7CH=B6H

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

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

例2:AAH7ch=(1) 26H

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

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

解答:请参阅第19页

习题1.198086什么是逻辑地址和物理地址?

逻辑地址如何转换为物理地址?

每个对应的物理存储单元都有唯一的20位编号:物理

地址,00000H~FFFFFH

8086内部和用户编程时采用的段基址:段内偏移地

地址形式称为逻辑地址

将逻辑地址中的段地址向左偏移4比特,加上偏移地址则为20比特

物理地址

请用物理地址表示下一个逻辑地址。

(1) FFFFh:0=FFFF0H

)2) 40h:17h=00417H

)3) 2000h:4500h=24500H

)4) B821h:4567h=BC777H (为避免计算错误) )。

解答:见第20页

习题1.20

886有哪些四种逻辑段? 各逻辑段分别为

什么用途?

用于存储代码段(Code Segment )程序的指令序列

排队。 处理器利用CS : IP获得要执行的下一个指令

堆栈段决定堆栈所在的主存

区域。 处理器使用SS : SP处理堆栈中的数据

数据段(Data Segment )当前用于执行程序

的数据。 处理器使用DS : EA访问数据段中的数据

附加段是附加的数据段,并且

用于保存数据。 处理器使用ES : EA访问数据段

的数据

解答:见第21页

习题1.24 •是否解释如何在以下命令中寻址源操作数? 如果

给定BX=2000H、DI=40H、DX的值,或者是有效的

地址EA的值

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

)2) mov dx,1234h; 立即清点地址,DX=1234h

)3) mov dx,bx; 寄存器地址,DX=2000h

)4) mov dx,[bx]; 间接寻址,EA=2000h

)5) mov dx,[bx 1234h]; 寻址,EA=3234h

)6) mov dx,[bx di]

; 地址转换地址,EA=2040h

(7) mov dx,[bx di 1234h]

; 对于索引限定,EA=3274h

解答

习题2

习题2.1

习题2.5

习题2.6

习题2.7

习题2.8

习题2.10

习题2.1

已知DS=2000H、BX=0100H和SI=0002H,

将12 34 56依次存储在存储器单元[20100H]~[20103H]中

按78H、[21200H] ~ [21203H]的顺序保管2A 4C B7

65H、说明执行以下各命令后的AX寄存器的内容

)1) mov ax,1200h; AX=1200h

)2) mov ax,bx; AX=0100h

)3) mov ax,[1200h] AX=4C2Ah

)4) mov ax,[bx]; AX=3412h

)5) mov ax,[bx 1100h]; AX=4C2Ah

)6) mov ax,[bx si]; AX=7856h

(7) mov ax,[bx][si 1100h]; AX=65B7h

解答

这是

称量

传来

发送

,来定义您自己的自订外观

2

习题2.5

已知SS=FFA0H,SP=00B0H,根据图表

执行下一个指令序列时,将堆栈空间和SP的

内容如何变化?

mov ax,8057h

推x

mov ax,0f79h

推x

pop bx; bx=0f79h

pop [bx]

; DS:[0f79h]=8057h

解答

FFA00H

SS=FFA0H

FFAB0H

SP=0B0H 80h

57h

0fh

79h

习题2.6

执行以下各命令后的AL值和

CF、ZF、SF、OF、PF状态:

mov al,89h; AL=89h CF ZF SF OF PF

add al,al; AL=12h 1 0 0 1 1

add al,9dh; AL=0afh 0 0 1 0 1

cmp al,0bch; AL=0afh 1 0 1 0 1

sub al,al; AL=00h 0 1 0 0 1

dec al; AL=0ffh 0 0 1 0 1

inc al; AL=00h 0 1 0 0 1

解答

习题2.7

x、y、z都为双字数

据介绍,分别是地址x、

X 2; y、Y 2; z,Z 2

的存储单元,它们的

运算结果被保存在w单元中。

阅读下一段,如所示

计算公式。

mov ax,x

mov dx,X 2

add ax,y

adc dx,Y 2

add ax

adc dx,0

sub ax,z

sbb dx,Z 2

mov W,ax

mov W 2,dx

解答

W=X Y 24-Z

习题2.8请用一个汇编语言指令分别完成以下功能。

)1)将BX寄存器和DX寄存器的内容相加,并将结果存储在DX寄存器中。

ADD DX,BX

)2)用寄存器BX和SI的基址寻址方式将存储器的一个字

把子句和AL寄存器的内容相加,把结果发送到AL。

ADD AL,[BX SI]

)3)以BX和位移量0B2H的寄存器相对寻址方式实现存储器内的

将1个字和CX寄存器的内容相加,并将结果返回存储器。

ADD [BX 0B2H],CX

)4)采用位移量为0520H的直接寻址方式,与存储器内的一个字

将公式3412H相加,并将结果返回到存储器单元。

ADD WORD PTR [0520H],3412H

)将数0A0H与AL寄存器的内容相加,并将其结果发回AL。

ADD AL,0A0H

习题2.10

指示以下命令中的错误

)1) xchg [si],30h; xchg的操作数不能是即时数

)2) pop cs; 不能直接为CS分配值

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

)4)推送; 堆栈的操作数不能是字节数

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

)6) add [si],80h; 不确定是字节还是字

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

(8) out dx,ah; out只将AL/AX作为源操作数

解答

习题3

习题2.13

习题2.22

习题2.24

习题2.29

习题2.34

习题2.13(1 (一)

创建程序段有以下要求:

(1)用位操作命令将AL )无符号数)乘以10

; 不考虑进位

mov bl,al

mov cl,3

shl al,cl

add al,bl; shl bl,1

add al,bl

解答

; 考虑进位

xor ah,ah

mov bx,ax

mov cl,3

shl ax,cl

add ax,bx; shl bx,1

add ax,bx

教学资源网

教学资源网

)2)在逻辑运算命令中输入数字0~9的ascii码和

未压缩BCD码的相互转换

数字0到9的ASCII代码为30h到39h

未压缩BCD码0至9是00h至09h

方法1 :

and al,0fh; 实现ASCII到未压缩BCD码的转换

or al,30h; 实现未压缩BCD码到ASCII的转换

方法2 :

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

; 即,如果前4位为3,则为0; 如果前4位是0,则为3

解答

如果把方法写在分段上

习题2.13(2)解答方法1

test al,30h

jnz ASCII

or al,30h; 未压缩BCD码到ASCII的转换

jmp done

ASCII: and al,0fh; 从ASCII到未压缩BCD码的转换

done:

制定习题2.13(3)程序段,满足以下要求。

)3)将DX.AX的双字向右移动4位

mov cl,4

again: shr dx,1; 实现逻辑右移

; 采用“sar dx,1”可实现算术右移

rcr ax,1

dec cl

jnz again

解答

错误1 :

ror dx,1

————

错误2 :

shr dx,4

rcr ax,4

习题2.22 •判断下一段跳跃的条件

)1) xor ax,1e1eh

je equal

; AX=1e1eh (“异或”后为0 ) ) ) ) ) ) ) ) )。

)2) test al,10000001b

jnz there

; AL的D0或D7的至少1位为1

)3) cmp cx,64h

jb there

; CX (无符号数) ) 64h

解答

后缀h别忘了

演习问题2.24中,假设在AX和SI中存储了符号数,DX和DI

的是无符号的数,请使用比较指令和条件分支指令

实现以下判断:

)1) DX DI时,转移到above并执行

cmp dx,di

ja above;=jnbe above

)2) AX SI的情况下,转移到greater并执行

cmp ax,si

jg greater;=jnle greater

)3) CX=0时,转移到zero执行

cmp cx,0 jcxz zero

jz zero

解答

无符号

有符号的数

采用正确的东西

条件的转移

命令

演习问题2.24中,假设AX和SI保存有符号的数,DX和DI保存

的是无符号的数,请使用比较指令和条件分支指令

实现以下判断:

)4)如果AX-SI出现溢出,则转移到overflow并执行;

cmp ax,di

jo overflow

)5)如果是SIAX,则转移到less_eq并执行;

cmp si,ax cmp ax,si

jle less_eq jge less_eq

(6) DIDX时,转移到below_eq并执行。

cmp di,dx cmp dx,di

jbe below_eq jae below_eq

解答

jng

jnl

jna jnb

习题2.29

已知AX、BX中存储有4比特压缩BCD表

的十进制数。 请说明一下子程序的工作

出口参数。

add al,bl

daa

xchg al,ah

adc al,bh

daa

xchg al,ah

回复

解答

压缩BCD码加法:

AXAX BX

出口参数:

AX=BCD码和

习题2.34

补充示例2.44,如果存在溢出,则返回“Error!

溢出! ”,如果没有溢出,则显示“OK”。

okmsgdb‘确定’,‘$’

errmsg db ‘Error! overflow!’ 、‘$’

……

mov ax,x

sub ax,y

jo overflow

mov dx,offset okmsg

jmp next

overflow: mov dx,errmsg

next: mov ah,9

int 21h

解答

别忘了$

此命令

少不了!

习题2.34

补充示例2.44,如果存在溢出,则返回“Error!

溢出! ”,如果没有溢出,则显示“OK”。

mov ax,x

sub ax,y

jo overflow

mov dx,offset okmsg

okmsgdb‘确定’,‘$’

mov dx,errmsg

mov ah,9

int 21h

overflow :错误数据库‘错误! overflow!’ 、‘$’

mov dx,errmsg

mov ah,9

int 21h

错误

错误1 :

数据在代码中定义

错误2 :

没有JMP命令

习题4

习题2.15

习题2.16

习题2.26(3 (三)

习题2.26(6)

习题2.26(7)

习题2.15

已知在数据段500h~600h中存储有一个字

表示执行下一段后结果的符号串

mov si,600h

mov di,601h

mov ax,ds

mov es,ax

mov cx,256

std

rep movsb

解答

DS=ES

DI=601H

SI=600H

500H从DS:500h开始

向上移动的256个字节

一个存储单元

习题2.16 •说明以下方框的功能

cld

mov ax,0fefh

mov cx,5

mov bx,3000h

mov es,bx

mov di,2000h

rep stosw

解答

3000:200AH 0fefH

3000:2000H

0从32000h开始填写0fefh

的五字存储单元

0fefH

0fefH

0fefH

0fefH

习题2.26(3 (三)

DX前4位全部为0时,

使AX=0; 否则取AX=-1。

test dx,0f000h; test dh,0f0h

jz next; jnz next

mov ax,-1; mov ax,0

jmp again

next: mov ax,0; mov ax,0ffffh

again:

解答

一定有!

习题2.26(6)

我知道字符串string包含32KB的内容

的“$”符号将被空格替换。

; 最好不要使用串行操作命令

mov si,offset string

mov cx,8000h

again: cmp byte ptr [si],‘$’; ‘$’=24h

jnz next

mov byte ptr [si],‘; ’=20h

next :集成版si

loop again; dec cx

; jnz again

解答1

请不要在jz上分支

习题2.26(6)

我知道字符串string包含32KB的内容

的“$”符号将被空格替换

; 使用串行操作命令

mov di,offset string

mov al,’$’

mov cx,8000h

cld

again: scasb

jnz next

mov byte ptr es : [di-1],‘’

next: loop again

解答2

习题2.26(7)

有一个100字节的元素数组,其第一个位置

地址为array,将每个元素减1。 不考虑溢出

出(保存在原处。

mov si,offset array

mov cx,100

again: dec byte ptr [si]

inc si

loop again

解答1

习题2.26(7)

有一个100字节的元素数组,其第一个位置

地址为array,将每个元素减1。

双元制职业教育

双元制职业教育

mov ax,ds

mov es,ax

mov cx,100

cld

解答2

again: lodsb

dec al

stosb

loop again

习题5

演习问题3.5

演习问题3.9

习题3.14

习题3.15

演习问题3.5

汇编语言程序的开发有哪四个步骤,每一个

用什么样的程序完成和生成什么样的输出文件?

文本编辑器汇编语言源程序. asm

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

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

调试调试器APP

解答见第78页

在演习问题3.9中,假设myword为单词变量,mybyte1

和mybyte2是2字节变量,表示

语句中的错误。

)1) mov byte ptr [bx],1000

; 1000超出了1字节的范围

)2) mov bx,offset myword[si]

; 只有在程序运行时才能确定寄存器的值。

; offset是在装配过程中计算的偏移地址,无法确认

; 可以更改为lea bx,myword[si]

)3) cmp mybyte1,mybyte2

; 两者都是内存单元,不允许命令

解答

习题3.9中,假设myword为单词变量,mybyte1

和mybyte2是2字节变量,表示

语句中的错误。

)4) mov al,mybyte1 mybyte2

; 变量值仅在运行时确定,无法计算装配过程

)5)子al,myword

; 字节数AL和字数myword,类型不一致

(6) jnz myword

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

解答

习题3.14 •分配给以下语句的存储空间和

已初始化的数据值:

)1) byte_var DB 'ABC ',10,10h,' EF ',3dup(-1,3dup(4) )

)2) word_var DW 10h,-5,' EF ',3 DUP )? )

解答

‘a’‘b’‘c’1010 h‘e’‘f’-1- 44 .

41 h 42 h 43 h0a h10 h 45 h 46 hffh-04 h 04 h 04 h

三个

10h 0 FBh FFh 46h 47h - - - - - -

10h-5‘ef’?

习题3.15

请设置数据段mydataseg,如所示

必须在中定义变量。

(1) my1b为字符串变量: Personal Computer

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

(3) my3b是用十六进制表示的字节变量: 20

(4) my4b是以二进制表示的字节变量: 20

)5) my5w为未赋值的字变量20个

)6) my6c为100的常数

(7) my7c表示字符串:个人计算机

请看答案

习题3.15解答

我的数据段

my1 BDB‘个人计算机’

my2b db 20

my3b db 14h; 20h

my4b db 00010100b

my5w dw 20 dup (? )

my6c equ 100; my6c=100

my7c equ

我的数据结束

习题6

习题3.22

习题3.25

习题3.26

习题3.22

在SMALL存储模式下,简化段定义网格

公式的代码段、数据段和累计栈段的默认段

名字、定位、组合、类别属性分别是什么

还是?

段定义伪指令段名定位组合类别组名

. CODE _TEXT WORD PUBLIC 'CODE '

. data _ datawordpublic ' data ' d group

. stackstackparastack ' stack ' d group

解答请参照第101页

习题3.25

写出简化的段定义格式,如下所示

的源程序

(1)定义了常数num,其值为5。 定义数据段中的单词数组

变量datalist,在其前5个字单元中输入- 1,0,

2、5和4,最后一个单元的初始值不定

)2)代码段中的程序累计datalist中开头的num个数

并存储在datalist的最后一个字单元中。

请看答案

习题3.25解答

.模型小型模型

. stack

. data

num equ 5

datalistdw-1、0、2、5、4?

. code

. startup

mov bx,offset datalist

mov cx,num

xor ax,ax

again: add ax,[bx]

inc bx

inc bx

loop again

mov [bx],ax

. exit 0

结束

字变量

需要一加二

mov datalist num*2,ax

习题3.26

如下所示写出完整的段落定义格式

的源程序

)1)数据段开始于双字边界,其中定义100个字节

的数组。 同时,该段也用作附加段

(2)分层堆放起始于节点边界,组合类型为堆叠;

)3)代码段的类别为“code”,指定段寄存器的对应

逻辑段; 主程序指定从100h开始,提供给相关段寄存器

给出初始值; 将所有数组元素设置为64h。

请看答案

习题3.26解答

安全堆栈

dw 512 dup (? )

堆栈结束

数据段下载

阵列db 100 dup (? )

data ends

代码段‘代码’

assume

cs:代码、cs:数据、cs:数据和cs:堆栈

org 100h

start: mov ax,数据

mov ds,ax

mov es,ax

mov di,offset array

mov al,64h

mov cx,100

cld

rep stosb

mov ax,4c00h

int 21h

代码结束

结束开始

习题7

习题4.22

演习问题5.9

习题5.12

习题5.18

习题4.22

流程定义的一般格式怎么样? 子程序的入口是

什么是经常有推送指令,出口有POP指令?

下一段有什么不妥吗? 如果有,请修改:

crazy PROC; crazy PROC

推x;

xor ax,ax; xor ax,ax

xor dx,dx; xor dx,dx

again:add ax,[bx]; again: add ax,[bx]

adc dx,0; adc dx,0

inc bx; inc bx

inc bx; inc bx

loop again; loop again

ret; 回复

ENDP crazy; crazy ENDP

解答

求字量求和

入口参数:

BX=数据起始地址

CX=数据数

出口参数:

AX=和的低字

DX=和的霍华德

(进位部分)

演习问题5.9

对于例题5.5b的宏观定义shrot,应对如下

宏命令的宏展开是什么?

shrot word ptr [bx],4,ror

1推送CX

1 mov cl,4

1 ror word ptr [bx],cl

1 pop cx

解答

演习问题5.12 •编写宏命令move doprnd,soprnd,

实现任意地址方式的字源操作数

传输目标操作数,包括从存储单元到存储器的传输

存储单元的传输功能。

move MACRO doprnd,soprnd

推x

mov ax,soprnd

mov doprnd,ax

pop ax

ENDM

解答

习题5.18

dos功能调用用AH存储子功能编号,包括

一些功能需要在DX中存储值。 定义宏

DOS21H,实现呼叫功能; 如果没有提供

不会将为DX参数赋值的语句组装在一起。

DOS21H MACRO callnum,calladdress

mov ah,callnum

mov dx,呼叫地址

endif

int 21h

ENDM

解答

随机看看

NEW ARTICLE

标签

Tag