汇编语言程序设计程学先汇编第234章作业参考答案.docx

上传人:b****6 文档编号:13531007 上传时间:2023-06-15 格式:DOCX 页数:55 大小:32.88KB
下载 相关 举报
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第1页
第1页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第2页
第2页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第3页
第3页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第4页
第4页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第5页
第5页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第6页
第6页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第7页
第7页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第8页
第8页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第9页
第9页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第10页
第10页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第11页
第11页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第12页
第12页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第13页
第13页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第14页
第14页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第15页
第15页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第16页
第16页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第17页
第17页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第18页
第18页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第19页
第19页 / 共55页
汇编语言程序设计程学先汇编第234章作业参考答案.docx_第20页
第20页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编语言程序设计程学先汇编第234章作业参考答案.docx

《汇编语言程序设计程学先汇编第234章作业参考答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计程学先汇编第234章作业参考答案.docx(55页珍藏版)》请在冰点文库上搜索。

汇编语言程序设计程学先汇编第234章作业参考答案.docx

汇编语言程序设计程学先汇编第234章作业参考答案

2.16编写程序段,使(AH)与(AL)中的内容互换。

解1

MOVBL,AL

MOVAL,AH.

MOVAH,BL

解2

XCHGAH,AL

2.17编写程序段,使(BL)中高4位与低4位内容互换。

解1

MOVCL,4

MOVBH,0

SHLBX,CL

ADDBL,BH

解2

MOVCL,4

ROLBL,CL

2.18编写程序段,实现当(DL)是奇数时使(AL)=31H,否则使(AL)=30H。

SHRDL,1

MOVAL,0

RCLAL,1

ADDAL,30H

2.20设寄存器AX中存放1234H,BX寄存器中存放1,执行DIVBL指令后,会发生什么现象?

为什么?

溢出,商超过8位,在AL中存放不下商。

2.21设DX寄存器中存放值为0,AX中存放1234H,BX中存放1,执行DIVBX后,是否会出现与2.20相同现象?

为什么?

不会,因为是16位除法,商未超过16位

2.22一字数据压栈时堆栈指针如何改变?

弹出一字数据时堆栈指针如何改变?

压栈时堆栈指针减2;弹出一字数据时堆栈指针加2

2.23已知(SP)=2088H,(AX)=1A89H,(BX)=90CDH。

依次执行以下三条指令后,画图说明堆栈中数据情况,及SP、AX、BX中数据。

PUSHAX

PUSHBX

POPAX

(SP)=2086H,(AX)=90CDH,(BX)=90CDH。

*2.25编写程序段求8!

(8的阶乘)。

MOVAX,8

MOVBX,7

NEXT:

DX,0

MULBX

DECBX

JNZNEXT

2.27假设(AX)=07EH,变量BUFFER中存放的内容为B5H,求下列各条指令单独执行后的结果。

(1)ANDAX,BUFFER34H

(2)XORAX,BUFFERCBH

(3)ORAX,BUFFER0FFH

(4)ANDAX,00

(5)XORAX,OFFH81H

(6)TESTAX,8000H相与结果为0时。

AX为正,值不变

*2.28编写程序段,判断(AL)中的有符号数是正数还是负数,正数在CL中写0,否则写1。

CMPAL,0

MOVCL,0

JGENEXT

MOVCL,1

NEXT:

……

2.29编写程序段,对存放在(DX)、(AX)中的双字数据求补。

MOVBX,0

SUBBX,AX

MOVAX,BX

MOVBX,0

SBBBX,DX

MOVDX,BX

2.31假设(DX)=78D5H,(CL)=5,CF=0,确定下列各条指令单独执行后(DX)中的值。

(1)SHLDH,1(DX)=F0D5H

(2)SALDX,CL(DX)=1AA0H

(3)SHRDX,CL(DX)=03C6H

(4)SARDL,1(DX)=78EAH

(5)ROLDX,CL(DX)=1AAFH

(6)RCRDL,1(DX)=786AH

(7)RCLDH,CL(DX)=0FD5H

2.32按下列要求编写指令序列。

(1)清除DH中最低3位而不改变其他位,结果存入BH。

ANDDH,0F8H

(2)将DI中最高3位置1而不改变其他位。

ORDI,0E000H

(3)将AX中0~3位置1、7~9位取反、其他位清0。

ORAX,0FH

XORAX,380H

ANDAX,38FH

(4)检查BX中第2、5、9位是否至少有1位是1。

TESTAX,224H如果结果非0

(5)检查CX中第1、6、11位是否同时为1。

NOTCX

TESTCX,842H如果结果为0

(6)检查BX中第0、2、9、13位是否至少有1位是0。

NOTBX

TESTBX,2205H如果结果非0

(7)检查DX中第1、4、11、14位是否同时是0。

TESTDX,4812H如果结果为0

2.33编写指令序列分别实现下述功能。

(1)右移DI3位,并将0移入最高位。

MOVCL,3

SHRDI,CL

(2)将AL左移一位,将0移入最低位。

SHLAL,1

(3)DX右移6位且保持正负特性不变。

MOVCL,6

SARDX,CL

(4)将AL中压缩BCD码变成AX中的非压缩BCD码。

MOVAH,0

MOVCL,4

SHLAL,CL

MOVCL,4

SHRAL,CL

2.34分析下面的程序段完成什么功能?

MOVCL,4

SHRAX,CL

MOVBL,DL

SHRDX,CL

SHLBL,CL

ORAH,BL

将双字(DX,AX)逻辑右移4位

*2.35设数据段偏移地址1000H处开始存放有10个字节数据,将其求和,结果存放在AX中。

MOVCX,10

MOVSI,1000H

MOVAX,0

CLC

LOOP1:

ADCAX,[SI]

INCSI

LOOPLOOP1

2.37从键盘输入0到9之间某数字字符,利用列表法将该数字的平方值放到AL中。

SUBDB0,1,4,9,16,25,36,49,64,81

MOVAH,1

INT21H

SUBAL,30H

MOVBL,AL

MOVBH,0

MOVAL,SUB[BX]

2.38已知X、Y、Z、P、K均为16位带符号数,求计算(1000+X*Y-Z)/P的程序段。

注明结果的商与余数所存放的位置。

MOVAX,X

IMULY;x*y

MOVCX,AX

MOVBX,DX

MOVAX,Z

CWD;符号扩展,AX中符号扩展到DX中

SUBCX,AX

SBBBX,DX;x*y-z

MOVAX,1000

MOVDX,0

SUBAX,CX

SBBDX,BX

MOVBX,P

IDIVBX;(1000+X*Y-Z)/P

 

4.1编制程序计算Y=5X+7,设X值在DAX字节单元,结果存入RLT字节单元。

X为带符号整数。

DATASEGMENT

DAXDB15H

RLTDB0

DATAENDS

STACKSEGMENTSTACK

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA

MOVDS,AX

MOVAL,DAX

MOVBL,5;X*5

IMULBL;有符号数乘法

ADDAL,7

MOVRLT,AL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

;DAX绝对值不能超过18H(0-18H或0FFH-0E9H)。

;否则,RLT得为字类型,ADDAL,7改为ADDAX,7

;因为7已知为正,无需符号扩展。

4.3编制程序计算X-Y。

设X、Y分别在DAX、DAY单元,结果存入RESULT单元。

(1)X、Y为字节数据

(2)X、Y为字数据(3)X、Y为双字节数据

要求:

存取数据时至少使用三种不同的寻址方式。

1、用直接寻址

DATASEGMENT

DAXDB18H

DAYDB65H

RESULTDB0

DATAENDS

STACKSEGMENTSTACK

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA

MOVDS,AX

MOVAL,DAX;源操作数为直接寻址

SUBAL,DAY

MOVRESULT,AL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

2、换间接寻址与相对寻址

DATASEGMENT

DAXDW18H

DAYDW65H

RESULTDW0

DATAENDS

STACKSEGMENTSTACK

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA

MOVDS,AX

MOVSI,DAX

MOVDI,RESULT

MOVAX,[SI];源操作数为间接寻址

SUBAX,[SI+2];源操作数为相对寻址

MOV[DI],AX

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3、X、Y为双字节数据,必须分高16位与低16位分别运算

方法1

DATASEGMENT

DAXDD2A341928H

DAYDD6873BC25H

RESULTDD0

DATAENDS

STACKSEGMENTSTACK

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA

MOVDS,AX

MOVAX,WORDPTRDAX;减低16位

SUBAX,WORDPTRDAY

MOVWORDPTRRESULT,AX

MOVAX,WORDPTRDAX+2;减高16位

SUBAX,WORDPTRDAY+2

MOVWORDPTRRESULT+2,AX

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

;特别注意加“WORDPTR”

;注意低16位与高16位各是如何表示的。

;还要注意,本题要求出现三种以上寻址方式。

目前解中用到了寄存器寻址、直接寻址、间接寻址与相对寻址4种方式。

方法2:

LEASI,DAX

LEADI,DAY

LEABX,RESULT

MOVAX,[SI]

SUBAX,[DI];减低16位

MOV[BX],AX

MOVAX,[SI+2]

SBBAX,[DI+2];减高16位

MOV[BX+2],AX

4.4设内存OPCD单元存放一个16位代码,编制程序将其中15~13,12~8,7~3,2~0位的代码分别存入WCD开始的单元。

每段代码的最低位与单元的第0位对齐。

解法1:

DATASEGMENT

OPCDDW2A5CH

WCDDW?

?

?

?

DATAENDS

STACKSEGMENTSTACK

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA

MOVDS,AX

MOVAX,OPCD

MOVCL,13;逻辑右移13位

SHRAX,CL

MOVWCD,AX

MOVAX,OPCD

ANDAX,1FFFH;屏蔽高3位

MOVCL,8;逻辑右移13位

SHRAX,CL

MOVWCD+2,AX

MOVAX,OPCD

ANDAX,0FFH

MOVCL,3

SHRAX,CL

MOVWCD+4,AX

MOVAX,OPCD

ANDAX,7

MOVWCD+6,AX

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

解法2:

下面一种方法是4个字生成的程序段全一样,可以类似于逻辑尺建立一个数据表,变成循环来做。

MOVAX,OPCD

MOVCL,3

RORAX;循环右移3位

MOVBX,AX;暂存AX

ANDAX,07H;保留低3位

MOVWCD,AX

MOVAX,BX;恢复AX

MOVCL,5

RORAX;循环右移5位

MOVBX,AX;暂存AX

ANDAX,1F

MOVWCD+2,AX;保留低5位

MOVAX,BX

MOVCL,5

RORAX

MOVBX,AX

ANDAX,1F

MOVWCD+4,AX

MOVAX,BX

MOVCL,3

RORAX

MOVBX,AX

ANDAX,07H

MOVWCD+6,AX

4.5利用查表的方法计算S=X2+Y2,设0≤X≤15,0≤Y≤15,且分别在DAX、DAY字节单元存放,结果存入RLT单元。

DATASEGMENT

TABDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225;建立平方值表

DAXDB11;假设X的值

DAYDB13;假设Y的值

RLTDW?

DATAENDS

STACKSEGMENTSTACK

DB200DUP(0)

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA

MOVDS,AX

MOVAL,DAX

LEABX,TAB;指向平方值表

XLAT;根据X的值查表

MOVAH,0

MOVRLT,AX

MOVAL,DAY;根据Y的值查表

XLAT

MOVAH,0

ADDRLT,AX;求S=X2+Y2

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

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

MOVAH,1;键入一个字符

INT21H

MOVCX,8

NEXT:

ROLAL,1;循环左移一位

MOVDL,AL

ANDDL,1;保留最低1位

ADDDL,30H;显示一位

MOVAH,2

INT21H

LOOPNEXT

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

MOVAH,1;键入一个字符

INT21H

CMPAL,’a’;小于a(小A)退出

JBEXIT

CMPAL,’z’

JAEXIT;大于z(小z)退出

SUBAL,20H;小写变大写

MOVDL,AL;显示

MOVAH,2

INT21H

EXIT:

MOVAH,4CH

INT21H

4.9设有如下程序段:

LLL:

JCLLL

若JCLLL指令与LLL:

处指令间相隔1000H个存储单元,这个程序段将出现何种异常现象?

如何改造这个程序段?

转移超出范围,编译失败。

可以给JC之后的语句加标号:

NEXT,如下所示

JCLLL

NEXT:

……

则程序改为:

JNCNEXT

JMPLLL

NEXT:

……

4.13编写程序,当DL是奇数时使AL=30H,否则使AL=31H。

分析,如果DL是奇数,最低位应为1,将DL右移1位到CF中,CF将为1。

NOTDL;将DL最低位1变0,0变1

SHRDL,1;将DL最低位移到CF中

MOVAL,0;AL予清0

RCLAL,1;将CF移到AL最低位中

ADDAL,30H

说明,本解巧妙地不使用条件语句达到题目要求。

4.16编写一个程序,把变量BUFX和BUFY中较大者存入BUFZ;若两者相等,则把其中之一存入BUFZ中。

假设变量存放的是8位无符号数。

MOVAL,BUFX

MOVBUFZ,AL;予将BUFX放到BUFZ中

CMPAL,BUFY

JAEEXIT

MOVAL,BUFY;如果BUFX小

XCHGAL,BUFZ;将BUFY换到BUFZ中

EXIT:

MOVAH,4CH

4.17BUFX、BUFY和BUFZ是3个有符号16进制数,编写程序实现

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

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

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

MOVCL,0;计数

MOVAX,BUFX

CMPAX,BUFY

JNENEXT1

INCCL;如果BUFX和BUFY相等,将CL加1

NEXT1:

MOVAX,BUFY

CMPAX,BUFZ

JNENEXT2

INCCL;如果BUFY和BUFZ相等,将CL加1

NEXT2:

MOVAX,BUFX

CMPAX,BUFZ

JNENEXT3

INCCL;如果BUFX和BUFZ相等,将CL加1

NEXT3:

CMPCL,3

JNENEXT4

DECCL;如果CL为3,减为2

NEXT4:

;

4.18已知三个无符号数A、B、C,存放在ADR开始的连续单元,编写程序完成下述功能,若A、B、C同时为偶数,将FLAG单元置1;若同时为奇数,将FLAG单元置0;否则FLAG单元置全1。

解法1:

如果ABC为字节类型:

MOVCL,0;计数

MOVAL,ADR

SHRAL,1;右移A,如果A为偶,CF将为0,否则为1

JCNEXT1

INCCL;A为偶,将CL加1

NEXT1:

MOVAL,ADR+1;字节类型加1

SHRAL,1

JCNEXT2

INCCL;B为偶,将CL加1

NEXT2:

MOVAL,ADR+2

SHRAL,1

JCNEXT3

INCCL;C为偶,将CL加1

NEXT3:

CMPCL,3;以下判断CF,为3,则将FLAG单元置1

JNENEXT4

MOVFLAG,1

JMPEXIT

NEXT4:

CMPCL,0;以下判断CF,为0,则将FLAG单元置0

JNENEXT5

MOVFLAG,0

JMPEXIT

NEXT5:

MOVFLAG,-1

EXIT:

解法2,如果ADR为字类型

MOVCL,0

MOVAX,ADR

TESTAX,0001H;与上一方法不同点,改为测试第0位

JNZNEXT1

INCCL

NEXT1:

MOVAX,ADR+2;字类型加2

TESTAX,0001H

JNZNEXT2

INCCL

NEXT2:

MOVAX,ADR+4

TESTAX,0001H

JNZNEXT3

INCCL

NEXT3:

CMPCX,0

JZNEXT5

CMPCL,3

JZNEXT4

MOVCL,0FFH

JMPNEXT5

NEXT4:

MOVCL,1

NEXT5:

MOVFLAG,CL

4.20要求A、B、C三数的中间数(中间数即该数小于一数而大于另一数),其中A、B、C及中间数的存储单元自行定义。

假设A、B和C为无符号数,编写相关程序。

若A、B和C为有符号数,则应如何修改程序。

ADB39H

BDB54H

CDB6AH

DDB?

……

;只要将A、B、C从小到大排序,中间位置的就是中间数

MOVAL,A

CMPAL,B

JBENEXT1

XCHGAL,B;A>B.交换AB的位置

MOVA,AL

NEXT1:

MOVAL,B

CMPAL,C

JBENEXT2

XCHGAL,C;B>C.交换BC的位置

MOVB,AL

NEXT2:

MOVAL,A;再比较AB

CMPAL,B

JBENEXT3

XCHGAL,B;A>B.交换AB的位置

MOVA,AL

NEXT3:

MOVAL,B

MOVD,AL

;有符号数题解见下题解,只将JBE换为JLE就可以了。

4.21已知A、B和C存放在ADR开始单元,编制程序使之按递增顺序存放在NEW开始的单元。

设A、B和C为带符号数。

MOVAL,A

CMPAL,B

JLENEXT1

XCHGAL,B;A>B.交换AB的位置

MOVA,AL

NEXT1:

MOVAL,B

CMPAL,C

JLENEXT2

XCHGAL,C;B>C.交换BC的位置

MOVB,AL

NEXT2:

MOVAL,A;再比较AB

CMPAL,B

JLENEXT3

XCHGAL,B;A>B.交换AB的位置

MOVA,AL

4.23编制程序计算:

X*Y(Y>=0,X>=0)

S=X/Y(X<0,Y<0

∣X+Y∣(其它)

设X,Y为双字节带符号数据,分别存放在DAX,DAY单元,计算结果存入RLT单元。

RLTDW?

DAXDW?

DAYDW?

MOVCX,0

MOVAX,DAX

CMPAX,0

JLNEXT1

INCCX;X>=0

NEXT1:

MOVBX,DAY

CMPBX,0

JLNEXT2

INCCX;Y>=0

NEXT2:

CMPCX,2

JZNEXT3;X*Y

CMPCX,0

JZNEXT4;X/Y

ADDAX,BX

JONEXT5

CMPAX,8000H

JLNEXT5

NEGAX

NEXT5:

MOVDAX,AX

JMPEXIT1

NEXT4:

MOVDX,0

IDIVBX

MOVDAX,AX

JMPEXIT1

NEXT3:

IMULBX

MOVDAX,AX

MOVDAY,DX

EXIT1:

4.24编写程序,将一个包含有20个有符号数据的数组ARRAYM分成两个数组,正数数组ARRAYP和负数数组ARRAYN,并分别把这两个数组中的数据个数显示出来。

ARRAYMDB20,48,149,212,33,200,198,23,25,53,199,214,225,245,123,1,12,43,54,165

COUNTEQU$-ARRAYM

ARRAYPDBCOUNTDUP(0)

ARRAYNDBCOUNTDUP(0)

……

MOVBX,OFFSETARRAYM;源数据

MOVSI,OFFSETARRAYP;存正数

MOVDI,OFFSETARRAYN;存负数

MOVDH,0;正数个数

MOVDL,0;负数个数

MOVCX,COUNT

LOOP1:

MOVAL,[BX];源数据中取1个数

SH

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2