汇编语言程序设计合工大版习题参考答案.docx

上传人:b****6 文档编号:6886757 上传时间:2023-01-12 格式:DOCX 页数:81 大小:53.53KB
下载 相关 举报
汇编语言程序设计合工大版习题参考答案.docx_第1页
第1页 / 共81页
汇编语言程序设计合工大版习题参考答案.docx_第2页
第2页 / 共81页
汇编语言程序设计合工大版习题参考答案.docx_第3页
第3页 / 共81页
汇编语言程序设计合工大版习题参考答案.docx_第4页
第4页 / 共81页
汇编语言程序设计合工大版习题参考答案.docx_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计合工大版习题参考答案.docx

《汇编语言程序设计合工大版习题参考答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计合工大版习题参考答案.docx(81页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计合工大版习题参考答案.docx

汇编语言程序设计合工大版习题参考答案

 

5.13字数组ARRAY,第一个单元为元素个数N,后面为N个元素,编写程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。

;deletethe0fromarray

datasegment

arraydw6,3,4,0,15,0,7

locadw999;此单元地址为结束标记

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movcx,array

leabx,array+1

next:

cmpwordptr[bx],0

jzmove

addbx,2

deccx

cmpcx,0

jnznext

jmpexit

move:

decarray

movdi,bx

mnext:

cmpdi,offsetloca

janext

movax,[di+2]

mov[di],ax

adddi,2

cmpdi,offsetloca

jnbnext

jmpmnext

exit:

movah,4ch

int21h

codeends

endstart

5.14下表为奥运会获金牌前十名国家的成绩统计表,请编写程序,统计并填写表中的合计栏数据。

;先逐行求小计,再按列求合计。

datasegment

arraydb1,0,1,?

;设简单数据

db1,1,0,?

db1,1,0,?

db1,1,1,?

db1,1,1,?

db1,1,1,?

db1,1,1,?

db1,1,1,?

db1,1,1,?

db1,1,1,?

org30h

sumvddb?

?

?

?

;存放按列求的合计数

org40h

locadw?

;存放array的第一行地址

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movax,0

movcx,10

leabx,array

sumh:

movdi,3

sum3:

addal,[bx]

incbx

decdi

jnzsum3

mov[bx],al;存放行的小计

movax,0

incbx

loopsumh

;下面按列求合计

leabx,array

movloca,bx

leasi,sumvd

movcx,10

movdi,4

sumv3:

movax,0

movbx,loca

sumv:

addal,[bx]

addbx,4

loopsumv

mov[si],al

movcx,10

incsi

incloca

decdi

jnzsumv3

exit:

movah,4ch

int21h

codeends

endstart

6.1过程定义如下,补充括号中的指令。

codesegment

assumecs:

code

mainprocfar

(PUSHDS)

(XORAX,AX)

(PUSHAX)

ret

mainendp

codeends

endmain

6.2补充下列程序括号中的指令,使得程序对堆栈的操作全部利用程序中定义的TOS堆栈,并画出程序执行后堆栈TOS中的数据。

datasegment

dw100dup(?

toslabelword

dataends

codesegment

assumecs:

code,ss:

data

mainprocfar

(MOVAX,DATA)

(MOVSS,AX)

(LEASP,TOS)

pushds

xorax,ax

pushax

callfarptrsuba

…;假定此处指令的地址为cs=3400h,ip=30h

codeends

endmain

6.3以下两个独立程序模块,互相用到对方的变量和标号,你认为哪一个是主模块?

程序有没有错误?

应该如何修改?

答:

m1.asm是主模块,因为它有callm2,但没有说明外部符号,而m2必须是过程名,var4,lab2也没有说明外部符号。

var1,var2没有说明为PUBLIC。

应加上:

EXTRNm2:

FAR,var4:

WORD

PUBLICvar1,var2,lab1

并修改datasegment为datasegmentPUBLIC

同理M2.asm应加上:

EXTRNvar1:

byte,var2:

word

extrnlab1:

FAR

PUBLICt603b,var4

并修改datasegment为datasegmentPUBLIC

以上完成主要修改,但程序依然有错,请仔细检查操作数类型是否匹配。

;m1.asm如下:

datasegment

var1db?

var2dw?

var3dw?

dataends

code1segment

assumecs:

code1,ds:

data

mainprocfar

start:

movax,data

movds,ax

callm2

lab1:

movax,var4

jmplab2;去掉此指令

mainendp

code1ends

endstart

;m2.asm如下:

datasegment

var4dw?

var5dw?

dataends

code2segment

assumecs:

code2,ds:

data

m2procfar

adddx,var1;var1为字节类型

adddx,var2

jmplab1

M2endp

code2ends

end

6.4主程序从键盘输入N位二进制数到缓冲区,用子程序将其转换为二进制数串显示。

主程序和子程序共用数据缓冲区。

datasegment

buffdb9,?

9dup(?

dataends

codesegment

assumecs:

code,ds:

data

mainprocfar

start:

movax,data

movds,ax

leadx,buff

movah,10

int21h

calloutp

exit:

movah,4ch

int21h

mainendp

outpprocnear

movah,2

movdl,10

int21h

movcl,buff+1

movch,0

leabx,buff+2

out1:

movdl,[bx]

movah,2

int21h

incbx

loopout1

ret

outpendp

codeends

endstart

6.5主程序从键盘输入一个字符串到BUFF,再输入一个字符到AL,用子程序在字符串BUFF中查找是否存在该字符,如果找到,显示发现的字符位置。

用寄存器传递要查找的字符。

;search

datasegment

mess1db13,10,'inputstring:

$'

mess2db13,10,'inputachar:

$'

mess3db13,10,'notfound!

$'

mess4db13,10,'foundat:

$'

org40h

bufflabelbyte

max1db9

act1db?

stok1db9dup(?

dataends

codesegment

assumecs:

code,ds:

data

mainprocfar

pushds

subax,ax

pushax

movax,data

movds,ax

moves,ax

leadx,mess1

movah,09

int21h;qust1?

leadx,buff

movah,0ah

int21h;ans1

leadx,mess2

movah,09

int21h;qust2?

movah,1

int21h;ans2

callnearptrscan

ret

mainendp

scanprocnear

movcl,act1

movch,0

leadi,stok1

repnescasb

jefound

nofd:

leadx,mess3

movah,9

int21h

jmpexit

found:

leadx,mess4

movah,9

int21h

subact1,cl

movdl,act1

adddl,30h

movah,2

int21h

exit:

ret

scanendp

codeends

endmain

6.6编写程序,从键盘输入一个字符串到BUFF,用子程序统计各字符出现的次数。

错误!

;numbersofeverychartobefound

;ababc

;0b0bc

;0000c

;00000

datasegment

mess1db13,10,'inputstring:

$'

mess2db13,10,'inputachar:

$'

mess3db13,10,'notfound!

$'

mess4db13,10,'foundat:

$'

org40h

bufflabelbyte

max1db9

act1db?

stok1db9dup(?

dataends

codesegment

assumecs:

code,ds:

data

mainprocfar

pushds

subax,ax

pushax

movax,data

movds,ax

leadx,mess1

movah,09

int21h;qust1?

leadx,buff

movah,0ah

int21h;ans1

callnearptrscan

ret

mainendp

scanprocnear

movcl,act1

movch,0

movdl,30h

send:

leadi,stok1

k1:

cmpbyteptr[di],20h

jekong

cmpbyteptr[di],13

jeones

movbl,[di]

movbyteptr[di],20h

k2:

incdl

incdi

cmpbl,[di]

jecnum

cnum:

movbyteptr[di],0

ones:

movah,2

int21h

loopsend

kong:

incdi

jmpk1

movsi,di

moval,[si]

cmpal,20h

jenext

cmpal,[di]

jnenext

incdl

next:

incdi

loop

nextcmp

repnescasb

jefound

nofd:

leadx,mess3

movah,9

int21h

jmpexit

found:

leadx,mess4

movah,9

int21h

subact1,cl

movdl,act1

adddl,30h

movah,2

int21h

exit:

ret

scanendp

codeends

endmain

6.7主程序从键盘输入一个八位的二进制数,对其作求补操作,用子程序对求补后的值以二进制形式显示。

codesegment

assumecs:

code

mainprocfar

start:

movbx,0

movcx,8

next:

movah,1

int21h

cmpal,30h

jbexit

cmpal,31h

jaexit

subal,30h

shlbl,1

addbl,al

loopnext

negbl

calloutp

exit:

movah,4ch

int21h

mainendp

outpprocnear

movah,2

movdl,10

int21h

movcx,8

kp:

shlbl,1

jck1

movdl,30h

jmpkk

k1:

movdl,31h

kk:

movah,2

int21h

loopkp

ret

outpendp

codeends

endstart

6.8主程序从键盘输入两个四位的十六进制数A和B,用子程序作十六进制计算A+B,并显示计算结果。

;onlyacceptprintchar:

0~9,A~F

codesegment

assumecs:

code

mainprocfar

start:

movax,cs

movds,ax

leadx,mess

movah,9

int21h

movsi,2

inone:

movdx,0

movbx,0

movch,4

movcl,4

next:

movah,1

int21h

subal,30h

cmpal,0

jbexit

cmpal,9

jachar

jmpk1

char:

subal,7

cmpal,0ah

jbexit

cmpal,0fh

jaexit

k1:

movdl,al

shlbx,cl

addbx,dx

decch

jnznext

pushbx

movah,2

movdl,13

int21h

movah,2

movdl,10

int21h

decsi

jnzinone

calloutp

exit:

movah,4ch

int21h

mainendp

outpprocnear

movbp,sp

movax,[bp+2]

movbx,[bp+4]

addbx,ax

movch,4

movcl,4

out1:

rolbx,cl

movdx,bx

anddl,0fh

adddl,30h

cmpdl,39h

jaad7

jmpkp

ad7:

adddl,7

kp:

movah,2

int21h

decch

jnzout1

ret

outpendp

messdb'onlyaccept0-9,A-F,input:

',13,10,'$'

codeends

endstart

6.9某字数组为有符号数,第一个单元为元素个数N,后面为N个元素,编写通

用子程序,求数组元素中的最大值,并把它放入MAX单元。

;putthebigtomaxlocation

datasegment

arraydw5,9,4,5,15,3

maxdw?

dataends

codesegment

assumecs:

code,ds:

data

mainprocfar

movax,data

movds,ax

movcx,array

leabx,array+1

callnearptrgetmax

movah,4ch

int21h

mainendp

getmaxprocnear

movax,[bx]

movmax,ax

k1:

movax,[bx]

cmpax,max

jlnext

movmax,ax

next:

addbx,2

loopk1

ret

getmaxendp

codeends

endmain

6.10某字数组,第一个单元为元素个数N,后面为N个元素,编写通用子程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。

;deletethe0fromarray

datasegment

arraydw6,3,4,0,1,0,5

locadw999

dataends

codesegment

assumecs:

code,ds:

data

mainprocfar

movax,data

movds,ax

movcx,array

leasi,array

leabx,array+1

callnearptrdele0

movah,4ch

int21h

mainendp

dele0procnear

next:

cmpwordptr[bx],0

jzmove

addbx,2

deccx

cmpcx,0

jnznext

jmpexit

move:

decwordptr[si]

movdi,bx

mnext:

cmpdi,offsetloca

janext

movax,[di+2]

mov[di],ax

adddi,2

cmpdi,offsetloca

jnbnext

jmpmnext

exit:

ret

dele0endp

codeends

endmain

部分习题参考答案

1.5下列各数均为十进制数,请采用8位二进制补码运算,并回答标志寄存器FLAGS中CF和OF的值,运算结果所代表的十进制数是多少?

如果用16位二进制补码运算,其结果所代表的十进制数是多少?

FLAGS中CF和OF的值呢?

(1)85+69

(2)85+(-69)(3)85-(-69)(4)85-(69)

85=55H,69=45H,-69=BBH,

8位二进制补码运算:

(1)85+69=55H+45H=9AH,CF=0,OF=1

(2)85+(-69)=55H+BBH=110H,CF=1,OF=0

其余略

1.6实模式下,写出段地址和偏移地址为1234:

2002、1430:

0042、FF00:

0FFF的物理地址。

1234:

2002=12340+2002=14342

1430:

0042=14300+0042=14342

FF00:

0FFF=FF000+0FFF=FFFFF

1.7已知8086系统某存储单元物理地址为:

52506H,你认为段基址的最大值、最小值分别是多少?

8086微机最多可以有多少个不同的段基址?

52506=5250:

0006,段基址的最大值=5250

52506=4251:

FFF6,段基址的最小值=4251

1.8从物理地址为00100H开始到00103H单元中顺序存放的数据为:

12H,34H,56H,78H。

请画出数据存放示意图,并回答以下问题:

(1)写出00101H字节单元的内容

(00101)=34H

(2)写出00102H字单元的内容

(00102)=7856H

习题3

3.1分别说明8086处理器中各寄存器的名称和作用是什么?

3.2溢出标志OF与进位标志CF有何作用和区别?

3.3何为段地址?

何为有效地址?

何为物理地址?

用指令举例说明。

3.4带符号数比较大小,当AX

后续指令应为什么?

若视为二个无符号数比较大小,后续指令应为什么?

带符号数:

JLL1,无符号数:

JBL1

3.5ADD指令和ADC指令在什么情况下是一样的结果?

CF=0

3.6说出CALL指令和INT21H指令的操作,有何异同?

CALL把断点压入堆栈,不一定是远调,INT21H还要把FLAGS压入堆栈,且是远调,总入口地址为84H内存中的两个字。

3.7除了用4CH号系统功能调用结束程序的执行并退出,还有哪些办法?

RET指令,INT20H

3.8指出下列错误的指令,说出错误原因,并给出合适的修改。

(1)MOVAX,[DX]/MOVAX,[BX]

(2)MOVDS,DATA/MOVDS,BX

(3)MOVCS,AX/MOVES,AX

(4)MOVAX,DL/MOVAL,DL

(5)PUSHAL/PUSHAX

(6)ADD[BX],[DI]/ADD[BX],DI

(7)LEA[BX],[2000H]/LEABX,[2000H]

(8)MOV[BX],OFFSET[2000H]

(9)MOV[SI],2/MOVBYTEPTR[SI],2

(10)MULBX,CX/MULBX

(11)DIV5/DIVBX

(12)MOVBYTE[SI],2/MOVBYTEPTR[SI],2

(13)MOVAX,[SI+DI]/MOVAX,[BX+SI]

(14)SHRAX,4/SHRAX,1

(15)CMP6,AX/CMPAX,6

(16)MOV[FFFF],AX/MOV[FFFE],AX

(17)MOVAX,BX+4/MOVAX,[BX+4]

(18)JMPFARPRO/JMPFARPTRPRO

3.9假定(DS)=1200H,(SS)=4400H,(BX)=463DH,(BP)=2006H,(SI)=6A00H,位移量D=4524H,以AX寄存器为目的操作数,试写出以下各种寻址方式下的传送指令,并确定源操作数的有效地址EA和物理地址。

(1)立即寻址;操作数的EA就是指令的EA/操作数在指令中/无EA

(2)直接寻址;EA=4524H,物理地址=DS:

4524

(3)使用BX的寄存器寻址;无EA

(4)使用BX

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 生物学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1