为什么我们必须在这里取消引用 stdout ?

2024-01-16

我正在尝试打电话fputs(str, stdout);从装配。

我为什么要push dword [stdout]而不是仅仅push stdout?

因为在 C 中我们不这样做fputs(str, *stdout),为什么我们需要取消引用stdout在装配中?

完整代码:

extern fputs
extern stdout

section .data
    hw: db "Hello World!", 10, 0

section .text
    global main

main:
    enter 0,0

    push dword [stdout]
    ;push stdout
    push hw
    call fputs

    leave
    mov eax, 0
    ret

您正在取消引用 asm 标签stdout,这相当于&stdout在 C 中。它是内存中的静态位置FILE* value被储存了。

只有 C 数组类型的行为类似于 asm 标签,其中 C 中的名称是地址,而不是内容。

也可以看看为什么在 NASM 中我们必须使用方括号 ([ ]) 来 MOV 到内存位置? https://stackoverflow.com/questions/49534661/why-in-nasm-do-we-have-to-use-square-brackets-to-mov-to-memory-location


在 NASM 中,裸露的符号名称就是静态地址。在 C 中,裸名就是值.

(真正的 C 数组除外,其中裸名称是第一个元素的地址。)


在 C 中,具有自动存储类的变量(即局部变量)也可以有名称,而不仅仅是静态的。在 asm 中,符号只能出现在静态地址上。 (C 中的自动存储通常是 x86 asm 中的寄存器,或堆栈空间,例如[ebp - 8]如果您需要溢出/重新加载。堆栈地址不是链接时常量,因此不能有标签。您可以对相对于 ESP 或 EBP 的堆栈进行寻址。)

具有动态存储的对象在 C 中不能有名称,只能通过命名指针来指向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们必须在这里取消引用 stdout ? 的相关文章

  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回

随机推荐

  • ight_layout() 不考虑图副标题

    如果我向 matplotlib 图添加副标题 它就会被子图的标题覆盖 有人知道如何轻松解决这个问题吗 我尝试过tight layout 功能 但这只会让事情变得更糟 Example import numpy as np import mat
  • docker 卷类型之间的区别 - 绑定与卷

    TLDR In docker compose 有什么区别 volumes type volume source mydata target data and volumes type bind source mydata target da
  • Java锁概念内部是如何工作的?

    类的每个实例Object 及其子类 拥有一个在进入某个对象时获得的锁synchronized方法并在退出时自动释放 这是否意味着我们创建的任何对象实例在内部默认都有一个 锁 作为字段实现 我对这个 锁 概念感到困惑 我想知道它内部实际上做了
  • 两个列表之间的差异

    我有两个填充了 CustomsObjects 的通用列表 我需要在第三个列表中检索这两个列表之间的差异 第一个列表中的项目 第二个列表中的项目 我在想使用 Except 是个好主意 但我不知道如何使用它 帮助 Using Except这正是
  • 在该命名空间中的另一个函数内转发声明该命名空间中的函数

    我有两个源文件 a cpp and b cpp In a cpp 我有一个函数 foo namespace ns void foo std cout lt lt foo In b cpp 我在命名空间中有另一个函数ns我想在其中制作原型并调
  • 在 jar 启动时预加载 java 类/库?

    在对服务器的第一次 RPC 调用期间发生超时 但后续请求成功 服务器响应超时 因为第一次调用时它会加载处理请求所需的库 由于这种延迟 一些客户端会超时 尽管可以增加客户端的超时延迟 但我希望最大限度地减少类加载对应用程序响应能力的影响 您将
  • 用于在 Windows 7 上部署使用 Visual Studio 2015 开发的 C++ exe 的可再发行组件

    我使用 Visual Studio 2015 在 Windows 10 上 开发了一个 32 位 C 应用程序 我想将其部署到运行 Windows 7 及更高版本的计算机上 我组装了一个 WiX 安装程序 并包含了 VC 可再发行合并模块
  • 从 Qt4 移植后,带有 Win32 HWND 嵌入的 Qt5 QWidget::create() 不再工作

    以下代码尝试使用 create 方法将自定义创建的 OpenGL 窗口的本机 Win32 HWND 嵌入到 QWidget 中 viewer widget viewer widget QWidget parent const viewer
  • python 数据库/sql 编程 - 从哪里开始

    使用嵌入式数据库的最佳方式是什么 比如 Python 中的 sqlite 占地面积应该很小 我只需要每个表几千条记录 每个数据库只有少数表 如果它是 Python 默认安装提供的 那就太好了 必须是开源的 可在 Windows 和 Linu
  • 无状态(在谷歌代码上)和Windows工作流之间的比较[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我开始认为我应该放弃 Windows WF 转而使用更简单的东西 我不一定需要长时间暂停工作流程执行并稍后恢复它们 然而 我想要一个简
  • 使用照片框架从图库上传视频

    使用照片框架从图库上传视频的最佳方式是什么 在我使用 ALAssetRepresentation 和 next 方法之前 NSUInteger getBytes uint8 t buffer fromOffset long long off
  • 迭代 2D 数组的“正交”对角线的更 numpy 方式

    我有以下代码 它沿着与通常返回的对角线正交的对角线进行迭代np diagonal 它从位置 0 0 开始并向右下坐标移动 该代码按预期工作 但其所有循环并不是很麻木 并且必须创建许多数组来完成该技巧 效率低下 所以我想知道是否有更好的方法来
  • 如何将 Web assembly/wasm 模块与 Vite 和 Vue 3 一起使用?

    我正在尝试将 wasm 模块导入 vite vue 3 项目 https github com rsms markdown wasm https github com rsms markdown wasm 它抛出以下错误 未捕获的语法错误
  • 通过 Reveal.js 幻灯片实现多重功能

    我想创建Reveal js https github com hakimel reveal js 使用 Slides com 进行演示界面 http slides com 为了节省时间 然后添加多路复用 https github com h
  • 用于源格式化的 Java API

    有几个 PHP 或 js 代码格式化库 有人知道 Java 中是否存在类似的库吗 即 给定一串代码 返回带有语法着色等的格式化字符串 如果它能自动检测到语言 那就太理想了 但我可能会碰碰运气 文本最终将显示在 Flex 应用程序中 所以虽然
  • 使用 Laravel MongoDB 按最多投票(总体投票、上个月投票等)排序帖子

    我试图了解 mongodb 和 laravel 的更高级功能 但遇到了麻烦 目前我的架构设置是users posts and posts votes收藏 这posts votes has a user id post id and time
  • H2O 中带有西里尔字母的字符串 UTF-8 编码

    我使用西里尔字符串加载 utf 8 编码的 csv 文件 在 Flow 界面中解析后 我看不到西里尔字母 但看不到可读的符号 例如 如何在 H2O 中使用 utf 8 西里尔字母字符串 这似乎是 Flow 界面中的一个错误 但仅限于 set
  • 加载在 .NET 4.0 中存储为 XAML 的工作流程

    加载之前创建并存储为 XAML 的 NET 4 0 Beta2 工作流的语法是什么 WorkflowElement 和 Workflow Xaml Services 类不再存在 我正在尝试做这样的事情 在 Beta 1 中有效 Workfl
  • 面板和用户控件与动态加载用户控件

    如果我想动态显示或隐藏多个用户控件 使用加载用户控件然后显示或隐藏面板 可见 真 假 的面板会更好还是使用占位符并在运行时加载 添加 或卸载 清除 它们会更好 LoadControl a 我有一个使用 AJAX UpdatePanel 的页
  • 为什么我们必须在这里取消引用 stdout ?

    我正在尝试打电话fputs str stdout 从装配 我为什么要push dword stdout 而不是仅仅push stdout 因为在 C 中我们不这样做fputs str stdout 为什么我们需要取消引用stdout在装配中