- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看 C 代码,其中我必须弄清楚在特定程序跟踪中使用的寄存器数量。每当遇到 push 或 pop 命令时,代码都忽略了存储 ESP 寄存器。我还引用了 X86 指令,它写在那里“ESP,堆栈指针,不应使用”。为什么??
最佳答案
在 x86 上,ESP
是堆栈指针。最初,在 16 位 8088 和 8086 处理器上,该寄存器简称为 SP
,用于Stack Pointer。在 386 处理器中添加 32 位支持时,E
前缀(表示“扩展”)被添加到所有寄存器名称中,因此它变成了 ESP
。堆栈指针的位宽始终与当前模式下处理器的 native 字长相同。也就是说,如果您在 32 位保护模式下执行,堆栈指针将为 32 位宽并存储在 ESP
中。如果您在 16 位实模式下执行,堆栈指针将为 16 位宽并存储在 SP
中。
x86 架构的 64 位扩展(也称为 AMD64、x86-64 或简称 x64)将寄存器扩展到 64 位并添加了 R
前缀。因此,RSP
寄存器包含堆栈指针,在长(64 位)模式下执行时,该指针为 64 位宽。
尽管该寄存器在概念上与其他寄存器(EAX
、ECX
、EDX
、EBX
、 ESI
、EDI
和 EBP
),它不能以等效的方式使用。它被设计为仅用于保存堆栈指针,不能用作通用寄存器。
您没有显式压入或弹出堆栈指针的原因是因为这是由其他指令隐式完成的。事实上,PUSH
和 POP
指令是操作堆栈指针的指令,因为它们将内容压入和弹出到堆栈。
在 x86 上,堆栈总是在内存中向下增长,所以 PUSH
会从堆栈指针中减去适当数量的字节(根据操作数的大小),而 POP
将添加适当数量的字节。
CALL
和 RET
指令还隐式操作堆栈指针。您可以通过阅读 Intel x86 体系结构手册找到更多详细信息,available here . x86 中还有许多其他可用资源标记维基。
只有在 ADD
或 SUB
中将其用作目标操作数时,您才会看到 ESP
寄存器被显式操作操作说明。这些通常通过优化编译器插入函数的序言和结尾,根据需要递增或递减堆栈指针以腾出额外空间来存储值或清理堆栈。它们的功能类似于PUSH
和POP
,不同之处在于它们可以具有连续多次压入和弹出的效果。例如:
push eax
push eax
push eax
push eax
...
pop eax
pop eax
pop eax
pop eax
可以简单地替换为:
sub esp, 16
...
add esp, 16
(假设您实际上并没有尝试存储EAX
的值,而只是使用PUSH
在堆栈上腾出空间).
关于assembly - 为什么在使用 PUSH 或 POP 指令时不鼓励使用 ESP 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12503850/
我的团队正在使用 gerrit 代码审查,本质上这意味着默认的推送行为会绕过标准工作流程,因此我们需要使用 git push origin HEAD:refs/for/feature 来正确推送我们的
我是 assembly 新手,我正在使用 MASM。我看到这些代码行,想知道这之间有什么区别 a) push myVar b) push [myVar] c) push OFFSET myVar 我怎
美好的一天! 将镜像推送到docker hub时遇到一些问题。我的第一个软件版本: vagrant@debian-8-docker:~$ docker version Client version:
我有三个 Controller 一二三 .首先是navigationController的rootViewController。 在 SecondViewController ,我有一个名为 的协议(
我在这个 Google 教程的帮助下实现了一个 Web Push API: https://developers.google.com/web/fundamentals/getting-started
我有两个模式: var optionsSchema = new Schema({ locationname: String, locationnumber : String
我是 git 的新手并对其进行了测试。我已经能够克隆 friend 存储库进行小的本地更改并提交。 我现在想测试将我的本地更改推送到远程存储库,但不幸的是当我尝试进行推送时 $ git push <
我们正在公司讨论 git rebase 之后该做什么。在rebase之后,您需要将更改推送到远程origin,但是当git不允许时我们应该怎么做呢?实际上,我们正在讨论当分支已经被推送时我们最常用的两
我正在使用具有嵌入式 github 支持的新 IDE。在命令行本地,我可以成功地使用 git push orgin master 并更新 github。但是我的 IDE 使用带有 -v 标志的命令,这
我仍在阅读有关 RoR 的一些指南,我被困在 Deploying The Demo App 上 我遵循了说明: With the completion of the Microposts resour
我正在尝试创建一个可以将我的 git 存储库镜像到另一个存储库的脚本。一切正常,但它一直在说 [remote rejected] refs/pull/xx/head -> refs/pull/xx/h
我想了解使用 Tortoise SVN 构建过程的一些过程。主要是 我想知道你是否插入: 主线中继 QA 后的一个分支将其抓取到本地的工作副本中并测试该分支,然后一些构建推送该分支 我遇到的问题是我在
在谈论将消息推送到移动应用程序以触发 WAP 内容的下载时,似乎都使用了 WAP 推送和 SMS 推送这两个术语。 这些术语是指相同的机制还是具有不同的含义? 最佳答案 SMS Push 是告诉终端发
我只是想知道是否有人使用这种技术: 由于推送通知仅随 OS 3.0 一起提供,因此我一直在考虑使用电子邮件推送(Exchange、mobile.me)作为解决方法: 您可以注册一个 URL,例如。 m
我正在 build WP website using DIVI theme .应该被插入 dataLayer 的标签被默认的“未设置”值卡在某个地方。 为了推送我使用脚本的值: functi
我最近删除了xcode 6 beta 3并安装了xcode 6 beta 6 当我在终端输入gitpush时,这发生了 xcrun:错误: Activity 的开发人员路径(“/Application
我即将实现ionic-native Push Notifications .这可以在浏览器中运行吗?还是我需要安装 iOS/Android 模拟器? 最佳答案 除非您使用 Phonegap 推送服务器
Safari 12.1 是否支持服务 worker PWA 推送通知?我试过这个 demo在 iOS 上,但它仍然不适合我。 有机会得到它们吗?谢谢。 最佳答案 目前没有关于此功能的通信...Appl
目前我有很多 chrome 浏览器的推送订阅都是这样的方法, swr.pushManager.subscribe({userVisibleOnly: true}) .then(function
我需要 4 个过渡效果,但我只知道 2 个过渡效果,还有 2 个我不知道。我知道的 2 个过渡动画是: 过渡时下推: 并向下推过渡: 但
我是一名优秀的程序员,十分优秀!