汇编语言
汇编语言编程——更上一层
-
汇编语言属于低级语言。高级语言通常是“ISA无关的”,而低级语言则是“ISA相关的”。对于特定的ISA,通常只存在一种对应的汇编语言
-
汇编语言保留了和机器语言同样的细节控制能力。但我们采用的是“助记符”(mnemonic)方式来表示操作码,而内存地址则被类似SUM、PRODUCT之类的“符号名”(symbolic name)所替代
一个汇编程序
指令
-
汇编语言指令的格式包括4个部分
-
LABEL
-
OPCODE
-
OPERANDS
-
;COMMENTS
-
-
操作码和操作数(OPCODE和OPERAND)
-
一个指令必须有操作码(做什么事)及操作数(被操作的对象)
-
操作数的数目取决于具体的操作
-
立即数的标识符代表了该数值的基
-
"#":代表十进制
-
"x":代表十六进制
-
"b":代表二进制
-
-
-
标号(label)
-
标号是指向内存单元的一个符号名,它可以在程序中直接引用。
-
一个标号可以包含1~20个字符,首字符必须是字母
-
显示访问内存单元的情况有两种
-
该单元的内容是指令,该单元地址是跳转指令的目标
-
该单元的内容是load或store指令访问的数值
-
-
如果一个内存单元从来不会被程序引用,则没有必要为其做标号
-
-
注释(comment)
-
程序中被;隔开,分号之后内容被忽略
-
注释的目的是方便程序的阅读
-
注释的另一个目的是使程序更加直观,易于理解,将程序的各个代码片段分割开来
-
伪操作
-
不代表程序中的任何操作,伪操作可以理解为是程序员传递给汇编器的消息,用于指导汇编器的汇编操作。
-
LC-3汇编器具有5中伪操作
-
.ORIG
-
.FILL
-
.BLKW
-
.STRINGZ
-
.END
-
-
.ORIG
-
ORIG告诉汇编器将LC-3程序放在内存的什么位置
-
-
.FILL
-
.FILL告诉汇编器开始(占用)下一个地址,并填充初始值
-
-
.BLKW
-
.BLKW告诉汇编器在程序空间中,开始占用一连串的地址空间。具体的占用数目由.BLKW伪操作的操作数决定
-
.BLKW特别适用于操作数值不确定的场合。如,内存中某个单元是用来存放键盘输入值的,而键盘输入直到程序运行时才知道,那么它所占用的空间就可以事先通过.BLKW来申请占用
-
-
.STRINGZ
-
.STRINGZ告诉汇编器连续占用并初始化n+1个内存单元,其参数是双引号括起来的n个字符。n+1个内存单元的前n个字的内容分别是字符串对应字符的ASCII码的零扩展值,内存最后的一个字被初始化为0
-
-
.END
-
.END告诉汇编器程序结束了,出现在.END之后的任何字符都将被汇编器丢弃
-
-
例子:字符数统计程序
-
从键盘读入一个字符,并统计一个文件中该字符出现的次数
;Initialization
.ORIG x3000
AND R2,R2,#0 ;R2 is counter
LD R3,PTR ;R3 is pointer to character
TRAP x23 ;R0 gets character input
LDR R1,R3,#0 ;R1 gets the next character
;
;Test character for end of file
;
TEST ADD R4,R1,#-4 ;Test for EOT
BRz OUTPUT
;
;Test character for match
;
NOT R1,R1
ADD R1,R1,R0
NOT R1,R1
BRnp GETCHAR
ADD R2,R2,#1
;
;Get next charcater from the file
;
GETCHAR ADD R3,R3,#1
LDR R1,R3,#0
BRnzp TEST
;
;Output the count
;
OUTPUT LD R0,ASCII
ADD R0,R0,R2
TRAP x21
TRAP x25
;
;Storage for pointer and ASCII template
;
ASCII .FILL x0030
PTR .FILL x4000
.END
汇编过程
概述
-
一个LC-3汇编程序不能直接执行,它必须被翻译成机器语言代码,才能被机器识别并执行。所谓机器语言代码或程序,即每条指令都是LC-3 ISA格式的。翻译任务由汇编器完成
两遍扫描
-
汇编语言====>机器语言
-
所有符号与地址之间的映射关系,称为"符号表"
-
第1遍负责符号表的构建
-
第2遍负责将所有汇编指令翻译成对应的机器指令
第1遍:创建符号表
-
符号表并不复杂,表项的生成方法是在第1遍扫描过程中,为每条指令以及每个标识顺序分配地址,并记录标识或符号及其所对应的地址。
-
首先,丢弃前面多余注释
-
之后,最先遇到的应该是一个.ORIG伪操作,意味着之后将出现该程序的第一条指令,且对应的分配地址如ORIG参数所示。采用一个地址跟踪计数器LC(Location Counter),LC的初始值由.ORIG指定
-
每成功识别一条有效指令,LC增量。若存在标识,则为该标识创建符号表项
-
继续识别下一行指令,直到.END
-
第2遍:生成机器语言程序
-
仍再次扫描整个程序
-
丢弃注释
-
LC初始化为x3000
-
随后,汇编器逐条指令生成机器指令,直至.END
-
相关知识
可执行映像
-
执行实体(entity)又称作“可执行映像”(executable image)。可执行映像通常由多个相互独立的模块组装在一起,而这些模块通常又是由不同的程序员分别编写。
-
所有这些模块在组装之前,是一个个独立的目标文件,最后是通过链接操作将这些目标拼装成一个可执行影响的。程序执行时,每条指令又被细分为FETCH、DECODE、...等指令周期
多目标文件
-
.EXTERNAL告诉汇编器,如果当前文件没有发现对应地址信息,不能确定是个编程错误,可能在另一个外部模块定义了。在所有模块合并之际,链接器将借助其他模块提供的符号表项,重新修订内容