苏州大学汇编期末考试资料.docx

上传人:b****5 文档编号:7877031 上传时间:2023-01-26 格式:DOCX 页数:20 大小:593.95KB
下载 相关 举报
苏州大学汇编期末考试资料.docx_第1页
第1页 / 共20页
苏州大学汇编期末考试资料.docx_第2页
第2页 / 共20页
苏州大学汇编期末考试资料.docx_第3页
第3页 / 共20页
苏州大学汇编期末考试资料.docx_第4页
第4页 / 共20页
苏州大学汇编期末考试资料.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

苏州大学汇编期末考试资料.docx

《苏州大学汇编期末考试资料.docx》由会员分享,可在线阅读,更多相关《苏州大学汇编期末考试资料.docx(20页珍藏版)》请在冰豆网上搜索。

苏州大学汇编期末考试资料.docx

苏州大学汇编期末考试资料

选择题and填空题:

10分/10个||12分/12个

(1)MOV[SP],AX错:

栈指针不能作为存储器指针引用的寄存器;作为存储器指针和间接寻址的寄存器,80X86只有4个:

[BX]、[BP]、[SI]、[DI]。

(2)PUSHCS对

(3)POPCS错:

POP目的操作数可以是通用寄存器和段寄存器,但CS例外。

(4)MOV[BP],BX对

(5)ADDECX,[ESP]对

(6)JMPBX+100错:

不能有+100

(7)JMPCX对

(8)ADD[BX],BX对

(9)ANDAX,DS错:

段寄存器不能参与AND运算

(10)MOVAX,DS对,DS只能作为源操作数

(11)MUL16错:

操作源不能是立即数

(12)ADDAL,[SI+DI]错:

SI、DI不能组合

(13)SUB[BP+DI-1000],AL对

(14)ADDBH,[BL-3]错

(15)XCHG[BP],ES错:

ES不能作为源操作数

(16)XCHGAL,ES:

[BP]对

(17)LEADI,[BX+DI]对

(18)ROLCX,CL对

(19)ADDCX,CL错:

CL不能作为源操作数

(20)MOVAL,300错:

AL是8位,最多255

(21)SUBDL,CF错:

CF为进位标志,不能作为操作数

(22)SUB[SI],[DI]错:

不能同时为段寄存器

(23)MOVIP,AX错:

指针IP既不能作为源操作数,也不能作为目的操作数

求出以下各十六进制数与十六进制数62A0的和,并根据结果设置标志位SF、CF、ZF和OF。

(1)9D60

(2)4321(3)CFA0

答:

(1)、10000SF=0、CF=1、CF=1、OF=0

(2)、A5C1SF=1、CF=0、CF=0、OF=1

(3)、13240SF=0、CF=1、CF=0、OF=0

简答题:

25分/5个

1.冯洛伊曼体系结构特点

1)采用二进制数的形式表示数据和指令

2)将指令和数据存放在存储器中

3)计算机硬件由控制器,运算器,存储器,输入设备和输出设备5部分组成

2.简述计算机系统中复杂指令集和精简指令集的特点和用途

复杂指令集特点:

由于各条指令的复杂程度不同,分配的时钟周期各不相同,执行的指令所需的时间就不相同。

用途:

用于处理高精度的操作

精简指令集特点:

不管计算机的指令如何复杂都在一个计算机时钟周期内完成,计算速度快,指令集简单。

用途:

处理简单的操作

3.随着80X86技术的进步,汇编指令集做了哪些扩展,其作用是什么?

(1)浮点技术与指令解决CPU复杂度与总线等待的瓶颈

(2)MUX技术与指令解决在CPU在处理图像视频,3D图形、动画、音频、虚拟现实的信息量大的瓶颈

(3)SSE技术与指令解决互联网应用中数据量大、运算复杂的瓶颈

(4)强化多媒体指令

4.什么是寻址方式?

8088cpu系统有哪几种寻址方式?

5.请给出使标志CF清0的三种方法(用一条汇编指令实现)

XORBX,BX

ANDBX,0

ORDX,DX

6.请给出使寄存器AX清0的三种方法(用一条汇编指令实现)

MOVAX,0

XORAX,AX

SUBAX,AX

7.请给出使寄存器BX加1的是哪种方法(用一条汇编指令实现)

INCBX

ADDBX,1

LEABX,WORDPTR[BX+1]

8.阅读以下指令段,根据指令功能填写相应目标操作数的值。

MOVEBX,95201378H;EBX=95201378H

MOVEDX,-1;EDX=FFFFFFFFH

XCHGBX,DX;EBX=9530FFFFH;EDX=FFFF1378H

ANDEDX,EBX;EDX=95201378H

9.阅读以下指令段,根据指令功能填写相应目标操作数的值。

XOREAX,EAX;EAX=00000000H

MOVEDX,67892345H;EDX=67892345H

XCHGDL,DH;EDX=67894523H

SHRDX,6;DX=0114H

ANDECX,EAX;ECX=00000000H

10.阅读以下指令段,根据指令功能填写相应目标操作数的值

MOVEAX,43218756H;EAX=43218756H

ADDAH,AL;AX=EC65H

ROLEAX,8;EAX=21EC6543H

ORAH,AL;AH=67H

CMPEBX,EAX;EAX=21EC6743H

11.阅读以下指令段,根据指令功能填写相应目标操作数的值

MOVEAX,931F3579H;EAX=931F3579H

XOREDI,EDI;EDI=00000000H

XCHGDI,AX;EAX=931F0000H;EDI=00003679H

OREDI,EAX;EDI=931F3579H

12.请比较过程调用指令call与无条件转移指令JMP,说明它们异同

汇编语言中,JMP是无条件转移指令,CALL是子程序调用指令。

指令JMP、CALL的区别在于,JMP指令控制程序直接跳转到目标地址执行程序,程序总是顺序执行,指令本身无堆栈操作过程。

CALL指令跳转到指定目标地址执行子程序,执行完子程序后,会返回CALL指令的下一条指令处执行程序,执行CALL指令有堆栈操作过程。

13.比较宏指令,伪指令,指令三者的区别:

指令:

每一条指令都对应一种CPU操作。

伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。

宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。

伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。

和各种指令一样,伪指令也是程序设计不可缺少的工具。

宏是伪指令,宏的作用是把一个复杂的或者是不直观的语句或是组合用一个简单的、易记的形式表示,当编译器遇到源程序中的宏时,就把它定义的内容原封不动的copy过来。

如果程序中使用100次宏,这段代码就被复制100次。

因此,使用多次调用能使源程序变短,而不能使运行代码变短(子程序调用可以,但也增大系统开销)。

伪指令(PseudoInstruction)

不直接命令CPU去执行某一操作,而是告诉汇编程序如何生成目标代码。

它不对应CPU的任一操作码,而是对应一段服务子程序。

与指令的区别

指令---CPU识别,伪指令---汇编程序识别

指令---对应一个处理器操作,

伪指令---对应一段子程序(多个操作)

14.宏指令,宏定义的扩展:

阅读程序题:

10分/2个

注释+运行结果:

1.按15行*16列的列表形式显示ASCII码值为10H~FFH的所有字符,以行为主的顺序及ASCII码递增的次序依次显示对应的字符。

每16个字符为一行(16列),每行中相邻两个字符间用空格(20H)隔开。

START:

MOVAX,DATAS

MOVDS,AX

movah,02h

movdl,10h;设置初始输出为ASCII的10h

movbl,15;输出显示为15行

lop1:

movcx,16;设置循环次数,16,表示输出显示为16列

lop2:

int21h;显示输出

pushdx;将ASCII码为10h的元素推入堆栈

movah,02h

movdl,0

int21h

movah,02h

movdl,0

int21h;显示空白符(重复两次是因为有两个空格)

popdx;将栈顶元素推出

incdl;这时dx存取的是ASCII元素的下一个元素

looplop2;循环输出每行的16个ASCII元素

pushdx;将下一行的首元素推入堆栈

movah,02h

movdl,0dh

int21h

movah,02h

movdl,0ah

int21h;输出换行

popdx;将栈顶元素推出

decbl;行数减1

cmpbl,0;比较确定是否已经输出15行元素

jnelop1;若还未完成输出,则跳转至lop1,继续进行下一行元素的输出

jeexit;否则退出程序

exit:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

2.显示:

#########

#########

#########

START:

MOVAX,DATAS

MOVDS,AX

movDL,10h

movCX,3;行数初始值为3

lop1:

pushCX

movCX,9;先将cx设置为9(个数)

lop2:

movAH,02H

MOVDL,'#'

int21H;显示一个#

pushDX;将#压入堆栈

movDL,20H

movAH,02H

int21H;显示一个空格

popDX;出栈

looplop2

pushDX

movDL,0dH

movAH,02H

int21H

movDL,0aH

movAH,02H

int21H;空格回车

popDX

popCX;将cx的值又变回3

looplop1

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

 

*************#*#*#

******######*#*#*#

*************#*#*#

******######*#*#*#

*************#*#*#

3.显示正三角:

START:

MOVAX,DATAS

MOVDS,AX

movBL,1;设置行数的初始值

movBH,0;设置计数器的初始值

lop1:

movah,02

movdl,'*'

int21h

incBH;计数器加一

cmpBH,BL;比较行数和个数

JAElop2;若个数高于或者等于行数回车换行

looplop1;若个数小于行数继续输出*

lop2:

movah,02

movdl,0dh

int21h

movdl,0ah

int21h;回车换行

incBL;行数加一

movBH,0;计数器清零

CMPBL,5;比较行数是否超过5

JNAlop1;若不高于5则跳转回lop1

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

4.显示倒三角:

MOVAX,DATAS

MOVDS,AX

movBL,5;设置行数的初始值

movBH,0;设置计数器的初始值

lop1:

movah,02

movdl,'*'

int21h

incBH;计数器加一

cmpBH,BL;比较行数和个数

JAElop2;若个数高于或者等于行数回车换行

looplop1;若个数小于行数继续输出*

lop2:

movah,02

movdl,0dh

int21h

movdl,0ah

int21h;回车换行

decBL;行数减一

movBH,0;计数器清零

CMPBL,1;比较行数是否低于1

JAElop1;若高于或者等于1则跳转回lop1

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

5.

START:

MOVAX,DATAS

MOVDS,AX

movBX,0

lop1:

movcx,6

lop2:

movah,02

movdl,'*'

int21h

looplop2;显示6个*

movah,02

movdl,0dh

int21h

movdl,0ah

int21h;回车换行

INCBX;相当于一个计行器

CMPBX,5;比较行数

JAEnext;若是计行器bx大于或者等于5那么就跳过下一个循环结束

lop3:

movcx,6

lop4:

movah,02

movdl,'#'

int21h;显示6个#

looplop4

movah,02

movdl,0dh

int21h

movdl,0ah

int21h;回车换行

INCBX;相当于一个计行器

CMPBX,5;比较行数

JNAElop1;若小于5则继续跳转到lop1的循环

next:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

6.

START:

MOVAX,DATAS

MOVDS,AX

movBX,0

lop1:

movcx,6

lop2:

movah,02

movdl,'*'

int21h

movah,02

movdl,'#'

int21h;显示*#一次

looplop2

movah,02

movdl,0dh

int21h

movdl,0ah

int21h;回车换行

INCBX;相当于一个计行器

CMPBX,5;比较行数

JBlop1;若小于5则继续跳转到lop1的循环中

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

 

1.试分析下面的程序段完成什么功能?

(提示:

观察DX:

AX组成的双字的变化。

)  

 MOV  CL,04

    SHL    DX,CL

    MOV  BL,AH

    SHL    AX,CL

    SHR    BL,CL

    OR      DL,B

完成了DX:

AX双字的逻辑左移4位的操作。

2.假设X和X+2单元的内容为32位有符号数,Y和Y+2单元的内容为32位有符号数(X和Y为低位字),试说明下列程序段的功能。

    MOV  DX,X+2          CMP  AX,Y

    MOV  AX,X              JBE  L2

    ADD  AX,X        L1:

MOV  AX,1

    ADC  DX,X+2          JMP  SHORT  EXIT

    CMP  DX,Y+2      L2:

MOV  AX,2

    JL  L2              EXIT:

MOV  AH,4CH

    JG  L1                  INT  21H

比较X和x+2单元的有符号数的两倍与y和y+2单元的有符号数的大小

若前者大于后者,则将AX记为1,否则将ax记为2

编写程序题:

44分/4个

1.混合运算表达式:

计算如下表达式的值:

(W*X)/(Y+6)、、、、(W*X-3)/Y的指令段

假设X、Y、W均为16位带符号数,分别存放在名为XXX、YYY和WWW的变量存储单元中,表达式的结果将存放在名为DDD(商)和RRR(余数)的变量存储单元中。

2.C语言改编为汇编语言

设有如下所示的C++语言编写的函数,这个函数的功能是计算1到n的和。

为了较好地说明有关指令的应用,所以采用了一个循环,并安排了两个局部变量。

__fastcalltest25(intn)

{

intsum,i;

sum=0;

for(i=1;i<=n;i++)

sum+=i;

returnsum;

}

采用C++编译器,得到如下所示16位的目标代码。

其中,符号“SHORT”表示转移目标就在附近,相对转移时机器码中只要用一个字节表示差值。

MOVCX,AX;把存放在AX中的参数n存到CX中

XORBX,BX;使代表变量sum的BX为0(sum=0;)

MOVAX,1;使代表变量i的AX为1(i=1;)

JMPSHORTLAB114;无条件转移到标号LAB114处

LAB5:

ADDBX,AX;累加(sum+=i;)

INCAX;(i++)

LAB114:

CMPAX,CX;比较i和n

JLESHORTLAB5;当i<=n,则转移到LAB58处,继续

循环

MOVAX,BX;把返回值保存到AX中

RET;返回到调用者,这里代表函数test25结束返回

设有如下所示的C++语言编写的函数,试用80X86汇编语言编写与此相对应的程序段。

__fastcalltest24(intx,inty)

{

x=0;y=1;

while(y〈=10)

{y*=2;

x+=y;

}

returnx;

}

试用汇编语言编制程序段完成如下所示的C++语言编写的函数(设SUM参数保存在EAX中,i参数保存在ECX中):

C++语言编写的函数如下:

inttest11(void)

{

intsum,i;

sum=0;

for(i=0;i<=15;i+=2)

sum+=i+3;

returnsum;

}

用汇编语言编制程序段完成如下所示的C++语言编写的函数(设X参数保存在EAX中)

__fastcalltest24(intx)

{

if(x>=3)

x=x+1;

elseif(x<=-1)

x=x-1;

else

x=x;

returnx;

}

用汇编语言编制程序段完成如下所示的C++语言编写的函数(设X参数保存在EBX中)

__fastcalltest24(intx)

{

if(x<9)

x=x-3;

elseif(x>=15)

x=x;

else

x=x+3;

returnx;

}

子程序:

1)功  能:

把1位十六进制数转换为对应的ASCII码

;入口参数:

设欲转换的1位十六进制数在AL的低4位中

;出口参数:

转换得到的ASCII码在AL中

HTOASCPROC

ANDAL,0FH

ADDAL,30H

CMPAL,39H

JBEHTOASC1

ADDAL,7

HTOASC1:

RET

HTOASCENDP

2)功  能:

把把16位二进制数转换为4位十六进制数的ASCII码

     (4位十六进制数转换为4位对应的ASCII码)

;入口参数:

DX含欲转换的16位二进制数

;出口参数:

EBX含转换得到的4位十六进制数的ASCII码

HTASCSPROC

MOVECX,4

HTASCS1:

ROLDX,4;循环左移4位(二进制位)

MOVAL,DL;复制出低4位

CALLHTOASC;转换得ASCII码

ROLEBX,8

MOVBL,AL

LOOPHTASCS1;重复4次

RET

HTASCSENDP

3);子程序名:

UPTOLW

;功能:

把大写字母转换为小写字母

;入口参数:

AL=字符ASCII码

;出口参数:

AL=字符ASCII码

;说明:

如果字符是大写字母,则转换为小写字母,其他字符不变

UPTOLWPROC

PUSHF;保护各标志

CMPAL,'A'

JBUPTOLW1

CMPAL,'Z'

JAUPTOLW1

ADDAL,’a’-’A’

UPTOLW1:

POPF;恢复各标志

RET

UPTOLWENDP

4)功  能:

测量字符串的长度(设字符串以0结尾)

;入口参数:

待测字符串在BUFF中

;出口参数:

EAX=字符串长度

STRLENPROC

PUSHEBX

PUSHECX

LEAEBX,BUFF

XORECX,ECX

STRLEN1:

MOVAL,[EBX]

INCEBX

ORAL,AL

JZSTRLEN2

INCECX

JMPSTRLEN1

STRLEN2:

MOVEAX,ECX

POPECX

POPEBX

RET

STRLENENDP

;功  能:

测量字符串的长度(设字符串以0结尾)

;入口参数:

待测字符串在BUFF中

;出口参数:

EAX=字符串长度

STRLENPROC

PUSHEBX

LEAEBX,BUFF

STRLEN1:

MOVAL,[EBX]

INCEBX

ORAL,AL

JNZSTRLEN1

MOVEAX,EBX

LEAEBX,BUFF

SUBEAX,EBX

DECEAX

POPEBX

RET

STRLENENDP

功  能:

测量字符串的长度(设字符串以0结尾)

;入口参数:

EBX=待测字符串的首地址

;出口参数:

EAX=字符串长度

STRLENPROC

PUSHEBX

STRLEN1:

MOVAL,[EBX]

INCEBX

ORAL,AL

JNZSTRLEN1

MOVEAX,EBX

POPEBX

SUBEAX,EBX

DECEAX

RET

STRLENENDP

5)例7:

把16位无符号二进制数转换为5位十进制数的ASCII码串。

;入口参数:

AX=16位无符号二进制数

EBX=用于存放ASCII串的缓冲区开始地址

;出口参数:

算法:

采用循环除10的方法。

低位(个位)在右(高地址),

高位(万位)在左(低地址)的次序存放

BTOASC:

MOVESI,5

MOVCX,10

LAB1:

XORDX,DX

DIVCX

ADDDL,30H

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

当前位置:首页 > 高等教育 > 工学

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

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