ICS-06

汇编语言

汇编语言编程——更上一层

  • 汇编语言属于低级语言。高级语言通常是“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告诉汇编器,如果当前文件没有发现对应地址信息,不能确定是个编程错误,可能在另一个外部模块定义了。在所有模块合并之际,链接器将借助其他模块提供的符号表项,重新修订内容

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值