当前位置:文档之家› 关于汇编语言的问题

关于汇编语言的问题

简要回答一下关于汇编语言的问题:
(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},因为这两条指令会导致循环无法终止。

为了访问没有定义的符号,可以使用以下代码,在运行时测试用户的环境。

相关主题