微型计算机技术-陈慈发-微机原理-习题-详解_第1页
微型计算机技术-陈慈发-微机原理-习题-详解_第2页
微型计算机技术-陈慈发-微机原理-习题-详解_第3页
微型计算机技术-陈慈发-微机原理-习题-详解_第4页
微型计算机技术-陈慈发-微机原理-习题-详解_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章微型计算机概论

1.12以下十进制数对于的八位二进制补码是怎样表示的?

(1)102

[102]补=01100110B

(2)34

[34]补=00100010B

(3)96

[96]补=01100000B

(4)-100

[TOO]原=11100100B

[-100]反=10011011B

[TOO]补=10011100B

(5)-64

[-64]原=UOOOOOOB

[-64]反=10111111B

[-64]补=11000000B

(6)0

[0]补二00000000B

1.14为什么我们会用16进制表示数据?请将下列十进制数转换成对应的十六进制数。

(1)354=162H

(2)102=6611

(3)64=40H

(4)256=10011

(5)127=7FH

(6)32=20H

(7)135=87H

(8)67:43H

1.15现有如下十进制数,将其转换成对应的二进制数。

(1)34.5=10010.1B

(2)20.125=10100.001B

(3)17.12=10001.0001B

(4)100.4=1100100.01B

(5)50.05=110010.00001B

(6)19.3=10011.01B

1.16将下列十六进制数表示成二进制数。

(1)OFFH=11111111B

(2)3411=00110100B

(3)67H=01100111B

(4)4EH=01001110B

(5)90H=1001OOOOB

(6)4DH=010011O1B

(7)5AH=01011O1OB

1.17请写出以下补码表示的二进制数真值。

[X]补=1000000000000000B

X=-32768

[Y]补=1111111111111111B

[Y]反=1111111111111110B

[Y]原=1000000000000001B

Y=-l

[z]补=ommimiHUB

Z=32767

[W]#=llll000000000000B

[w]反=1110mimiHUB

[W]原=100100000000OOOOB

■'=-4096

[Q]补=010000000000OOOOB

Q=16384

[P]补=1000000000000001B

[P]反=100000000000OOOOB

[p]原=immimiHUB

P=-32767

1.20请判断以下八位二进制数补码运算是否会产生溢出,或者产生进位,为什么?

(1)-23+78

[-23]补+[78]补=£9H+4EH=(1)37H

无溢出,有进位

(2)-45-92

[-45]补+[-92]补=口3旭4H=(1)77H

有溢出,有进位

(3)89+30

[89]补+[30]补=59H+1EH=77H

无溢出,无进位

(4)78-52

[78]补+[-52]补=4EH+CCH=(1)1AH

无溢出,有进位

(5)83-(-30)

[83]补+[30]补=53H+1EH=71H

无溢出,无进位

(6)126-(-34)

[126]#+[34]补=7EH+22H=A0H

有溢出,无进位

(7)108+34

[108]补+[34]补=6CH+22H=8EH

有溢出,无进位

1.22设有X=80H,Y=79H,Z=88H,在下述情况下比较三个数的大小。

(1)三数均为无符号数

Y<X<Z

(2)三数均为有符号数(补码)

[X]补=10000000B

X=-10000000B(负数)

[Y]补=01111001B

Y=01111001B(正数)

[Z]补=10001000B

[Z]反=10000111B

[Z]原=11111000B

Z=-01111000B(负数)

X<Z<Y

(3)三数均为压缩BCD码

X=80

Y=79

Z=88

Y<X<Z

(4)三数均为有符号数(移码)

[X]移=10000000B

X=[X]移-01111111B=OOOO000IB(正数)

[Y]移=01111001B

Y=[Y]移-01111111B=-OOOO0110(负数)

[Z]移=10001000B

Z=[Z]移-01111111B=OOOO1001(正数)

Y<X<Z

第三章指令

3.2什么是机器码?什么是助记符?什么是操作码?什么是操作数?不同指令的机器码字

节数都相同吗?

3.3什么是寻址?什么是寻址方式?操作数可能在哪些地方?对应的操作数名称和寻址方

式名称分别是什么?

3.416位操作数在存储器中存放的规则是什么?什么叫“低对低、高对高”?

3.7指令中寻址存储器操作数使用物理地址还是逻辑地址?逻辑地址转换成物理地址的算

法是什么?在指令中要确定一个存储器操作数应该提供哪三种信息?

3.8写出存储器寻址方式中有效地址EA的通式。简单归纳段寄存器的默认规则。

解:3.2:机器码:它指的是将硬件序列号经过一系列加密、散列形成的一串序列号,即使

指令的二进制编码。

助记符:是便于人们记忆、并能描述指令功能和指令操作数的符号

操作码:组成机器指令的一部分用来说明指令的性质和功能。

操作数:用来说明操作的对象。可以是具体的数值、寄存器或存储器地址。

不同指令的机器码字节数不一样。

3.3:寻址:寻找操作数会操作数的地址

寻址方式:寻找操作数地址的方法即为寻址方式。

对应的操作数名称和寻址方式名称见下表:

操作数的位置操作数名称寻址方式名称

在指令中立即数立即寻址

在寄存器中寄存器操作数寄存器寻址

在存储器中存储器操作数存储器寻址

在I/O端口中I/O操作数I/O端口寻址

3.4:16位操作数在存储器中存放的规则是:低字节在低地址中,高字节在高地址中,即所

谓的低对低、高对高。

3.7指令中寻址存储器操作数使用的是逻辑地址。

逻辑地址转换成物理地址的算法是:段地址乂16+偏移地址=物理地址

在指令中要确定一个存储器操作数要提供三种信息:段地址、偏移地址和数据类型。

3.8存储器寻址方式中有效地址EA的通式:

EA=()基址+()地址+DISP偏移量

段寄存器的默认规则:如果有效地址的表达式中有基址寄存器BP则默认堆栈段SS,其他一

律默认数据段DS„

3.9设段寄存器DS=1000H,SS=2000H,ES=3000H,通用寄存器BX=4000H,BP=5000H,SI=6000H,

DI=70000H»在下列各指令中指出存储器操作数的寻址方式,求出有效地址EA、物理地址PA、

并分别用物理地址和逻辑地址说明指令执行结果。

(1)MOVCX,[2300H]

(2)MOVBYTEPTR[BX],8FH

(3)MOVDH,[BP+3000H]

(4)MOVES:[SI+1210H],AX

(5)MOV[BX+DI+50H],AX

(6)INCWORDPTR[BX+SI]

解:⑴MOVCX,[2300H]直接寻址;

数据段中偏移地址为2300H所对应的字送CX中。

有效地址EA=2300H,物理地址PA=DS*16+EA=10000H+2300H=12300H

执行结果:(12300H)-CL,(12301H)-CH

(2)MOVBYTEPTR[BX],8FH寄存器间接寻址;

立即数8FH,送入数据段偏移地址为BX所对应的字节中。

有效地址EA=BX=4000II,物理地址PA=DS*16+EA=10000II+4000H=14000H

执行结果:8FH-(14000H)

(3)MOVDH,[BP+3000H]基址寻址;

数据段中偏移地址为BP内容与3000H之和所对应的字节送至DH

有效地址EA=BP+30001l=8000II

物理地址PA=SS*16+EA=20000H+8000H=28000H

执行结果:(28000ID-DH

(4)MOVES:[SI+1210H],AX变址寻址;

AX内容送入数据段中偏移地址SI与1210H之和所对应的字中

有效地址EA=S1+1210H=6000H+1210H=721OH

物理地址PA=ES*16+EA=3000II*16+7210H=37210II

执行结果:AL^(3721OH),AH^(372UH)

(5)MOV[BX+DI+50H],AX基址变址寻址;

AX内容送入数据段中偏移地址为BX内容与DI内容及50H内容之和所对应的字节

有效地址EA=BX+DI+50H=4000H+70000H+50H=74050H

物理地址PA=DS*16+EA=1000II*16+74050H=84050H

执行结果:AL-(84050H)

(6)INCWORDPTR[BX+SI]基址变址寻址;

堆栈中偏移地址为BX内容与SI内容所对应的字加1

有效地址EA=BX+SI=4000H+6000H=A000H

物理地址PA=DS*16+EA=1000H*16+A000H=1AOOOH

执行结果:1A000H中存放的字的值加1

3.10分别说明指令MOVAX,2000H和指令MOVAX,[200011]以及指令MOVAX,BX和指令MOV

AX,[BX]的区别。

解:MOVAX,2000H将立即数2000H送入寄存器AX

MOVAX,[2000H]将数据段中偏移地址为2000H的数据送入AX;

MOVAX,BX将寄存器BX操作数传入AX

MOVAX,[BX]将数据段中偏移地址为BX的内容所对应的字送入AX

3.11指出下列指令中源操作数的寻址方式。

(1)MOVBL,0F9H

(2)ADD[BX],SI

(3)SUBCL,[400011]

(4)CMPDX,[SI]

(5)ANDAL,[BX+1]

(6)ORBP,[DI+21OOH]

(7)XORAX,[BP+SI]

(8)MOVCX,300

解:(1)MOVBL,0F9H立即寻址

(2)ADD[BX],SI寄存器寻址寻址

(3)SUBCL,[400011]直接寻址

(4)CMPDX,[SI]寄存器间接寻址

(5)ANDAL,[BX+1]基址寻址

(6)ORBP,[DI+21OOH]变址寻址

(7)XORAX,[BP+SI]基址变址寻址

(8)MOVCX,300立即寻址

3.12下列指令都是非法的,指出各指令错在哪里?

(1)MOVSI,AH

(2)MOV70H,BL

(3)MOVCX.F123I1

(4)MOV[BX],6AH

(5)MOVES,5000H

(6)MOV[DI],[3000H]

(7)MOVDS,SS

(8)MOVCS,AX

(9)MOVAL,[CX]

(10)MOV[BX+BP],DX

(11)MOVBI1,[SI+DI+2]

(12)PUSHAL

(13)LEAAX.BX

(14)LDSBL,[5100H]

(15)INAH,DX

(16)OUT288H,AL

(17)ADD[240011],1234H

(18)XOR[2500R],[BX+10H]

(19)INC[SI]

(20)MUL10

(21)IDIV[BP+DI+1300H]

(22)SALAL,2

解:(1)MOVSI,AH两个操作数字长不一致

(2)MOV70H,BL立即数不能做目的操作数

(3)MOVCX,F123H十六进制的数以字母打头时前必须补0

(4)MOV[BX],6AH两个操作数的字长不确定

(5)MOVES,500011立即数不能直接送段寄存器

(6)MOV[DI],[3000H]两个操作数不能存储器操作数

(7)MOVDS,SS段寄存器不可相互传送数据

(8)MOVCS,AXCS不能做目的操作数

(9)MOVAL,[CX]CX不能用作寄存器间接寻址

(10)MOV[BX+BP],DX存储器寻址方式中表示有效地址不能同时为两个基址寄存器

(11)MOVBH,[SI+DI+2]存储器寻址方式中表示有效地址不能同时为两个变址寄存器

(12)PUSHAL入栈出栈操作必须以字为单位,AL应为AX

(13)LEAAX,BXLEA指令中源操作数必须为存储器寻址方式应为[BX]

(14)LDSBL,[5100H]LDS指令中目的操作数必须为16位的通用寄存器

(15)INAH,DXIN指令中的目的操作数只能是AL或AX

(16)OUT288H,AL输入输出指令中端口地址应为16位,必须先送给DX;应为

MOVDX,288HOUTDX,AL

(17)ADD[2400H],1234H两个操作数的字长不确定

(18)XOR[2500R],[BX+1OH]两个操作数不能同时为内存操作数

(19)INC[SI]操作数的字长不确定

(20)MUL10MUL指令的操作数不能为立即数

(21)IDIV[BP+DI+1300H]操作数的字长不确定

(22)SALAL,2移位次数大于1时必须先送给CL

3.13将寄存器AH、BH、CH和数据段中偏移地址为2100H,210111,2102H的3个字节单元内

容都置数AOH,最后将寄存器DL的内容与偏移地址为2103H的字节单元内容互换。试编写

程序。

解:DEBUG-A

MOVAH,0A0

MOVBH,0A0

MOVCH,0A0

MOV[2100H],AH

MOV[2101H],BH

MOV[2102H],CH

XC1IGDL,[2103]

3.14设SP=2000H,AX=3000II,BX=5000H,执行以下3条指令后,问SP=?AX=?BX=?

PUSHAX

PUSHBX

POPAX

解:指令执行的结果应为SP=2000II-2II-2H+2n=lFFEH

AX=5000H,BX=5000H

3.15说明指令LEASI,[BX]与指令MOVSI,[BX]的区别。

解:LEASI,[BX]是地址传送指令,将BX的有效地址取至16位SI寄存器中。这里取的是操

作数的地址。

MOVSI,[BX]是寄存器间接寻址,数据段中偏移地址为BX内容所对应的字送SI中。取

的是操作数。

3.16下列程序执行完后,AX=?BX=?CX=?

MOVAX,1122H

MOVBX,334411

PUSHAX

POPCX

XCHGBX,CX

LEACX,[BX]

解:AX=1122HBX=1122HCX=1122H

3.17CPU分别执行下列各段程序后,写出各个执行结果的状态标志位OF,SF,ZF,AF,PF,

CF的值。

(1)MOVAL,7AH

ADDAL,53H

(2)MOVBL,OAFH

ADDBL,OEAH

(3)MOVCL,OFFI1

ADDCL,O1H

(4)MOVDL,4911

SUBDL,OCAH

解:⑴MOVAL,7AH

ADDAL,53H

74H+53H=01110100+01010011=11000111B

OF=1,SF=1,ZF=O,AF=O,PF=O,CF=O

(2)MOVBL,OAFH

ADDBL,OEAH

AFH+EAH=10101111+11101010=10011001B

0F=0,SF=1,ZF=O,AF=1,PF=1,CF=1

(3)MOVCL,OFFH

ADDCL,01H

FFH+O1H=11111111+00000001=00000000B

0F=0,SF=O,ZF=1,AF=1,PF=1,CF=1

(4)MOVDL,49H

SUBDL,OCAH

49H-CAH=01001001-11001010=01111111B

0F=0,SF=O,ZF=O,AF=1,PF=1,CF=1

3.18有两个32位的二进制数,分别存放在两个16为寄存器CX:DX和两个16位寄存器SI:

DI中,求两数之和,并将和放在两个16位寄存器AXBX中,即AX:BXCX:DX+SLDI。

试编写程序。

解:《设两个32位数分别为1234567823456789

DEBUG

-A

MOVCX=1234

MOVDX=5678

MOVDI=6789

MOVSI=2345

ADDDX,DI

ADCCX,SI

MOVBX,DX

MOVAX,CX

3.21分别说明下面两条乘法指令中被乘数、乘数、积所在的位置。

(1)MULBL

(2)IMULBX

解:(1)被乘数在AL中,乘数在指令中给出的8位操作数BL中,乘积在AX中。

(2)被乘数在AX中,乘数在指令中给出的16位操作数BX中,乘积在AX中。

3.22若AL=86H,BL=22H,分别执行指令MUL和IMUL后,其结果是多少?OF二?CF=?

解:AL=86H执行MUL指令后OF=1、CF=1

执行IMUL指令后OF=1>CF=1

BL二22H执行MUL指令后OF=1、CF=1

执行IMUL指令后0F=0、CF=O

3.23分别说明下面两条除法指令中被除数、除数、商、余数所在的位置。

(1)DIVCX

(2)IDIVCL

解:(1)AX内容除以16位操作数CX结果的商放入AX余数放入DX中。

(2)AX内容除以8位操作数CL结果的商放入AL余数放入AH中。

3.24分别写出CPU执行下面两程序后,寄存器DX=?AX=?

(1)MOVAL,7FII

CBW

CWD

(2)MOVAL,80H

CBW

CWD

解:⑴DX=0000AX=007F

(2)DX=OOOOAX=FF80

3.25分别写出CPU执行下面两段程序后,寄存器AL二?标志CF=?

(1)MOVAL,36H

ADDAL,58H

DAA

(2)MOVAL,49H

ADDAL,87H

DAA

解:(1)36H+58H=8EH,由于低4位大于9,需要修正,AL=8EH+6H=94H寄存器AL=94H标志

寄存器CF=O

(2)49H+87H=D0H,AF=1,由于高4位大于9,需要修正,AL=D0H+66H=36H,CF=1

3.26设AX和CX中存放着两个4位的压缩型BCD码,求两数之和,并将和放在AX中。试编

写程序。

解:ADDAL,BL

DAA

MOVCL,AL

MOVAL,AH

ADCAL,BH

DAA

MOVAH,AL

MOVAL,CL

3.27分别写出CPU执行下面两段程序后,寄存器AX=?标志CF二?

(1)MOVAX,O138H

ADDAL,35H

AAA

(2)MOVAX,0533H

ADDAL,34H

AAA

解:(1)AX=0230H,CF=1

(2)AX=0507H,CF=O

3.28下列程序执行完后,AX=?CF二?

MOVAX,3649H

ADDAL,AH

DAA

CBW

INCAH

ADCAL,17H

AAA

解:AX=0102H,CF=1

3.29有如下程序段

MOVAL,45H

ADDAL,71H

DAA

MOVBL,AL

ADCAL,19H

DAA

MOVBH,AL

问,执行完此程序后,BX=3616,标志位PF=1,CF=0.

3.30分别只使用一条指令实现下述各功能。

(1)使AL的低四位清0,高四位不变;

(2)使DI的高10位清0,低6位不变;

(3)使BL的低4位置1,高四位不变;

(4)使SI的高2位置1,低14位不变;

(5)使CL中的D2、D3、D4、D5、D6位取反,DO、DI、D7位不变;

(6)使BP的高4位取反,低12位不变。

解:(1)ANDAL,OFOH

(2)ANDDI,003FH

(3)ORBL,OFH

(4)ORSI,OCOOOH

(5)XORCL,7CH

(6)XORBP,OFOOOH

3.31编写程序实现:使寄存器SI的高5位置1,低5位清0,中间6位取反。

解:ORSI,0F800H

ANDSI,OFFEOI1

XORSI,07E0H

3.32写出用一条指令使AX清0的一些指令。

解:MOVAX,0

XORAX,AX

SUBAX,AX

ANDAX,0

3.34用最少的指令实现下述功能。

(1)使AL的低4位移到高4位,低4位清0;

(2)使AU的高4位移到低4位,高4位清0.

解:⑴MOVCL,4

SULAL,CL

(2)MOVCL,4

SHRAL,CL

3.35用移位指令实现如下功能。

(1)将CL中的无符号数乘2;

(2)将BX中的带符号数除以4;

(3)将DX中的无符号数除以8.

解:(1)SARCL,1

(2)MOVCL,2

SARBX,CL

(3)MOVCL,4

SHRDX,4

3.37编程实现如下功能。

(1)将AL的低6位移到高6位,高2位移到低2位;

(2)将BL的高6位移到低6位,低2位移到高2位;

(3)将BH的高4位与低4位变换;

(4)将BP的高8位与低8位变换。

解:(1)MOVCL,2

ROLAL,CL

(2)MOVCL,2

RORBL,CL

(3)MOVCL,4

RORBH,CL

(4)MOVCL,8

RORBP,CL

3.39设AX=123仙,CX=9602H,下列程序执行完后,AL=?

ANDAL,AH

SHLAL,CL

ORAL,CH

SARAL,XL

XORAL,CL

RCLAL,

解:ANDAL,AHAL=10H

SHLAL,CLCL=40H

ORAL,CHAL=0D6H

SARAL,XLAL=0F5H

XORAL,CLAL=0F7II

RCLAL,AL-OEE

最后结果:AL=OEEH

3.52比较AX和BX中两个无符号数的大小,若AX>BX,则将SI中的高8位和低8位交换;

若AX二BX,则将SI中的高7位置1;若AXVBX,则将SI中的带符号数除以2。试编写程序。

CODESEGMENT

ASSUMECS:CODE

START:CMPAX,BX

JZAl;若AX=BX,转移到Al

JBA2;若AX〈BX,转移到A2

MOVCL,8;交换SI中高8位和低8位

ROLSI,CL

JMPNEXT

Al:ORSI,OFEOOH;将SI中的高7位置1

JMPNEXT

A2:MOVCX,2;将SI中的带符号数除以2

MOVAX,SI;将被除数送给DX:AX

MOVDX,0

IDP/ex

MOVSI,AX;将所求结果送回$1

NEXT:MOVAll,4CH

INT21H

CODEENDS

ENDSTART

3.53在以DS:3301H为首地址的存储单元中,连续存放了50个无符号的字节数据,要求在

其中找出最小值,并将它放在地址为DS:3300H的字节单元中。试编写程序。

CODESEGMENT

ASSUMECS:CODE

START:MOVSI,3301H;将首地址送给$1,用SI可以间接访问数组中的元素

MOVAL,[SI];将第一个数送给AL

MOVCX,49;50个数比较49次

CYCLE:INCSI;让SI指向下一个数

CMPAL,[SI]

JBENEXT;AL<=[SI],则判断下一个数

MOVAL,[SI];AL>[SI],则用[S1]取代AL

NEXT:LOOPCYCLE

MOVDS:[3300H],AL;编译器会认为[3300H]就是3300H,故在前面加DS:

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3.58编写将内存以ES:1000H开始的256个字节单元清零的程序。

CODESEGMENT

ASSUMECS:CODE

START:MOVSI,1000H

MOVCX,256

CYCLE:MOV[SI],BYTEPTR0

INCSI

LOOPCYCLE

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

用串操作指令实现:

CODESEGMENT

ASSUMECS:CODE

START:MOVDI,1000H;给目的串首地址赋初值

MOVAL,0;用0来初始化

MOVCX,256;循环256次

CLD;地址从小到大变化

REPSTOSB;用AL中的值对指定的目的串初始化

MOVAll,4CH

INT21H

CODEENDS

ENDSTART

3.59试编写程序,统计以DS:8000H为起始地址的连续200个字节单元中的0的个数。

CODESEGMENT

ASSUMECS:CODE

START:MOVAX,0;用AX统计0的个数

MOVCX,200;循环200次

MOVSL8000H;通过SI间接访问内存DS:800011开始的存储单元

CYCLE:CMPBYTEPTR[SI],0

JNZNEXT

INCAX

NEXT:INCSI

LOOPCYCLE

MOVAH,4CII

INT21H

CODEENDS

EM)START

第四章汇编

4.5程序中数据定义如下:

DATA1DW?

DATA2DB32DUP(?)

DATA3DD?

DLENGTHEQU$-DATAl

试问DLENGTH的值是多少?

DLENGTH=38

4.6在某程序中需要为一个变量BUF预留500个字节的存储空间,请写出相应的指令,如果

要预留500个字的存储空间呢?

BUFDB500DUP(?)

BUFDW500DUP(?)

4.7程序中数据定义如下:

BUFFERBDB'ABCDEF'

RESULTDB?

BUFFERWDW30DUP(?)

写出以下指令的执行结果:

MOVAX,TYPERESULT;AX=1

MOVBX,TYPEBUFFERW;BX=2

MOVCX,LENGTHBUFFERB;CX=1

MOVDX,LENGTHBUFFERW;DX=30

MOVAX,SIZERESULT;AX=1

MOVBX,SIZEBUFFERW;BX=60

4.11设BX=1103H,则执行下列指令后AX和CX各为多少?若BX=03H,则结果又如何?

MOVAX,BXANDOFFH

MOVCX,BXEQ1103H

BX=1103H

AX=0003H,CX=OFFFFH

BX=03H

AX=0003H,CX=O

4.13两个ASCH码数串定义如下:

STR1DB'352678’

STR2DB‘123400’

编写程序段,计算STR1+STR2,要求结果仍然是ASCH码串。

DATASEGMENT

STR1DB'352678,

STR2DB'123400'

STRDB6DUP(?)

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA

START:MOVAX,DATA

MOVDS,AX

LEASI,STRl+5;$1指向指RI的最后一个元素

LEADLSTR2+5;DI指向STR2的最后一个元素

LEABX,STR+5;BX指向STR的最后一个元素

MOVCX,6;循环6次

CLC;初始认为最低位没有进位

CYCLE:MOVAL,[SI]

MOVAH,[DI]

ADCAL,AH;将对应的两个ASCH码相加

AAA修正,仅仅取运算结果的低4位

RCRDX,1;保护进位标志

ORAL,30H;将所有的数值转换为对应的ASCII码

SHLDX,1;恢复进位标志

MOV[BX],AL;将所求的ASCII码送给STR的相应元素

DECSI;SI指向前一个数

DECDI

DECBX

LOOfCYCLE

MOVAll,4CH

INT21H

CODEENDS

ENDSTART

4.14下面程序段是实现从键盘输入10个一位十进制数累加。最后累加和以非压缩BCD码形

式存放在AH(高位)和AL(低位)中。试把程序段中所空缺的指令填上。

XORBX,BX

MOVCX,10

LOP:MOVAH,01H;键盘字符输入

INT21H

SUBAL,30H

MOVDL,AL

MOVAX,BX

ADDAL,DL

AAA

MOVBX,AX

LOOPLOP

4.18将内存中某数据块的正数和负数分开,并分别将这些正数和负数送同一数据段的两个

缓冲区中,并在屏幕上显示正数和负数的个数。

DATASEGMENT

BUFDB12,15,-2,3,-7,-8,19,-25

N=$-BUF

BUF]DBNDUP(?);存放正数

BUF2DBNDUP(?);存放负数

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DSDATA

START:MOVAX,DATA

MOVDS,AX

LEABX,BlJF;BX指向BUF

LEASI,BUF1;SI指向存放正数的缓冲区BUF1

LEADI,BUF2;01指向存放负数的缓冲区BUF2

MOVCX,N;循环N次

MOVDX,0;DH表示负数的个数,DL表示正数的个数,都清零

CYCLE:MOVAL,[BX];将!^指向的数送给AL

CMPAL,0;比较AL与0的大小

JGGREAT;AL>0,则转移至GREAT

MOV[DI],AL;AL<=0,将AL存入负数的数组

INCDll;负数的个数加1

INCDI;D1指向下一个负数

JMPNEXT

GREAT:MOV[SI],AL:AL>0,将AL存入正数的数组

INCDL;正数的个数加1

INCSI;SI指向下一个负数

NEXT:INCBX;判断下一个数

LOOPCYCLE

ADDDL,30H;将正数的个数变成字符输出

MOVAH,2

INT2111

ADDDH,30H;将负数的个数变成字符输出

MOVDL,Dll

MOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论