汇编语言程序设计钱晓捷课后答案docx.docx

上传人:b****7 文档编号:10506075 上传时间:2023-02-17 格式:DOCX 页数:67 大小:242.63KB
下载 相关 举报
汇编语言程序设计钱晓捷课后答案docx.docx_第1页
第1页 / 共67页
汇编语言程序设计钱晓捷课后答案docx.docx_第2页
第2页 / 共67页
汇编语言程序设计钱晓捷课后答案docx.docx_第3页
第3页 / 共67页
汇编语言程序设计钱晓捷课后答案docx.docx_第4页
第4页 / 共67页
汇编语言程序设计钱晓捷课后答案docx.docx_第5页
第5页 / 共67页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计钱晓捷课后答案docx.docx

《汇编语言程序设计钱晓捷课后答案docx.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案docx.docx(67页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计钱晓捷课后答案docx.docx

汇编语言程序设计钱晓捷课后答案docx

汇编语言程序设计(第二版)钱晓捷习题答案

第二章(Ol)

2.1

(1)AX=120Oh

(2)AX=0100h

(3)AX=4C2Ah

(4)AX=3412h

(5)AX=4C2Ah

(6)AX=7856h

(7)AX=65B7h

2.2

(1)两操作数类型不匹配

(2)IP指令指针禁止用户访问

(3)立即数不允许传给段寄存器

(4)段寄存器之间不允许传送

(5)两操作数类型不匹配⑹目的操作数应为[BP]

⑺源操作数应为[BX+DI]

(8)立即数不能作目的操作数

2.3

Ieabx,table;获取table的首地址,BX=200H

moval,8;传送欲转换的数字,AL=8

xlat;转换为格雷码,AL=12H

2.4

堆栈是一种按先进后出”原则存取数据的存储区域。

堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POPO

2.5

movax,8057h

PuShaxmovax,0f79h

movax,8057h

PUShaxmovax,0f79hPUShaxpopbxpop[bx]2.6

AL=89hCFZFAL=12h10

AL=Oafh00

AL=Oafh10

AL=00h01

AL=Offh00

AL=00h01

;bx=0f79h

;DS:

[0f79h]=8057h

SFOFPF011

101

101

001

101

001

2.7

W=X+Y+24-Z

 

2.8

(1)ADDDX,BX

(2)ADDAL,[BX+SI]

(3)ADD[BX+0B2H],CX

(4)ADDWoRDPTR[0520H],3412H

(5)ADDAL,0A0H

2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,D

movax,X;ax=A

imulY;dx,ax=A*B(将操作数看作符号数,以下同)

movcx,ax

movbx,dx;bx,ax<--dx,ax=A*B

movax,Z;ax=C

CWd;dx,ax=C(扩展符号后为双字)

addcx,ax

adcbx,dx;bx,cx<--bx,cx+dx,ax=A*B+C

Subcx,540

Sbbbx,0;bx,cx<--A*B+C-540

movax,V;ax=D

CWd;dx,ax=D(扩展符号后为双字)

SUbax,CX

Sbbdx,bx;dx,ax=dx,ax-bx,cx=D-(A*B+C-540)idivX;运算结果:

[D-(A*B+C-540h)]∕A;ax存商,dx存余数

2.10;

(1)XChg的操作数不能是立即数

(2不能对CS直接赋值

(3)两个操作数不能都是存储单元

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

(5)adc的操作数不能是段寄存器

(6)没有确定是字节还是字操作

(7)in不支持超过FFH的直接寻址

(8)OUt只能以AL/AX为源操作数

第二章(02)

2.11;

指令

AX的值CF

OF

SF

ZF

PF

Mov

ax,1407h

1470h

-

-

-

-

-

And

ax,ax

1470h

0

0

0

0

0

Or

ax,ax

1470h

0

0

0

0

0

Xor

ax,ax

0

0

0

0

1

1

Not

ax

Offffh

-

-

-

-

-

TeSt

ax,0f0f0h

Offffh

0

0

1

0

1

注意:

1.mov,not指令不影响标志位

第2章(03)

2.12;

指令

注释

执行结果CFOFSFZFPF

movsi,ax

si=ax

si=0008h-----

shlsi,1

si=2*ax

si=0010h00000

addsi,ax

si=3*ax

si=0018h00001

movdx,bx

dx=bx

dx=0010h-----

movcl,03h

cl=03h

shldx,cl

dx=8*bx

dx=0080h0U000

SUbdx,bx

dx=7*bx

dx=0070h00000

adddx,si

dx=7*bx+3*axdx=0088h00001

1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。

2.移位指令根据是否移入“倒CF,设置CF,根据移位后的结果影响SF,ZF,PF°根据最高符号位是否改变设置OF,如改变0F=1.

3.,U?

表示无定义,,-?

表示无影响。

2.13;

(1)

;不考虑进位movbl,al

movcl,3

shlal,cl

addal,bl;shlbl,1

addal,bl

;考虑进位XOrah,ah

movbx,ax

movcl,3

Shlax,cl

addax,bx;shlbx,1

addax,bx

数字O〜9的ASCII码是:

30h〜39h

非压缩BCD码的O〜9是:

Ooh〜09h

方法一:

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

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

方法二:

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

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

movcl,4

again:

Shrdx,1;实现逻辑右移

;采用“Sardx,1,则实现算术右移

rcrax,1

decCl

jnzagain

2.14;

(1)用Sar编写

2.20;8086的条件转移的转移范围:

在当前指令地址的+127——128之内。

如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移

到范围外的目标地址。

2.21;(I)JMPBX;转移的有效地址EA=BX=1256h

(2)JMPtABLE[Bx];转移的有效地址EA=[ds:

20a1h+1256h]=[232f7]=3280h

(3)JMP[Bx][si];转移的有效地址EA=[ds:

1256h+528fh]=264e5h=2450h

2.22;

(1)xorax,1e1eh

jeequal

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

(2)testal,10000001b

jnzthere

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

(3)CmPcx,64h

jbthere

;CX(无符号数)v64h

2.23;

movcx,0不循环,因为一进入循环就判cx=0?

如cx=0就退出循环

delay:

IOOPdelay

2.24;

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

CmPdx,di

jaabove;=jnbeabove

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

CmPax,si

jggreater;=jnlegreater

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

CmPcx,0jcxzzero

jzzero

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

CmPax,di

jooverflow

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

CmPsi,ax

CmPax,si

jleless_eq

jgeless_eq

(6)若DI≤Dx,转到below_eq执行。

CmPdi,dx

CmPdx,di

jbebelow_eq

jaebelow_eq

2.25;答:

将首地址为array得20个字的数组求和,并将结果存入total单元中

2.26;

(1)

movsi,0movdl,string[si]movsi,5

movdh,string[si]⑵

XOrsi,si

moval,buffer[si]incSi

movah,buffer[si]movcl,4shlah,cloral,ahmovdl,alincSi

moval,buffer[si]incSi

movah,buffer[si]movcl,4shlah,cloral,ah‘movdh,al

testdx,0f000hjzzeromovax,-1jmpdone

;第1个字符送dl寄存器

;第6个字符送dh寄存器

;Si清零

;第一字节

;第二字节

;BCD码移到高半字节

;组合成压缩BCD码

;存入dl寄..

;第三字节

;第四字节

BCD码移到高半字节组合成压缩BCD码

;存入dh寄..

zero:

movax,0

done:

ret

leabx,buffer1

leadx,buffer2

movcx,8;8个字节

xorsi,si;si=0

clc;CF=0

movax,0b800h

movds,ax;段地址

xorsi,si;地址偏移量si=0xordx,dx;和的高字dx=0movcx,99;加的次数

movax,[si];

第一个数

again:

incSi

;指向下一个字单兀

incSi

addax,[si];

加下一个数

jncnoc

;无进位转

incdx;

有进位dx=dx+1

noc:

decCX

;次数-1

jnzcx,again;

非0继续加

ret

movsi,offsetString

movcx,8000h

;32k=2^15=8000h

again:

CmP[si],?

$?

jnznext

mov[si],20h

;if[si]=?

$?

[si]<--?

?

next:

incSi

loopagain

xorsi,si

;SiV--O

movcx,100

;循环次数

again:

decarray[si]

decCX

jnzagain

(8)

xorsi,si;SiV--O

coun:

CmPString[si],?

$?

jedone

incSi

jmpCOun

done:

ret

2..27;⑴使CF=O:

clc;andax,ax;orax,ax

(2)使AX=O:

xorax,ax;andax,0;movax,0

(3)同时使AX=O和CF=0:

andax,0;xorax,ax;SUbax,ax2.29;压缩BCD码加法:

AX^AX+BX

出口参数:

AX=BCD码和

2.34;okmsgdb,OK?

,$?

errmsgdb,Error!

OVerflOW!

?

,$?

movax,XSUbax,Yjooverflowmovdx,offsetokmsgjmpnext

overflow:

movdx,errmsg

next:

movah,9

int21h

错误:

movax,X

Subax,Y

jooverflow

movdx,offsetokmsg

okmsgdb,OK?

,$?

movdx,errmsg;错误1:

数据定义在代码中

movah,9

int21h

overflow:

errmsgdb,Error!

OVerfIOW!

?

,$?

movdx,errmsg;错误2:

缺少JMP指令

movah,9

int21h

2.37;;xt237.asm

.modelsmall

.stack

.data

arraydb255

db0

array1db255dup('$')

array2dbOdh,Oah,'$'

.code

.startup

movah,0ah;键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;回车换行

movah,09h

int21h

movbx,offsetarray1

again:

moval,[bx]

CmPal,'$'

jzdone

CmPal,'a';小于a和大于Z的字符不是小写字母

jbnext

CmPal,'z'

janext

SUbal,20h;在a和Z之间的字符才是小写字母,转换为大写

mov[bx],al;保存到原位置

next:

incbx

jmpagain

done:

movdx,offsetarray1

movah,09h

int21h

.exitOend

第三章(01)

3.1;硬指令:

每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:

伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。

3.2;

3.5;1.编辑文本编辑程序汇编语言源程序.asm

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

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

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

3.6;;xt236.asm简化段定义格式

.modelsmall;定义程序的存储模式(小模式).stack;定义堆栈段(默认1024个字节).data;定义数据段

str1ab?

InPutNUmber:

0~9:

?

0dh,0ah,?

$?

str2ab?

Error!

?

0dh,0ah,?

$?

.cade;定义代码段

.startup;说明程序的起始点,建立ds,ss的内容

movah,09h;显示str1字符串

movdx,offsetstr1

;如Zf=0,无键按下,等待

;有键按下,键值与,0?

比较

如V,0?

出错处理

;有键按下,键值与,9?

比较

如〉,9?

出错处理

;调用DOS显示字符功能,显示该数字

int21h

.exit0;终止程序执行,返回DOS

error:

movah,09h;出错,调用DOS功能显示str2字符串movdx,offsetstr2

int21h

jmpgetkey;等待按键

end;汇编结束

3.7;;xt307.asm

StaCkSegment

dw512dup(?

StaCkends

dataSegment

arraydb255

db0

array1db255dup('$')

array2dbOdh,Oah,'$'

dataends

codeSegment'code'

assumecs:

code,ds:

data,ss:

StaCk

start:

movax,data

movds,ax

movah,0ah;键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;回车换行

movah,09h

int21h

movbx,offsetarray1

again:

moval,[bx]

CmPal,'$'

jzdone

CmPal,'a';小于a和大于Z的字符不是小写字母

jbnext

CmPal,'z'

janext

SUbal,20h;在a和Z之间的字符才是小写字母,转换为大写

mov[bx],al;保存到原位置

next:

incbx

jmpagain

done:

movdx,offsetarray1

movah,09h

int21h

movax,4c00h

int21h

codeends

endStart

3.9;

(1)movbytePtr[bx],1000;1000超出了一个字节范围

(2)movbx,offsetmyword[si];寄存器的值只有程序执行时才能确定,

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

;可以改为leabx,myword[si]

(3)CmPmybyte1,mybyte2;两个都是存储单元,指令不允许

(4)moval,mybyte1+mybyte2;变量值只有执行时才确定,汇编过程不能计

(5)Subal,myword

(6)jnzmyword址方式

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

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

3.10;前者为“与”操作硬指令助记符,可汇编成机器代码。

后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。

3.11;注:

对于逻辑运算,有关操作数可化为二进制数。

(1)moval,23hAND45hOR67h;67h

⑵movax,1234h∕16+1Oh;133h

(3)movax,NOT(65535XoR1234h);1234h

⑷moval,LOW1234hORHlGH5678h;76h

(5)movax,23hSHL4;0234h

⑹movax,1234hSHR6;0048h

(7)moval,'a'AND(NOTca'-'A));41h

(8)moval,'H'OR00100000b;68h

(9)movax,(76543LT32768)XOR7654h;7654h

3.12;假设block开始的数据块有32个字节数据:

16个正数+100(64h),16个负数-48(0doh)

分别连续分布:

block

db16dup(100),16dup(-48)

;也可以是任意字节数据,随

意分布。

dplus

db32dup(?

;为正数预留存储空间

dminus

db32dup(?

;为负数预留存储空间

count

equ32

;字节数

3.15;mydatasegSegment

my1bdb‘PerSonalCOmPUter'

my2bdb20

my3bdb14h;20h

my4bdb00010100b

my5wdw20dup(?

my6cequ100;my6c=100

my7cequ

mydatasegends3.18;段地址:

表示标号所在代码段的段地址;

偏移地址:

表示标号所在代码段的段内偏移地址;

类型:

引用该标号时,表示它所在同一个段一一near类型,还是另外一个段far类型。

3.19;mydataSegmentORGlO0h

VARWDWl234H5678H

VARBDB3,4

AGLlN4

VARDDD12345678H

EVEN

BUFFDB10DUP(?

MESSDB'HELLo

MOVAX,OFFSETVARB+OFFSETMESS;AX=4+16H=1AH

MOVAX,TYFETYPEBUFF+TYPEMESS+TYPEVARDX=1+1+4=06H

MOVAX,SIZEVARW+SIZEBUFF+SIZEME;SSX=4+10+5=19=13H

AX=2+1=03H

AX=10+4=14=0EH

AX=FF02H(近)

AX=1BH

MOVAX,LENGTHVARW+LENGTHVARD

MOVAX,LENGTHBUFF+SIZEVARW

MOVAX,TYPEBIGIN

MOVAX,OFFSETBEGIN

3.25;.modelsmall

.stack

.data

numequ5

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

.code

.startup

movbx,offsetdatalist

movcx,num

xorax,ax

again:

addax,[bx]

incbx

incbx

loopagain

mov[bx],ax

.exit0

end

3.26;StaCkSegmentPara‘StaCk

dw512dup(?

StaCkends

dataSegment

dwordarraydb100dup(?

dataends

codeSegment‘code'

assumecs:

code,ds:

data,es:

data,ss:

StaCk

Org100hstart:

movax,datamovds,axmoves,axmovdi,offsetarraymoval,64hmovcx,100cld

repstosbmovax,4c00hint21h

codeendsendStart

3.27;

解答

;xt327.asm

.modelsmall

.stack256;定义堆栈段大小为256个字节

.data

anUmdd11223344h;定义两个双字的数(随意)

bnUmdd77553311h

SUmdd?

;定义结果,执行后为:

88776655h

.code

.startup

xorsi,Si;相对于变量的位移量清零movcx,2;分高低字分别相加,共两次

clc;清零Cf

again:

movax,anum[si];取第一个数的一个字(先低字

后高字)

adcax,bnum[si];取第二个数的一个字(先低字后高字)

movsum[si],ax;存和的一个字(先低字后高字)incSi;修改位移量指向下一个字(加2)

incSi

loopagain;CX=CX-I,ifcx<>0,jumpagain

.exit0

end

3.28;.startup

xorsi,Si;位移量清零

moval,bdata[si];取第一个数

4.3;思路:

设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。

这里仅列出代码段:

movbl,al;将al中的两组分开

andal,Of

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

当前位置:首页 > 高等教育 > 军事

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

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