一、过程调用和返回指令(1)过程
过程:汇编语言中的子程序称为过程(procedure),对应C语言中的函数。
调用子程序(过程、函数)在本质上是控制转移,它与无条件转移的区别是调用子程序要考虑返回
(2)过程调用指令
名称
CALL(过程调用指令)
格式
CALL LABEL
动作
先把返回地址偏移(EIP内容)压入堆栈,然后给EIP赋值为目标LABEL的地址偏移,实现转移
注意
返回地址:紧随过程调用指令的下一条指令的地址(有效地址)
目标地址:子程序开始处的地址(有效地址)
与无条件转移指令相比,过程调用指令CALL只是多了第一步(保存返回地址)
(3)过程返回指令
名称
RET(过程返回指令)
格式
RET
动作
从堆栈弹出地址偏移,并送到指令指针寄存器EIP
注意
通常,这个返回地址就是在执行对应的调用指令时所压入堆栈的返回地址
过程返回指令的使用应该与过程调用指令相对应
示例:
123456789101112131415161718192021222324252627282930313 ...
一、指令指针寄存器和简单控制转移(1)指令指针寄存器
指令指针寄存器EIP:
IA-32系列CPU有一个32位的指令指针寄存器EIP,它始终指向当前处理的指令。
它是早先8086CPU指令指针寄存器IP的扩展
由CS和EIP确定所取指令的存储单元地址。段寄存器CS给出当前段代码段的段号,指令指 针寄存器EIP给出偏移。即CS:EIP
如果代码段起始地址为0,则EIP给出的偏移直接决定所取指令的存储单元地址
实方式下,段的最大范围是64k,EIP中高16位必须为0,只有低16位的IP起作用
顺序执行指令的过程 CPU执行代码(程序)就是一条接一条地执行机器指令。可以把CPU执行指令的过程看做一条处理指令的流水线,通过以下两个步骤实现的指令的顺序执行。
从存储器取指令
根据指令长度,自动调整指令指针寄存器EIP的值,使其指向下一条指令 这些工作是CPU自动完成的,只需要把我们编写的汇编程序存入代码段,就可以自动顺序执行了。
控制转移指令 控制转移指令,它通过直接改变EIP寄存器的内容,实现指令执行过程中的跳转
转移:非自动顺序调整EIP内容
控制转移指令:专门用于改变EIP内 ...
汇编语言
未读一、段寄存器及使用1、存储器分段(1)物理地址相关
内存(逻辑存储器):CPU能通过CPU总线直接寻址访问的存储器
物理地址:内存(逻辑存储器)每一个字节单元有一个唯一的地址,称为物理地址。
这个物理地址就是各存储器在CPU总线上的地址,利用它CPU可以直接访问到对应的存储空间
CPU的地址线数量决定可产生的最大物理地址,n根地址线—>最大地址2^n-1,32位CPU通常有32根地址线,因此32位CPU的电脑最大只能装4G的内存条
物理地址空间:所有可形成的物理地址的集合
物理地址空间大小不等于实际安装物理内存大小
Intel8086有20根地址线,物理地址的范围是0到FFFFFIntel80386有32根地址线,物理地址的范围是0到FFFFFFFF
(2)存储器分段
为了有效地管理存储器,常常把
线性的物理地址空间划分为若干逻辑段
存储空间被划分为若干存储段
可以认为逻辑段和存储段是对应的。
通常,运行的程序把不同的数据存储于存储器中的不同存储段,包括
代码:要执行的指令序列(存储于代码段)
数据:要处理加工的内容(存储数据段)
堆栈:按先进后出 ...
一、简单传送指令
示例
12345678910MOV EAX, 12345678H //EAX = 12345678HMOV EBX, EAX //EBX = 12345678HMOV ESI, 256 //ESI = 00000100H MOV ECX, -1 //ECX = FFFFFFFFHMOV BX, ‘b’ //EBX = 12340062HMOV AH, AL //EAX = 12347878HMOV CX, AX //ECX = FFFF7878HMOV AX, SI //EAX = 12340100HMOV SI, BX //ESI = 00000062HMOV AL, BH //EAX = 12340100H
示例
1234567XCHG AL, AH //8位交换XCHG SI, BX //16位交换XCHG EAX, EBX //32位交换XCHG AL, [EBX] //AL与由EBX指定的字节存储单元交换XCHG [ESI] ...
“一代人有一代人的使命,一代人有一代人的担当。”——题记
盛夏的阳光炽烈而温柔,映照着城市的屋檐,也照进了屏幕两端的世界。这个暑假,我选择了一条不同寻常的道路——踏入“云支教”的实践旅程。借助互联网的桥梁,我与一位来自邻近城市的中学生相遇,在“云端”牵起了一段关于学习、成长与责任的缘分。
我仍清晰记得第一次连线时的情景。少年拘谨地坐在摄像头前,声音轻得像风拂过水面。我微笑着打破僵局,告诉他我们是一同学习的伙伴,而不是居高临下的讲解者。从那天起,我们制定了详尽的暑期学习计划,规划了语数英的复习安排,划定了每周的“云课堂”时段。课堂上,我引导他巩固基础知识,帮助他找到学习的薄弱环节,并带着他一步步拆解难题。渐渐地,我看到他的眼神里闪烁出自信的光芒,那是一束正在被点燃的希望。
除了课堂,我们还有一项特别的“云运动”计划。虽然身处不同的城市,但我们约定每周三下午共同完成一次“线上运动挑战”。我们会各自记录跑步的里程,分享自己的锻炼成果;有时候还会比拼平板支撑、俯卧撑次数,哪怕隔着屏幕,汗水依然是彼此的见证。一次次的挑战,让少年不再沉溺于手机和游戏,而是学会了用汗水收获力量。
更让我印象深刻 ...
汇编语言
未读一、IA32处理器简介
IA32系列处理器
保护地址方式&实地址方式
IA32系列CPU有3种工作方式:保护方式(包含一种子工作方式:虚拟8086方式)、实地址方式、系统管理方式
(1)保护方式
保护方式是IA32系列处理器的常态工作方式,可以发挥全部性能和特点 ,windows、Linux都运行于保护方式
全部32根地址线有效,可寻址4GB物理地址空间
支持存储器分段管理 & 可选的存储器分页管理机制
支持虚拟存储器的实现,用于指定存储单元的是面向虚拟存储器的虚拟地址
提供完善的保护机制
支持操作系统实现多任务管理
支持虚拟8086方式
(2)实地址方式
实地址方式是最初的工作方式:
开机/重新设置系统后,IA32工作于实地址方式
很久以前8086/8088等只支持实地址方式
实地址方式下只能访问最低1MB物理地址空间(00000H-FFFFFH)
实地址方式下只支持存储器分段管理,且每个段大小限于64KB,段内有效地址范围0000H-FFFFH。不支持分页
储管理机制。可以认为实地址方式下用于指定要访问存储单元的线性地址就是 ...
一、CPU简介
目标代码 ==目标代码/目标程序:由机器指令组成的程序==
CPU只能执行机器指令
高级语言编写的程序,最后都要转换成机器指令组成的程序,即目标代码,这样才能执行
目标代码是二进制编码的
程序编译过程
CPU基本功能 CPU的基本功能包括:==执行机器指令、暂存少量数据、访问寄存器==
执行机器指令 机器指令:CPU能直接识别并执行的指令 指令集:一款CPU能执行的全部指令的集合 指令的分类: (1)数据传送指令 (2)转移指令 (3)处理器控制指令 (4)其他指令 暂存少量数据 大部分指令是对数据进行运算和处理。运算数据和运算结构存在 (1)寄存器(CPU中) (2)存储器中(内存) 利用CPU内寄存器存取运算数据和结果效率最高。汇编器会充分利用CPU中仅有的寄存器,编写汇编时也要注意 访问存储器 存储器:CPU可以直接访问的计算机系统的物理内存 由机器指令组成的目标程序存储于存储器中,部分待处理数据也是 存储器(内存)由一系列存储单元线性组成,最基本的存储 ...
编译原理
未读
研究LALR的原因
规范LR分析表的状态数偏多
LALR特点
LALR和SLR的分析表有同样多的状态,比规范LR分析表要小得多
LALR的能力介于SLR和规范LR之间
LALR的能力在很多情况下已经够用
LALR分析表构造方法
通过合并规范LR(1)项目集来得到
合并核心项
写出自动机,发现有共同点
合并之后的
分析表
该报错的依旧是报错
是否会引起冲突
对于 LR(1) 文法, 合并得到的 LALR(1) 分析表是否会引入冲突?
· 不会引入移入/归约冲突
假设合并后出现冲突,[A → α·, a] 与 [B → β · aγ, b]
则在 LR(1) 自动机中, 存在某状态同时包含 [A → α·, a] 与 [B → β · aγ, c] (c随便是什么)
· 可能会引入归约/归约冲突
总结语法分析:
自顶向下: LL(1)
自底向上: LR(0), SLR(1), LALR(1), LR(1)
LL(1), LR(0), SLR(1), LALR(1), LR(1)文法之间的关系
https://blog ...