关于汇编语言的问题
- 格式:docx
- 大小:18.03 KB
- 文档页数:5
一、单项选择题(共20题)1.对于有符号的数来说,下列哪个值最大( D)A:0F8H B:11010011B C:82 D:123Q2.下列有关汇编语言中标号的命名规则中,错误的是(D )A:通常由字母打头的字符、数字串组成 B:标号长度不能超过31个字符C:?和$不能单独作为标号 D:.号不可位于标号首3.设A=0.4H,B=0.8H,C=0.4,D=0.4Q,它们之间的关系是(C )。
A.C+D=B B.A+D=BC.B=D D.A>C>D4.下列四个寄存器中,可作为十六位寄存器的是(C )A.DL B.CLC.BP D.EBX5.8088/8086存储器分段,每个段不超过( D)A.64K个字B. 32K个字节C.1兆个字节D.64K个字节6.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式( B)A:寄存器寻址B:相对基址变址寻址C:变址寻址D:基址变址寻址7.连接程序把汇编语言源程序生成的目标文件(.OBJ文件)转换成( B)。
A..OBJ文件B..EXE文件C..LST文件D..CRF文件8.在程序运行过程中,确定下一条指令的物理地址的计算表达式是( A)。
A. (CS)×16+(IP)B. (DS)×16+(DI)C. (SS)×16+(SP) D.(ES)×16+(SI)9.若AX= - 15要得到AX=15应执行的指令是(A )A.NEG AXB.NOT AXC.INC AXD.DEC AX10.8086/8088系统执行传送指令MOV时(A )A.不影响标志位B.影响DF方向标志C.影响SF符号标志D.影响CF进位标志11.执行下列程序后,(AL)=(D )H。
DATA SEGMENTTAB DB ‘0123456789’DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX, DATAMOV DS, AXMOV BX, OFFSET TABMOV AL, 04XLAT TAB…A.04 B.0400C.33 D.3412.下列指令中操作数在代码段中的是(A )。
汇编语言的编程步骤与调试方法汇编语言是一种底层的程序设计语言,直接操作计算机硬件。
在编写汇编语言程序时,需要经过一系列的编程步骤和调试方法,以确保程序的正确性和可靠性。
下面是关于汇编语言的编程步骤和调试方法的一些详细介绍。
一、编程步骤:1.定义程序目标:明确程序的功能、输入和输出。
2.设计算法和逻辑:将目标转化为汇编语言指令,设计算法和逻辑流程。
3.选择寄存器和指令:根据算法和逻辑需求,选择合适的寄存器和指令。
4.编写指令:根据算法和逻辑需求,使用正确的指令来编写汇编语言程序。
5.汇编编译:使用汇编编译器将汇编代码翻译成机器代码。
6.汇编连接:使用链接程序将机器代码和其他必要的文件(如库文件)连接成可执行文件。
7.调试和测试:进行调试和测试,确保程序的正确性和可靠性。
8.优化和改进:根据测试结果,对程序进行优化和改进。
二、调试方法:1.插入调试指令:在程序中插入一些特定的调试指令,可以输出一些关键的变量或标志位,以便观察程序的执行路径和结果。
2.单步执行:逐条执行程序代码,并观察每条指令的执行结果和影响,以及寄存器和存储器的变化情况。
3.观察寄存器和存储器:利用调试器观察程序执行过程中的寄存器和存储器的变化情况,以确定代码逻辑是否正确。
4.打印和日志输出:通过在程序中插入打印和日志输出的语句,可以观察关键变量和代码的执行情况,以帮助调试。
5.内存和寄存器状态检查:检查程序执行过程中的内存和寄存器状态,特别是对一些关键变量和标志位进行监视,以便发现问题所在。
6.脱机调试:将程序转储至仿真器或虚拟机,并在其中进行无风险的调试,以排查错误。
三、汇编程序调试常见问题及解决方法:1.程序崩溃或死循环:检查程序中循环和分支语句的逻辑判断条件是否正确,以及循环内的寄存器和内存操作是否正确。
2.内存访问错误:查看程序访问的内存地址和存储器的范围是否正确,并检查程序中的指针操作是否正确。
3.寄存器使用错误:检查程序中使用的寄存器是否正确选择和使用,尤其是在多个函数调用的情况下,需要注意寄存器的保存和恢复。
汇编语言程序设计实验小结本次汇编语言程序设计实验旨在通过实践,加深对汇编语言编程的理解和掌握,并通过编写和调试汇编程序,提升实际应用能力。
在本次实验中,我学到了许多关于汇编语言程序设计的知识和技巧,也遇到了一些挑战和问题。
以下是我对这次实验的小结。
在实验开始之前,我进行了充分的学习和准备。
通过阅读教材和参考资料,我了解了汇编语言的基本概念、指令集和编程规范。
同时,我还学习了调试工具的使用方法,以便在编写程序时能够进行实时调试,提高效率和准确性。
在实验过程中,我遇到了一些困难和挑战。
其中之一是理解和运用汇编语言的指令集。
由于汇编语言是一种低级语言,指令的数量和种类相对较多,需要深入了解每个指令的功能和使用方法。
为了解决这个问题,我通过查阅资料和请教老师,逐步掌握了常用指令的用法,并能够根据实际需求选择合适的指令进行编程。
另一个困难是调试程序时出现的错误。
由于汇编语言是一种底层语言,对程序员的要求较高,一旦出现错误,往往需要仔细检查每一步的操作和数据处理过程。
在实验中,我遇到了一些错误,例如指令书写错误、寄存器使用错误等。
为了解决这些问题,我采取了逐步调试的方法,通过观察变量的值、输出结果的正确性等来定位错误的位置,并逐步修改代码,最终成功解决了问题。
在实验过程中,我也发现了汇编语言编程的一些优点和特点。
首先,汇编语言可以直接访问底层硬件资源,使得程序的执行效率较高。
其次,汇编语言的灵活性较高,可以实现一些高级语言难以实现的功能。
例如,通过汇编语言编写的程序可以直接操作内存,实现对特定位置的数据读取和存储。
再次,汇编语言的指令集相对简单,易于学习和理解。
因此,掌握汇编语言编程对于深入理解计算机体系结构和底层工作原理非常有帮助。
通过本次实验,我不仅学到了汇编语言程序设计的知识和技巧,还培养了分析和解决问题的能力。
在以后的学习和工作中,我将继续学习和掌握汇编语言编程,将其应用于实际项目中,提高程序的性能和效率。
汇编语言试题题目一:寄存器及栈操作假设有一段汇编代码如下,请根据代码的功能回答相应的问题:push ebpmov ebp, espmov eax, dword ptr [ebp + 8]add eax, dword ptr [ebp + 12]pop ebpret1.以上汇编代码中,push ebp和pop ebp的作用分别是什么?2.mov ebp, esp的作用是什么?有什么作用范围?3.dword ptr是什么意思?4.请解释ret的作用。
解答:1.push ebp的作用是将ebp的值保存到栈中,而pop ebp的作用是将栈中的值弹出,并将其赋给ebp寄存器。
这是函数调用的常用操作,用来保存和恢复函数的堆栈帧。
12.mov ebp, esp的作用是将栈顶地址存入ebp寄存器中,以便在函数内部可以通过ebp寄存器来访问函数参数和局部变量。
作用范围是当前函数内部。
3.dword ptr是一个内存访问修饰符,用来指定要访问的内存单元的大小和类型。
在本题中,dword ptr指示要访问的内存单元是一个 32 位的双字(double word)。
4.ret指令用于函数返回,它将弹出栈顶的返回地址,并跳转到该地址执行,从而实现函数的返回。
题目二:条件分支和循环请完成以下汇编代码的功能描述,并回答相应问题:mov eax, 10mov ecx, 0loop:cmp eax, 0je endadd ecx, eaxdec eaxjmp loopend:1.请描述以上汇编代码的功能。
2.eax和ecx分别用来存储什么数据?请解释mov eax, 10和mov ecx,0的作用。
3.cmp eax, 0和je end的作用是什么?24.dec eax是什么意思?5.jmp loop的作用是什么?解答:1.以上汇编代码的功能是计算从 10 累加到 1 的结果,并将结果存储在ecx寄存器中。
2.eax用来存储循环计数器(初始值为 10),ecx用来存储累加结果。
在keil C语言与汇编语言的混合编程中曾经遇到过的一些问题,写下来留作以后参考。
(本文写于09.08.15,在8.18日加入了第4点的内容)2、Keil提示“asm/endasm”出错的解决方法asm和#pragma endasm包起来其中红色为C语言部分,绿色为嵌入的汇编语言部分。
汇编部分需要用#pragma }如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...解决方法如下:Target not createdsendata.c(87): error C272: 'asm/endasm' requires src-control to be active C语言代码……sendata.c(81):{#pragma asmvoid func()1C语言中加入汇编语言模块的方法:#pragma endasmMOV R6,#23例子:DJNZ R6,DELAY2RETDELAY1: DJNZ R7,DELAY1DELAY2: MOV R7,#191Project->Option for File‘……’中选择带有红色方框的选项首先左键单击包含有汇编部分的c语言文件名,然后在菜单栏中选择MODULE: STARTUP.obj (?C_STARTUP)SYMBOL: ?C_START*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNALADDRESS: 000DH*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL处理方法如下:在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
linking...3、?C_START等相关警告的处理按照2中的方法处理完之后,再编译不会出现错误信息了,但是会出现如下的警告信息:Group 'S ource Group 1' ”在如上图所示的“Source Group 1”上点右键,在菜单中选择“Add Files toDJNZ R6,DELAY2DELAY2 : MOV R7,#18RET#pragma endasm向COM1发送一个字符**********************************************MOV R6,#19asmIE|=0x90 ;TL1=0xE8 ;TR1=1 ;**************************************************delay()延时**********************************************/SendChar(uint8 byteToSend)return recvdata ;uint8 recvdata=8 ; //延时主程序int main()找到你的KEIL安装目录,选择其中的“C51”目录下的“LIB”目录下的UartInit();//串口初始化uint8 read_byte()***********************************************************/while(!TI);SBUF=byteToSend ;TI=0 ;/************************************************************* 读取一个字节TH1=0xE8 ;DELAY1 : DJNZ R7,DELAY1汇编程序块中常常会使用到51的通用寄存器,比如R0-R7。
汇编语言试题及参考答案汇编语言试题及参答案一、填空题1. ZF标志位是标志结果是否为零的,若结果,ZF为(),否则ZF为()。
当ZF 为1 时,SF 为()2. 标号可以有两种类型属性。
它们是()和()3.8 位无符号整数的表示范围为0--255 ,写成16 进制形式为(),8 位有符号整数的表示范围为-128--+127, 写成16 进制形式为()4. 伪指令DB,GROUP 和NAME 三个标号名字域必须有名字的是(),不得有名字的是(),可有可无名字的是()。
5. 循环程序通常由()()()和循环结果外理四部分构成6. 在数值不达式中,各种运算符可可混合使用,其优先次序规则*,/()于+,-;XOR ,OR()于AND,LT ()于GT7. 宏指令定义必须由伪指令()开始,伪指令()结束,两者之间的语句称为()8. 调用程序与子程序之间的参数传递方法有四种,即堆栈法()()()9. 分别用一条语句实现下述指明的功能( 1 )栈顶内容弹出送字变量AYW ()(2)双字变量AYD 存放的地址指针送ES 和SI()(3)变量AY2 类型属性送AH ()( 4 )不允许中断即关中断()(5)将字符串‘ HOW ARE YOU 存入变量AYB ()( 6 )子程序返回调用程序()(7)地址表达式AYY[4]的偏移地址送字变量ADDR()(8)AX 的内容加 1 ,要求不影响CF()(9)BX 的内容加1,要求影响所有标志位()(10)若操作结果为零转向短号GOON ()二、单选题1.IBM PC 微机中,有符号数是用()表示的1 .原码2.补码3.反码4.BCD 码2. 把汇编源程序变成代码程序的过程是()1 .编译2.汇编3.编辑4.链接三、己知:VAR1 ,VAR2 的类型属性分别为字和字节,标号LPFAR 的类型属性为FAR。
指出下列非法语句的错误原因1. POP CS ()2.INC [BX] ()3. MVL 8()4. JLE LPFAR()5. MOV DB,1800()6. MOV[DI],VAR17.SUB AX,VAR2()8.CMP SS AX()四、简答题1. 试述子程序的一般结构组成2. 标号有哪三个属性?其含义是什么?3. 试述CMP AX ,BX 和SUB AX ,BX 两条语句的异同点?五、阅读如下程序段,回答所提出的问题,假定X1,X2,...XN 为无符号数。
1.已知(AX)=1234H,执行下述三条指令后,(AX)=( D )MOV BX,AXNEG BXADD AX,BXA.1234H B.0EDCCH C.6DCCH D.0000H 2.写出完成下述功能的程序段:(1)传送25H到AL寄存器(2)将AL的内容乘以2(3)传送15H到BL寄存器(4)AL的内容乘以BL的内容并请写出最后(AX)=?答:(1)MOV AL, 25H(2)SHL AL, 1(3)MOV BL, 15H(4)MUL BL最后,(AX)=612H =1554一个有128个字的数据区,它的起始地址为12ABH:00ABH,请给出这个数据区最末一个字单元的物理地址是( c )A.12CSBH B.12B6BH C.12C59H D.12BFEH1、在实模式下,段地址和偏移地址为3017:000A的存储单元的物理地址是3017AH?如果段地址和偏移地址是3010:002A和3010:007A的存储单元的物理地址分别是3017AH 和3017AH选择题:循环指令loop again与(A)等价A dec cx;jnz againB inc cx;jnz againC mul cx;jnz againD add cx;jnz again2程序写出结果:mess db 'chengxujieguo''13''10''$'mov bx,offset messmov ax,10mov dl,3sub ax,1mul dladd bx,axmov cx,13a:mov dl,[bx]mov ah,02int 21hinc bxloop amov ah,2dhint 21hmov ah,2ahint 21h答案:chengxujieguo1.指令MOV AX,[BX+4000H]的寻址方式为(B)A 寄存器间接寻址 B、寄存器相对寻址 C、立即寻址 D、直接寻址2.试编写一程序段,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字节单元UP中,找出小于42H的无符号数的个数并存入字节单元DOWN中。
常见问题汇编以下是一些常见的问题汇编(FAQ):1. 什么是汇编?- 汇编语言是一种低级编程语言,用于与计算机硬件进行交互。
它将机器指令的文本表示与更易读和理解的符号表示相结合。
2. 汇编和高级编程语言有什么区别?- 汇编语言更接近计算机硬件和机器指令,而高级编程语言更抽象和易于理解。
汇编语言需要直接编写机器指令,而高级编程语言使用更高级的语法和抽象概念。
3. 汇编有哪些用途?- 汇编语言通常用于优化性能、操作硬件、编写底层驱动程序和编写嵌入式系统等方面。
它也常用于逆向工程和计算机安全领域。
4. 汇编语言有多种类型?- 是的,有多种不同的汇编语言,每种语言与特定的计算机架构相关。
一些常见的架构包括x86、ARM和MIPS。
5. 汇编语言有多难学?- 学习汇编语言可以是一项具有挑战性的任务,因为它涉及到理解底层硬件、机器指令和编程概念。
然而,学习汇编语言也可以提供对计算机运行方式的深入理解。
6. 如何开始学习汇编?- 要开始学习汇编语言,您可以阅读相关的教程和书籍,参与在线课程,或者尝试通过编写简单的程序来实践。
还可以使用汇编语言的集成开发环境(IDE)来编写、调试和运行汇编代码。
7. 是否有任何资源可以帮助我学习汇编?- 是的,有很多在线资源可供学习汇编语言,包括教程、书籍、视频教程和在线讨论论坛。
一些流行的汇编语言资源包括NASM和MASM官方文档。
8. 汇编语言在现代软件开发中还有用吗?- 汇编语言在现代软件开发中仍然有用,尤其是当需要进行底层优化或与硬件进行交互时。
然而,由于其复杂性和需要更多的时间和工作量,使用高级编程语言更常见。
简要回答一下关于汇编语言的问题:
(1)在汇编语言行格式中,symbol在指令前通常称为什么?在某些指示符前通常称为什么?
答:行格式中symbol通常是标号,在指令或伪指令前它总是标号,在某些指示符前它是表示变量或常量的符号。
(2)对某些伪指令,如何区分是ARM伪指令还是Thumb伪指令?答:相同的伪指令出现在程序中Thumb代码区,汇编器识别为Thumb 伪指令;出现在ARM代码区汇编器识别为ARM伪指令。
(3)符号与标号、标号与局部标号有哪些区别?
答:标号是一种符号,代表存储器中指令或数据的地址,在汇编期间通过计算,得到标号的地址。
局部标号用在指令中,指出分支的目标处。
它们不能用于数据。
(4)变量有哪几种类型?
答:数值;逻辑;串。
(5)举例说明如何从ARM指令分支到Thumb指令,如何从Thumb 指令分支到ARM指令,写一个完整的汇编程序。
答:ADR R1,Goto_THEMB+1 ADR R2,Back_ARM BX R1 BX R2 . .
. .
. .
CODE16 ALIGN
Goto_THUMB CODE32 . Back_ARM
. .
. .
(6)编写一个完整的程序,说明程序的结构。
答:AREA example,CODE,READONLY
ENTRY
Run1 MOV r1,#20
MOV r2,#15
SUB r1,r1,r2
;
Stop MOV r0,#0x18
LDR r1,=0x20026
SWI 0x123456
END
结构:定义区域的AREA指示符;声明汇编程序入口点的ENTRY指示符;应用程序执行;应用程序终止;源程序结束的END指示符。
(7)可以在代码区域定义数据吗?如果可以,举例说明如何定义,要注意些什么。
答:可以定义。
举例说明:
AREA test,CODE
Thumb_Code;code
;code
MOV pc,lr
Thumb_Data DATA
DCB 2,5,8
使用时,如果需要在Thumb代码区域用到某一个数据定义指示符,如DCD、DCB和DCW定义数据时,必须使用DATA指示符。
如果一个标号代表在Thumb代码区域的数据的地址,那么DATA指示符标记这个标号作为指针,指向在代码区域的数据。
也可以在ARM代码区域使用DATA指示符标记在代码中的数据,DATA在汇编时被忽略。
(8)如何将一段代码对齐到4字节边界?
答:为了获得4字节边界对齐,如果需要,DCD指示符在第一个定义的字前,会插入最多3字节作为填充字节。
(9)简述如何使用文字池。
答:由AREA指示符定义开始的诶个区域,在代码区域结尾处或汇编结尾处,即使不写出LTORG,汇编器也执行LTORG指示符。
使用LTORG 确认在LDR、LDFD和LDFS伪指令范围内,文字池被汇编。
打一次额的程序可能要求几个文字池。
放LTORG指示符应该在无条件分支或子程序返回指令之后,使处理器不会试图把常数当作指令去执行。
在文字池中,汇编器以字边界对齐数据。
(10)简述全局变量与局部变量的含义。
答:GBLA指示符声明并初始化一个全局算术变量,取值范围与数值
表达式相同。
GBLL指示符声明并初始化一个全局逻辑变量,取值范围为{TRUE}或{FALSE}。
GBLS指示符声明并初始化一个全局串变量,取值范围与串表达式相同。
使用时上述3种变量适用范围被限定在这些变量的源文件中。
可以使用SETA、SETL和SETS指示符分别为3种变量设定值。
也可以在汇编器命令行选项中设置全局变量。
LCLA、LCLL、LCLS用来定义局部变量。
使用时,上述3种变量被限制在含有它的宏内。
可以用SETA、SETL和SETS指示符分别为3种变量设定值。
(11)简述条件汇编的含义和用法。
答:IF指示符引入一个条件,由这个条件决定是否汇编指令和/或指示符代码1。
ELSE指示符标记指令和/或指示符代码2的开始,当IF 后的条件为假,则汇编指令和/或指令符代码2。
ENDIF指示符标记条件汇编结束。
汇编器根据条件决定是否汇编某一段代码。
(12)简述重复汇编的含义和用法。
答:WHILE指示符测试一个条件,由这个条件决定是否汇编指令和/或指示符代码。
WEND指示符表示指令和/指示符代码结束,由WHILE 再次测试条件,决定是否重复进行汇编,直到条件不成立。
在使用中,WHILE和WEND配对使用,对指令和/指示符重复汇编。
重复次数可以是0。
在WHILE…WEND内可以使用IF…ENDIF。
WHILE…WEND能被嵌套使用。
(13)简述宏定义、宏调用、宏扩展的含义和用法。
答:MACRO指示符标记一个宏定义的开始,MEND指示符标记这个宏定义的结束,而MEXIT指示符通知汇编器,从宏中退出。
使用时,在宏的内部,像$label、$parameter这些参数,能够像其他变量那样,以同样的方法是用。
每次宏调用时,都要给它们一个新的值。
参数必须使用$,用来与其他符号区别。
如果使用符号|作为变量,用于表示一个参数的默认值。
如果变量被省略,用空串替换。
(14)如何在一个被汇编的文件内包含另一个源文件或目标文件?答:INCLUDE指示符包含一个文件在正在被汇编的文件内,所包含的文件是源文件,也要被汇编,汇编后放在当前位置。
INCBIN指示符包含一个文件在正在被汇编的文件内,所包含的文件时目标文件或数据文件,不要汇编,放在当前位置。
(15)如何声明在其他文件定义的符号?
答:IMPOPT指示符提供给汇编器一个名字,声明这个名字不是在当前汇编程序中定义的。
在使用中,这个符号被看做是另一个文件定义的符号,它作为程序地址对待。
如果不指定[WEAK],并且在连接中没有对应的符号时,则连接器产生一个错误。
如果[WEAK]被指定,并且在连接时没有对应符号,则:如果在分支或分支并且连接指令中引用,符号的值变成引用指令的地址,指令变成B{pc}或BL{pc};其他情况下,符号的值为0。
程序员必须避免运行时执行B{pc}或BL{pc},因为这两条指令会导致循环无法终止。
为了访问没有定义的符号,可以使用以下代码,在运行时测试用户的环境。