苏州大学汇编期末考试资料文档格式.docx
《苏州大学汇编期末考试资料文档格式.docx》由会员分享,可在线阅读,更多相关《苏州大学汇编期末考试资料文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
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的元素推入堆栈
movdl,0
int21h
显示空白符(重复两次是因为有两个空格)
popdx;
将栈顶元素推出
incdl;
这时dx存取的是ASCII元素的下一个元素
looplop2;
循环输出每行的16个ASCII元素
将下一行的首元素推入堆栈
movdl,0dh
movdl,0ah
输出换行
decbl;
行数减1
cmpbl,0;
比较确定是否已经输出15行元素
jnelop1;
若还未完成输出,则跳转至lop1,继续进行下一行元素的输出
jeexit;
否则退出程序
exit:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2.显示:
#########
#########
MOVAX,DATAS
MOVDS,AX
movDL,10h
movCX,3;
行数初始值为3
pushCX
movCX,9;
先将cx设置为9(个数)
movAH,02H
MOVDL,'
#'
int21H;
显示一个#
pushDX;
将#压入堆栈
movDL,20H
movAH,02H
显示一个空格
popDX;
出栈
looplop2
pushDX
movDL,0dH
int21H
movDL,0aH
空格回车
popDX
popCX;
将cx的值又变回3
looplop1
*************#*#*#
******######*#*#*#
3.显示正三角:
movBL,1;
设置行数的初始值
movBH,0;
设置计数器的初始值
lop1:
movah,02
movdl,'
*'
incBH;
计数器加一
cmpBH,BL;
比较行数和个数
JAElop2;
若个数高于或者等于行数回车换行
looplop1;
若个数小于行数继续输出*
lop2:
movdl,0dh
movdl,0ah
回车换行
incBL;
行数加一
movBH,0;
计数器清零
CMPBL,5;
比较行数是否超过5
JNAlop1;
若不高于5则跳转回lop1
4.显示倒三角:
MOVAX,DATAS
movBL,5;
设置计数器的初始值
decBL;
行数减一
CMPBL,1;
比较行数是否低于1
JAElop1;
若高于或者等于1则跳转回lop1
5.
START:
movBX,0
movcx,6
显示6个*
INCBX;
相当于一个计行器
CMPBX,5;
比较行数
JAEnext;
若是计行器bx大于或者等于5那么就跳过下一个循环结束
lop3:
movcx,6
lop4:
显示6个#
looplop4
回车换行
JNAElop1;
若小于5则继续跳转到lop1的循环
next:
ENDSTART
6.
显示*#一次
looplop2
JBlop1;
若小于5则继续跳转到lop1的循环中
1.试分析下面的程序段完成什么功能?
(提示:
观察DX:
AX组成的双字的变化。
)
MOV
CL,04
SHL
DX,CL
MOV
BL,AH
AX,CL
SHR
BL,CL
OR
DL,B
完成了DX:
AX双字的逻辑左移4位的操作。
2.假设X和X+2单元的内容为32位有符号数,Y和Y+2单元的内容为32位有符号数(X和Y为低位字),试说明下列程序段的功能。
DX,X+2
CMP
AX,Y
AX,X
JBE
L2
ADD
AX,X
L1:
AX,1
ADC
DX,X+2
JMP
SHORT
EXIT
CMP
DX,Y+2
L2:
AX,2
JL
L2
EXIT:
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)
for(i=0;
=15;
i+=2)
sum+=i+3;
用汇编语言编制程序段完成如下所示的C++语言编写的函数(设X参数保存在EAX中)
__fastcalltest24(intx)
if(x>
=3)
x=x+1;
elseif(x<
=-1)
x=x-1;
else
x=x;
returnx;
用汇编语言编制程序段完成如下所示的C++语言编写的函数(设X参数保存在EBX中)
if(x<
9)
x=x-3;
elseif(x>
=15)
x=x;
x=x+3;
子程序:
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次
HTASCSENDP
3);
子程序名:
UPTOLW
功能:
把大写字母转换为小写字母
AL=字符ASCII码
说明:
如果字符是大写字母,则转换为小写字母,其他字符不变
UPTOLWPROC
PUSHF;
保护各标志
CMPAL,'
A'
JBUPTOLW1
Z'
JAUPTOLW1
ADDAL,’a’-’A’
UPTOLW1:
POPF;
恢复各标志
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
STRLENENDP
功 能:
JNZSTRLEN1
MOVEAX,EBX
SUBEAX,EBX
DECEAX
EBX=待测字符串的首地址
EAX=字符串长度
PUSHEBX
5)例7:
把16位无符号二进制数转换为5位十进制数的ASCII码串。
AX=16位无符号二进制数
EBX=用于存放ASCII串的缓冲区开始地址
无
算法:
采用循环除10的方法。
低位(个位)在右(高地址),
高位(万位)在左(低地址)的次序存放
BTOASC:
MOVESI,5
MOVCX,10
LAB1:
XORDX,DX
DIVCX
ADDDL,30H