IA32过程调用寄存器的保护规则

看CSAPP p151-152产生的疑问

 

转自:http://www.2cto.com/os/201408/323797.html

(节选)

 

偷偷懒我就不写寄存器前面的百分号了O(∩_∩)O)

eax 这个寄存器属于调用者保存寄存器,通常用来存储一些函数的返回值

edx ecx这两个也是属于调用者保存寄存器,并且 属于通用寄存器,可以随意保存数据,没有 什么特定的 限制。

ebx edi esi这三个寄存器属于被调用者保存寄存器。通常来说edi 和 esi可能会保存一些被调用函数的参数。

这里要说明一下一个概念,就是我很疑惑的,什么叫做调用者保存寄存器,什么叫做被调用者保存寄存器。

 

寄存器按照规则被分类了,左面的三个寄存器是调用者负责保存,右边三个寄存器是被调用者负责保存。也就是说,在过程调用的时候,如果被调用者程序会覆盖左边三个寄存器的内容,那么,如果这三个寄存器内容在过程调用结束之后还要用到没调用过程之前的那个数值的话,就要有人在过程调用发生之前保存这个寄存器里面的数值,但是由谁来保存呢?只能由调用者去保存,也就是说,被调用者是不会管你这里面有什么重要的数据的,他拿过来就用,但是调用者如果需要这里面的数据,就要自己提前保存。说的再直白一点,就是寄存器是任何程序都可以随便用的,但是里面数据的保存工作就是有责任人的。左边三个寄存器的责任人是调用者,右边三个寄存器的责任人是被调用者。

 

(.....)

 

 1 #include
 2 #include
 3 #define TYPE_MIN INT_MIN
 4 typedef int type_i;
 5 typedef struct return_t
 6 {
 7         int left;
 8         int right;
 9         type_i sum;
10 } return_type;
11 return_type find_max_crossing_subarray(type_i *A,int low,int mid,int high)
12 {
13         type_i left_sum=TYPE_MIN;
14         type_i sum=0;
15         int i;
16         int max_left;
17         for(i=mid;i>=low;i--)
18         {
19                 sum+=A[i];
20                 if(sum>left_sum)
21                 {
22                         left_sum=sum;
23                         max_left=i;
24                 }
25         }
26         type_i right_sum=TYPE_MIN;
27         sum=0;
28         int max_right;
29         for(i=mid+1;i<=high;i++)
30         {
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-point 数. 9 1.2.3 real number(实数)与NaN(not a number) . 11 1.2.4 unsupported 编码值 14 1.2.5 浮点数精度的转换 15 1.2.6 浮点数的溢出 17 1.2.7 BCD 码 20 1.2.8 SIMD 数据 21 第2 章 x86/x64 编程基础 23 2.1 选择编译器 23 2.2 机器语言 24 2.3 Hello world 25 2.3.1 使用寄存器传递参数 26 2.3.2 调用过程 27 2.3.3 定义变量 27 2.4 16 位编程、32 位编程,以及64 位编程 28 2.4.1 通用寄存器 28 2.4.2 操作数大小 30 2.4.2 64 位模式下的内存地址 30 2.4.4 内存寻址模式 31 2.4.5 内存寻址范围 34 2.4.6 使用的指令限制 34 2.5 编程基础 34 2.5.1 操作数寻址 35 2.5.2 传送数据指令 39 2.5.3 位操作指令 45 2.5.4 算术指令 47 2.5.5 CALL 与RET 指令 48 2.5.6 跳转指令 48 2.6 编辑与编译、运行 48 第 3 章编写本书的实验例子 50 3.1 实验的运行环境 50 3.2 生成空白的映像文件 52 3.2.1 使用nasm 编译器生成 52 3.2.2 使用bximage 工具 52 3.3 设置bochs 配置文件. 53 3.4 源代码的基本结构 54 3.5 编译源代码55 3.6 映像文件内的组织 55 3.7 使用merge 工具 56 3.7.1 merge 的配置文件 57 3.7.2 执行merge 命令 57 3.8 使用U 盘启动真实机器 58 3.8.1 使用merge 工具写U 盘 58 3.8.2 使用hex 编辑软件写U 盘 59 3.9 编写boot 代码 60 3.9.1 LBA 转换为CHS 62 3.9.2 测试是否支持int 13h 扩展功能 63 3.9.3 使用int 13h 扩展读磁盘 64 3.9.4 最后看看load_module() 64 3.10 总结 66 第4 章处理器的身份 67 4.1 测试是否支持CPUID 指令 67 4.2 CPUID 指令的术语及表达 68 4.3 基本信息与扩展信息 68 4.4 处理器的型号(family,model 与stepping) 72 4.5 最大的物理地址和线性地址 73 4.6 处理器扩展状态信息74 4.6.1 探测Processor Extended State 子叶 75 4.6.2 Processor Extended State 子叶所需内存size 76 4.6.3 Processor Extended State 的保存 77 4.6.4 Processor Extended State 的恢复 78 4.7 处理器的特性 78 4.8 处理器的Cache 与TLB 信息 80 4.9 MONITOR/MWAIT 信息 83 4.10 处理器的long mode 84 第 5 章了解 Flags 85 5.1 Eflags 中的状态标志位 86 5.1.1 signed 数的运算 86 5.1.2 unsigned 数的运算 89 5.2 IOPL 标志位 90 5.3 TF 标志与RF 标志 93 5.4 NT 标志 95 5.5 AC 标志 96 5.6 VM 标志 98 5.7 eflags 寄存器的其他事项 99 第 6 章处理器的控制寄存器 101 6.1 CR8 102 6.2 CR3 103 6.3 CR0 104 6.3.1 保护模式位PE 104 6.3.2 x87 FPU 单元的执行环境 104 6.3.3 CR0.PG 控制位 108 6.3.4 CR0.CD 与CR0.NW 控制位 108 6.3.5 CR0.WP 控制位 110 6.3.6 CR0.AM 控制位 110 6.4 CR4 110 6.4.1 CR4.TSD 与CR4.PCE 控制位 110 6.4.2 CR4.DE 与CR4.MCD 控制位 111 6.4.3 CR4.OSFXSR 控制位 111 6.4.4 CR4.VMXE 与CR4.SMXE 控制位 111 6.4.5 CR4.PCIDE 与CR4.SMEP 控制位 112 6.4.6 CR4.OSXSAVE 控制位 113 6.4.7 CR4 中关于页的控制位 113 6.5 EFER 扩展功能寄存器 114 第 7 章 MSR. 116 7.1 MSR 的使用 116 7.2 MTRR 117 7.2.1 Fixed-range 区域的映射 118 7.2.2 MTRR 的功能寄存器 120 7.3 MSR 中对特殊指令的支持 124 7.3.1 支持sysenter/sysexit 指令的MSR 125 7.3.2 支持syscall/sysret 指令的MSR 126 7.3.3 支持swapgs 指令的MSR 127 7.3.4 支持monitor/mwait 指令的MSR 128 7.4 提供processor feature 管理 129 7.5 其他未列出来的MSR 129 7.6 关于MSR 一些后续说明 129 第二篇 处理器的工作模式 第8 章实地址模式 132 8.1 真实的地址 132 8.2 real mode 的编址 132 8.3 real mode 的状态 133 8.4 段基址的计算 134 8.5 第1 条执行的指令 134 8.6 实模式下的执行环境 135 8.7 实模式下的IVT 135 8.8 突破64K 段限 136 8.9 A20 地址线 137 第 9 章 SMM系统管理模式探索 138 9.1 进入SMM 138 9.2 SMM 的运行环境 141 9.2.1 SMRAM 区域 141 9.2.2 SMM 执行环境的初始化 143 9.2.3 SMM 下的operand 与address 144 9.2.4 SMM 下的CS 与EIP 144 9.2.5 SMM 下的SS 与ESP 145 9.3 SMM 里的中断 145 9.4 SMI 的Back-to-Back 响应 147 9.5 SMM 里开启保护模式 147 9.6 SMM 的版本 148 9.7 I/O 指令的重启及Halt 重启 151 9.8 SMM 的退出 152 9.9 SMBASE 的重定位. 153 9.10 SMI 处理程序的初始化 154 9.11 SMM 的安全 156 9.11.1 芯片组的控制 156 9.11.2 处理器对SMRAM 空间的限制 158 9.11.3 cache 的限制 160 9.12 测试SMI 处理程序 161 第 10 章 x86/x64 保护模式体系(上) 163 10.1 x86/x64 的权限 164 10.2 保护模式下的环境 164 10.2.1 段式管理所使用的资源 165 10.2.2 paging 分页机制所使用的资源 165 10.3 物理地址的产生 166 10.4 段式管理机制 167 10.4.1 段式内存管理 168 10.4.2 段式的保护措施 168 10.5 段式管理的数据结构 169 10.5.1 Segment Selector(段选择子) 169 10.5.2 Descriptor Table(描述符表) 172 10.5.3 Segment Selector Register(段寄存器) 174 10.5.4 Segment Descriptor(段描述符) 175 10.5.5 LDT 描述符与LDT 258 10.6 开启保护模式 259 10.6.1 初始化GDT 260 10.6.2 初始化IDT. 262 10.6.3 切换到保护模式 263 第11 章 x86/x64 保护模式体系(下) 265 11.1 物理页面 265 11.1.1 处理器的最高物理地址(MAXPHYADDR) 266 11.1.2 物理页面的大小 267 11.1.3 页转换模式(Paging Mode) 268 11.2 paging 机制下使用的资源 270 11.2.1 寄存器 270 11.2.2 CPUID 查询leaf 270 11.2.3 寄存器的控制位 271 11.2.4 页转换表资源 272 11.3 32 位paging 模式(non-PAE 模式) 273 11.3.1 CR3 结构 274 11.3.2 32 位paging 模式下的PDE 结构 275 11.3.3 使用32 位paging 279 11.4 PAE paging 模式. 282 11.4.1 在Intel64 下的CR3 与PDPTE 寄存器 283 11.4.2 在AMD64 下的CR3 285 11.4.3 PAE paging 模式里的PDPTE 结构 286 11.4.4 PAE paging 模式里的PDE 结构 286 11.4.5 PAE paging 模式里的PTE 结构 288 11.4.6 使用和测试PAE paging 模式 288 11.4.7 使用和测试Execution Disable 功能 292 11.5 IA-32e pagi
### 回答1: IA-32中有8个通用寄存器,它们的名称和宽度如下: 1. EAX (32位):累加器寄存器,用于算术和逻辑运算,以及一些I/O 操作。 2. EBX (32位):基址寄存器,用于存储内存地址。 3. ECX (32位):计数器寄存器,用于循环操作。 4. EDX (32位):数据寄存器,用于存放运算结果。 5. EBP (32位):基指针寄存器,用于存储栈帧指针。 6. ESP (32位):栈指针寄存器,用于存储栈顶指针。 7. ESI (32位):源索引寄存器,用于存放源地址。 8. EDI (32位):目的索引寄存器,用于存放目的地址。 以上寄存器的低16位分别是AX、BX、CX、DX、BP、SP、SI、DI。 ### 回答2: IA-32架构中的通用寄存器共有8个,分别是EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP。 其中,EAX寄存器是累加器寄存器,用于存放函数的返回值或进行算术运算。 EBX寄存器是基址寄存器,通常用于存放指针地址或变量的基址。 ECX寄存器是计数器寄存器,通常用于循环计数或迭代操作。 EDX寄存器用于存放除法操作的余数或存放乘法操作的高位结果。 ESI寄存器是源变址寄存器,通常用于存放源数据的地址。 EDI寄存器是目的变址寄存器,通常用于存放目标数据的地址。 EBP寄存器是基址指针寄存器,通常用于存放栈帧的基址。 ESP寄存器是栈指针寄存器,用于存放栈中当前栈顶的地址。 除了寄存器的名称外,IA-32架构中的通用寄存器的宽度为32位,即每个寄存器可以存放32位的数据。这使得IA-32架构能够处理32位的数据或地址,提供了更大的寻址空间和更高的计算能力。同时,IA-32架构还提供了对16位和8位数据的处理指令,从而能够处理不同长度的数据。 ### 回答3: 在IA-32架构中,通用寄存器的名称有8个,它们分别是EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI。每个寄存器的宽度为32位,即可以存储32位的数据。这些寄存器在计算机指令中起着重要的角色,因为它们可以用来存储临时数据、地址、偏移量等。在这些寄存器中,EAX通常用于存储函数返回值,EBX通常用于存储数据指针,ECX通常用于循环计数器,而EDX通常用于存储除法运算的余数。ESP作为栈指针,用于指向当前栈的顶部,而EBP用于指向当前函数的栈帧基址。ESI和EDI通常用于存储数据传输中的源和目的地址。这些通用寄存器的命名使得编程更加灵活,可以方便地进行各种计算和操作。总之,通过使用这些通用寄存器,程序可以更加高效地运行和处理数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值