计算机原理习题3(含答案)_第1页
计算机原理习题3(含答案)_第2页
计算机原理习题3(含答案)_第3页
计算机原理习题3(含答案)_第4页
计算机原理习题3(含答案)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

习题3:

1.编写程序段,将2个32位无符号数DAT1和DAT2相乘,结果保存在64位

无符号数Result中;

2.有2个4字节无符号数分别存放在扩展段2000H和3000H开始的单元中,

低位在前,高位在后,将两数相加,结果存放在数据段2000H开始的单元

中,请编写程序段完成以上功能;

3.8086系统中,请说明下列指令的源操作数的寻址方式是什么?

1)MOVAX,1234H

2)MOVAX,[1234H]

3)MOVAX,[BX]

4)MOVAX,1234H[BX+SI]

5)MOVSB

6)INAL,DX

4.请在下表中画出下列数据段以十六进制表示的各单元值(表格中每个单元表

示一个字节),并写出变量var1,var2,var3的偏移地址和ent的值。

dataSEGMENTpara—低地址

0030H

ORG30H

var1DB-2,'A',2dup('23')

var2DW-1

entEQU$-var1

var3DWvar2—

dataENDS

—高地址

5.以下程序实现将变量var进行var*10+600的操作,并将计算结果保存在变

量result中,当程序执行到地址M5的时候,请在以下表格中画出当前堆栈

指针的位置和堆栈里的内容(程序断点可以用标号,在堆栈中可用寄存器名

代表保存的内容,SS的内容不用指定,表格的每个单元表示一个字)。(6

分)

datasegment高地址

vardw1000

resultdd?

dataends

ssegsegmentstack

db100dup(?)

ssegends

低地址

codesegment

assumecs:code,ds:data,ss:ss_seg

mainprocfar

pushds

movax,0

pushax

movax,data

movds,ax

movax,var

M1:callCaculate

M2:dw10

M3:dw600

M4:leabx,result

mov[bx],ax

mov[bx+2],dx

ret

mainendp

Caculateproc

pushbp

movbp,sp

pushsi

pushbx

movbx,[bp+2]

movsi,cs:[bx]

mulsi

M5:addax,cs:2[bx]

adcdx,0

addbx,4

mov[bp+2],bx

popbx

popsi

popbp

ret

Caculateendp

codeends

endmain

6.问答题

1)若AL=81H,则执行指令CBW后AH的内容为多少?

2)若BL=BEH,执行下列指令序列,则每执行一步,BL和CF的值为多少?

SHLBL,1;BL=_—,CF=______

MOVCL,2

SHRBL,CL;BL=_—,CF=______

ORBL,80

SARBL,1;BL=_—,CF=______

RORBL,CL;BL=,CF=

INCCL

RCLBL,CLBL=,CF=

3)什么是短跳转、近跳转、远跳转?

4)若当前SP=1000H,CS=B000H,IP=0100H,且当前FLAG=2345H,

则执行指令INT21H以后,SP的值变为多少?堆栈段中6个存储单元

OFFFH、OFFEH、OFFDH、OFFCH.OFFBH、0FFAH的值分另1是多少?

7.请写出程序段实现下列功能

例如:从160H端口读取1个字节

MOVDX,160H

INAL,DX

1)将一个8位数20H写入到地址为20H的端口;

2)若AL=56H,BL=57H,将这两•个压缩格式BCD码相加并招结果

保存到存储单元[2000H]中;

3)求数据段偏移地址为1000H开始的一个字符串的长度,字符串以

ASCII码0为结束符,长度要求包括结束符;(提示:初始化AL=0

CX=0FFFFH,然后使用REPNZSCASB命令,最后根据CX的

值计算字符串长度)

8.请判断以下8086汇编指令是否正确,:正确则在指令前打J,错误则打X

01)MOVDS,1000H018)LEA[1000H],MSG

02)MOVDX,1000H019)LDSES,MSG

03)MOVIP,AX020)LESDX,MSG

04)MOV[1000H],[SI]021)ADDDS,1000H

05)PUSH[SI]022)ADCDX,[DI]

06)PUSHAL023)SUB[BX],1000H

07)PUSH200H024)SUB[BX+BP],1000H

08)POPCS025)IMUL100H

09)POPAX026)DIVwordptr100H[BP]

010)XCHGAX,DS027)ANDBP,1001H

011)XCHGAX,1000H[SI+DI]028)SHL[BX],1

012)INAX,[SI]029)RORAX,4

013)INBL,80H030)RCLwordptr[BX],CL

014)INAX,160H031)SARdwordptr[BX],CL

015)INAL,DX032)MOVSW

016)OUTAL,DX033)REPN2:SCASB

()17)OUT80H,AL034)RETI

习题3答案:

9.将2个32位无符号数DAT1和DAT2相乘,结果保存在64位无符号数中,

请编写程序段。

datasegmentpara

dat1dd12345678H

dat2dd9ABCDEF0H

resultdq0

dataends

ss_segsegmentparastack

dw100dup(0)

ss_segends

codesegmentpara

assumecs:code,ds:data,ss:ss_seg

mainprocfar

movax,data

movds,ax

leadi,dat1

leasi,dat2

leabx,result

movax,[si];取dat2的低16位

;dat1低*dat2低->{dx,ax}

mulwordptr[di]

mov[bx],ax;保存结果

mov[bx+2],dx

movax,[si];再次取dat2低16位

;dat1高*dat2低->{dx,ax}

mulwordptr[di+2]

add[bx+2],ax;保存结果

adc[bx+4],dx

adcwordptr[bx+6],0

movax,[si+2];Wdat2的高16位

;dat1低*dat2高->{dx,ax}

mulwordptr[di]

add[bx+2],ax

adc[bx+4],dx

adcwordptr[bx+6],0

movax,[si+2];再次取dat2的高16位

;dat1高*dat2高->{dx,ax}

mulwordptr[di+2]

add[bx+4],ax

adc[bx+6],dx

movax,4c00h

int21h

mainendp

codeends

endmain

X补充:将2个32位有符号数datal和data2相乘,结果保存在64位有符号

数中result中,请编写完整汇编语言程序。

datasegmentpara

dataldd0FFFF8000H

data2dd0FFFF8000H

resultdq0

dataends

ss_segsegmentparastack

dw100dup(O)

ss_segends

codesegmentpara

assumecs:code,ds:data,ss:ss_seg

mainprocfar

movax,data

movds,ax

leasi,data2;si->data2

leadi,datal;di->datal

leabx,result;bx>>result

testwordptr[si+2],8000h;判断data2是正数还是负数

jzmainl

movcl,1;cl=1,表明data2为负数

movax,0

movdx,0

subax,[si];求data2相反数

sbbdx,[si+2]

jmpmain2

mainl:

movcl,0;cl=0,表明data2为正数

movax,[si]

movdx,[si+2]

main2:

pushdx;data2绝对值入栈

pushax

testwordptr[di+2],8000h;判断datal是正数还是负数

jzmain3

movch,1;ch=1,表明datal为负数

movax,0

movdx,0

subax,[di];求datal相反数

sbbdx,[di+2]

jmpmain4

main3:

movch,0;ch=0,表明datal为正数

movax,[di]

movdx,[di+2]

main4:

pushdx;data1绝对值入栈

pushax

callmuI_u32;按32位无符号数相乘,得到相应结果

xorch,cl;ch为异或结果,若为o

恻datal*data2为正,否则为负

jzexit;结果若为正数,则直接返回

movax,0;否则对result求补

movdx,0

subax,[bx]

sbbdx,[bx+2]

mov[bx],ax

mov[bx+2],dx

movax,0

movdx,0

sbbax,[bx+4]

sbbdx,[bx+6]

mov[bx+4],ax

mov[bx+6],dx

exit:

movax,4cOOh

int21h

mainendp

;功能:实现两个32位无符号数相乘,利用堆栈传递参数

;输入参数:bx->result

;输出参数:result中存放乘积

mul_u32proc

pushibp

movbp,sp

movax,[bp+8];Wd2低16位

mulwordptr[bp+4];d1低16位*d2低16位->{dx,ax}

mov[bx],ax;保存结吴

mov[bx+2],dx

movax,[bp+8]

mulwordptr[bp+6];d1高16位*d2低16位->{dx,ax}

add[bx+2],ax;保存结昊

adc[bx+4],dx

adcwordptr[bx+6],0

movax,[bp+10];<d2高16位

mulwordptr[bp+4];d1低16位*d2高16位->{dx,ax}

add[bx+2],ax

adc[bx+4],dx

adcwordptr[bx+6],0

movax,[bp+10]

mulwordptr[bp+6];d1高16位*d2高16位->{dx,ax}

add[bx+4],ax

adc[bx+6],dx

popbp

ret8

mul_u32erdp

codeends

endmain

10.有2个4字节无符号数分别存放在扩展段2000H和3000H开始的单元中,

低位在前,高位在后,将两数相加,结果存放在数据段2000H开始的单元

中,请编写程序段完成以上功能;

MOVAX,wordptrES:[2000H]

ADDAX,wordptrES:[3000H]

MOV[2000H],AX

MOVAX,wordptrES:[2002H]

ADCAX,wordptrES:[3002H]

MOV[2002H],AX

11.8086系统中,请说明下列指令的源操作数的寻址方式是什么?

1)MOVAX,1234H立即数寻址

2)MOVAX,[1234H]直接寻址

3)MOVAX,[BX]寄存器间接寻址

4)MOVAX,1234H[BX+SI]相对基址变址寻址

5)MOVSB数据串寻址

6)INAL,DXI/O端口间接寻址

12.请在下表中画出下列数据段以十六进制表示的各单元值(表格中每个单元表

示一个字节),并写出变量var1,var2,var3的偏移地址和ent的值。

dataSEGMENTpara

0030HFEH

ORG30H

41H

var1DB-2,'A',2dup('23')32H

33H

var2DW-1

32H

entEOU$-var133H

FFH

FFH

36H

OOH

高地址

var3DWvar2

dataends

var1:0030Hvar2:0036Hvar3:0038Hent=8

13.以下程序实现将变量var进行var*10+600的操作,并将计算结果保存在变

量result中,当程序执行到地址M5的时候,请在以下表格中画出当前堆栈

指针的位置和堆栈里的内容(程序断点可以用标号,在堆栈中可用寄存器名

代表保存的内容,SS的内容不用指定,表格的每个单元表示一个字)。(6

分)

datasegment

vardw1000

resultdd?高地址

dataendsDS

0

ssegsegmentstack

M2

db100dup(?)BP

SI

ssegends

BX

codesegment

assumecs:code,ds:data,ss:ss_seg

低地址

mainprocfar

pushds

movax,0

pushax

movax,data

movds,ax

movax,var

M1:callCaculate

M2:dw10

M3:dw600

M4:leabx,result

mov[bx],ax

mov[bx+2],dx

ret

mainendp

Caculateproc

pushbp

movbp,sp

pushsi

pushbx

movbx,[bp+2]

movsi,cs:[bx]

mulsi

M5:addax,cs:2[bx]

adcdx,0

addbx,4

mov[bp+2],bx

popbx

popsi

popbp

ret

Caculateendp

codeends

endmain

14.问答题

1)若AL=81H,则执行指令CBW后AH的内容为多少?AH=OFFH

2)若BL=BEH,执行下列指令序列,则每执行一步,BL和CF的值为多少?

SHLBL,1;BL=7cH,CF=[

MOVCL,2

SHRBL,CL;BL=1FH,CF=0

ORBL,80

SARBL,1;BL=2FH,CF=1

RORBL,CL;BL=CBH,CF=1

INCCL

RCLBL,CL;BL=5FH,CF=0

3)什么是短跳转、近跳转、远跳转?

短跳转:段内直接跳转,偏移量为T28727

近跳转:段内直接跳转,偏移量为-32768~32767

远跳转:段间直接跳转

4)若当前SP=1000H,CS=B000H,IP=0100H,且当前FLAG=2345H,

则执行指令INT21H以后,SP的值变为多少?堆栈段中6个存储单元

OFFFH、OFFEH、OFFDH、0FFCH、OFFBH、0FFAH的值分别是多少?

SP=0FFAH,(0FFFH)=23H(0FFEH)=45H

(0FFDH)=BOH(0FFCH)=00H

(0FFBH)=01H(0FFAH)=00H

15.请写出程序段实现下列功能

例如:从160H端口读取1个字节

MOVDX,160H

INAL,DX

4)将一个8位数20H写入到地址为20H的端口;

MOVAL,20H

OUT20H,AL

5)若AL=56H,BL=57H,将这两个压缩格式BCD码相加并将结果

保存到存储单元[2000H]中;

ADDAL,BL

DAA

MOV[2000H],AL

6)求数据段偏移地址为1000H开始的一个字符串的长度,字符串以

ASCII码0为结束符,长度要求包括结束符;(提示:初始化AL=0

CX=0FFFFH,然后使用REP

温馨提示

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

评论

0/150

提交评论