阅读以下说明和x86汇编语言代码,根据要求回答问题1至问题3。
【说明】
在某嵌入式安全监测系统中,对某任务的加工操作需通过数据采集(Collect_task)、计算(Calculate_task)这两个不同的程序段来完成,并且执行程序段Collect_task和Calculate _task的顺序及次数有如下约定:
Collect_task(2次)→Calculate_task(1次)→Collect_task(5次)→Calculate_task(4次)→Collect_task(2次)→Calculate_task(2次)
表6-22 所示为x86系统部分指令及寄存器说明。
表6-22 x86系统部分指令及寄存器说明表
指令 | 功能 | 寄存器 | 功能 | |
MOV | 传送字或字节 | 段寄存器 | CS | 代码段寄存器 |
LEA | 地址传送 | DS | 数据段寄存器 | |
ADD | 加法指令 | SS | 堆栈段寄存器 | |
SUB | 减法指令 | ES | 附加段寄存器 | |
PUSH | 进栈操作 | AX | 累加器 | |
POP | 出栈操作 | 数据寄存器 | BX | 基址寄存器 |
SAL | 算术左移 | CX | 计数寄存器 | |
CALL | 子程序调用 | DX | 数据寄存器 | |
DEC | 减1指令 | 专用寄存器 | BP | 基数指针寄存器 |
JMP | 无条件转移指令 | SP | 堆栈指针寄存器 | |
JZ/JNZ | 结果为0/不为0时转移 | SI | 源变址寄存器 | |
JL/JG | 结果小于/大于转移 | DI | 目的变址寄存器 | |
JC/JNC | 有进(借)位/无进(借)位时转移 | |||
INT | 软中断 | |||
RET | 返回主程序 | |||
IRET | 从中断服务程序返回 |
【汇编程序代码】
N EQU (1)
RULEEQU (2)
CODESEGMENT
ASSUME CS:CODE
START: MOV AX,RULE
MOV CL,N
LOP: SAL AX,1
JC (3)
Collect: CALL Collect_task ;执行Collect_task程序段
JMP (4)
Calculate:CALL Calculate_task ;执行Calculate_task程序段
NEXT: (5)
JNZ (6)
MOV AH,4CH ;功能号送入AH寄存器
INT (7) ;结束程序运行,中断返回
(8)
END START
【问题3】 编译程序的功能是什么解释程序与编译程序的主要区别是什么请在150字以内简要说明。 |
参考答案:
解析:编译程序的功能是把某些高级语言编写的源程序翻译成与之等价的目标语言程序
解释程序与编译程序的主要区别是它不产生源程序的目标程序
这是一道要求读者掌握编译程序、解释程序基本功能的常识题。本题所涉及的知识点如下:
①编译程序的功能是把某些高级语言编写的源程序翻译成与之等价的目标语言程序。通常将编译程序的工作过程分为六个阶段,如表6-28所示。每个阶段的操作在逻辑上是紧密相连的,将源程序从一种表示形式一步步转换成目标代码。
表6-28 编译器六个工作阶段功能
名称 | 主要任务 | 备注 |
词法分析阶段 | 对源程序从前到后、从左到右逐个字符进行扫描,从中识别出一个“单词”符号 | 这两个阶段的本质都是对源程序的结构进行分析 |
语法分析阶段 | 根据语言的语法规则将单词符号序列分解成各类语法单位,构造出相应的语法树 | |
语义分析阶段 | 对源程序进行类型分析,检查是否存在语义错误,并收集类型信息供代码生成阶段使用 | 这两个阶段的依据是语言的语义规则 |
中间代码生成阶段 | 根据语义分析的输出生成与具体机器无关的中间代码 | |
代码优化阶段 | 优化中间代码在时间和空间上的浪费问题 | 依据是程序的等价变换规则 |
目标代码生成阶段 | 把中间代码变换成特定机器上的绝对指令码、可重定位的指令代码或汇编指令代码 | 此阶段的工作与与具体的机器相关 |
符号表管理 | 记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成 | |
出错处理 | 处理源程序中的静态错误和动态错误 |
解释程序与编译程序的主要区别在于它不产生源程序的目标程序。
③解释程序通常可以分为两部分:第一部分是分析部分,包括通常的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常采用逆波兰表示形式;第二部分是解释部分,用来对第一部分所生产的中间代码进行解释执行。