在 x86_64 上汇编 i386 代码

2023-12-04

以下代码无法按预期工作:

.intel_syntax noprefix
.arch i386
.data
hello_world:
.ascii "Hello world!\n"
hello_world_end:
.equ hello_world_len, hello_world_end - hello_world
.text
.global _start
_start:
mov ebx, 1
mov ecx, hello_world
mov edx, hello_world_len
mov eax, 4
int 0x80

mov ebx, 0
mov eax, 1
int 0x80

当跑过时:

as test.s -o test.o
ld test.o -o test
./test

它什么也不输出。当我改变线路时:

mov ecx, offset hello_world ; added offset

效果很好。我尝试用以下命令编译原始代码--32 -march=i386并与-m elf_i386但它仍然没有输出任何内容。

$ uname -a
Linux ubuntu 3.2.0-38-generic #60-Ubuntu SMP Wed Feb 13 13:22:43 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

我猜测发生这种情况是因为内存模型不像 i386 那样平坦。我可以以某种方式模仿这个吗?


这与内存模型无关。

在气体语法中mov ecx, hello_world means 从内存地址读取 hello_world,可以通过检查用 ndisasm 完成的反汇编来确认:

00000000  BB01000000        mov ebx,0x1
00000005  8B0C25D4104000    mov ecx,[0x4010d4]
0000000C  BA0D000000        mov edx,0xd
00000011  B804000000        mov eax,0x4
00000016  CD80              int 0x80

你想要的是存储内存地址 of hello_world。在天然气中,实现这一目标的方法是mov ecx, offset hello_world,从反汇编中可以确认:

00000000  BB01000000        mov ebx,0x1
00000005  B9D4104000        mov ecx,0x4010d4
0000000A  BA0D000000        mov edx,0xd
0000000F  B804000000        mov eax,0x4
00000014  CD80              int 0x80

顺便说一句,将内存地址加载到寄存器中的另一种方法是leaecx, hello_world.

其他一些汇编器(例如 NASM 和 YASM)具有不同的语法,这种差异可能会导致混乱,可以用一个小表来说明:

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

在 x86_64 上汇编 i386 代码 的相关文章

  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • ICC 中的 -O3 会扰乱内在函数,使用 -O1 或 -O2 或相应的手动汇编即可

    这是后续这个问题 http stackoverflow com questions 49791664 o2 in icc messes up assembler fine with o1 in icc and all optimizatio
  • 难以理解汇编命令“加载有效地址”[重复]

    这个问题在这里已经有答案了 可能的重复 LEA 指令的目的是什么 https stackoverflow com questions 1658294 whats the purpose of the lea instruction LEA指
  • 是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

    多年来 我有几次看到 in 中的内在函数float参数被转换为 m128使用以下代码 m128 b mm move ss m mm set ss a 例如 void MyFunction float y m128 a mm move ss
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 将 XMM 寄存器压入堆栈

    有没有办法将打包双字整数从 XMM 寄存器推送到堆栈 然后在需要时将其弹出 理想情况下 我正在寻找通用寄存器的 PUSH 或 POP 之类的东西 我已经检查了英特尔手册 但我要么错过了命令 要么没有 或者我是否必须将值解压到通用寄存器然后推
  • x86 asm 图形设置的分辨率高于 640x480?

    我刚刚开始使用汇编语言 感觉像学习新东西 并且遇到了一些问题 到目前为止 我一直在浏览的所有教程都没有回答 或者太旧而无法知道 1 我尝试了一些搜索 也许我只是不知道正确的关键字 但我找不到用于更改屏幕分辨率等的图形模式的更新列表 我发现的
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • x86 程序集 Pushl/popl 不适用于“错误:后缀或操作数无效”

    我是汇编编程的新手 正在努力解决编程基础 http savannah nongnu org projects pgubook 在带有 GNU 汇编器 v2 20 1 的 Ubuntu x86 64 桌面上 我已经能够汇编 链接执行我的代码
  • 将十进制转换为十六进制

    首先 这是家庭作业 我正在尝试将 5 位数字读入寄存器 bx 假定该数字不大于 65535 16 位 以下是我尝试这样做的方法 但是 当我尝试打印该号码时 我仅打印输入的最后一位数字 这让我猜测 当我向 bx 添加另一个数字时 它会覆盖以前
  • 错误:无法识别的指令 [ORG]

    我试图编写一个引导加载程序以在 dos box 中使用 我写了下面的代码 BITS 16 tell the assembler that its a 16 bit code ORG 0x7C00 Origin tell the assemb
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 如何恢复 x86-64 寄存器保存约定

    fibonacci cmpq 1 rdi ja recursive movl 1 eax ret recursive push rbp push r10 movq rdi r10 leaq 2 rdi rdi call fibonacci
  • INT 13h 无法读取超出特定扇区的数据

    我正在为我的操作系统编写内核 在将磁盘扇区加载到内存时遇到问题 以下是从磁盘加载扇区的函数代码部分 mov ax 0x3000 mov es ax mov ax 0x0201 mov bx word ptr bp 6 bx 0x000 0x
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 为什么 GCC 在堆栈上压入额外的返回地址?

    我目前正在学习汇编的基础知识 在查看 GCC 6 1 1 生成的指令时遇到了一些奇怪的情况 这是来源 include

随机推荐

  • 在这种情况下,instanceof 方法的替代方法

    你好 我想知道像这样的东西有什么更优雅的替代品 class Base class A extends Base class B extends Base iterator of colection containing mixed As a
  • R:数字精度,如何防止四舍五入?

    在 R 中 我有以下数字向量 numbers lt c 0 0193738397702257 0 0206218006695066 0 021931558829559 0 023301378178208 0 024728095594751
  • Azure VNET 子网委派

    有人可以帮助解释 Azure 中的子网委托吗 我读过以下文章 但它并没有真正解释任何内容 https learn microsoft com en us azure virtual network subnet delegation ove
  • 将命令按钮添加到 Windows 登录屏幕 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想为 Windows 用户实现自我重置密码功能 当登录屏幕提示时 应向域用户显示忘记密码按钮 该按钮将引导用户进入密码重置向导 所以问题是如何向标准 Windows 登录屏幕添
  • 如果单击子菜单项,请避免关闭菜单

    这是一个多级菜单 当我单击 关于 链接时 它会打开包含 3 个链接 Johnny Julie 和 Jamie 的子菜单 当我再次单击 关于 时 它会关闭菜单 单击子菜单也会关闭菜单 这是我想避免的 如果我单击子菜单 约翰尼 朱莉和杰米 如何
  • Visual Studio 2013 不断崩溃并出现错误 denev.exe [重复]

    这个问题已经存在了 所以我有一台运行 Windows 10 和 Visual Studio Ultimate 2013 的机器 但是每次我启动该程序 它都会在 1 分钟内崩溃 甚至没有移动鼠标 当它崩溃时 它会给出以下错误 devenv e
  • 从 JSON 模式生成 C# 类 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在创建一个 C WCF Web 服务 它以 JSON 格式返回大量数据 客户端是一个iPad应用程序 目前正在由另一个团队开发 所以我正在研究规
  • 罐子不匹配!修复你的依赖关系

    重现步骤 创建一个android项目 MyApp 导入 ActionBarSherlock ABS Directional ViewPager DVP 或任何其他使用 Android 支持库的开源库 将库添加到项目 MyApp 中 控制台日
  • 有什么方法可以获取Java中字符串的大小(以字节为单位)?

    我需要文件中每行的大小 以字节为单位 这样我就可以获得读取的文件的百分比 我已经得到了文件的大小file length 但是如何获得每条线的大小 final String hello str Hello World hello str ge
  • uint 之间的差异可以为负数

    我有一个关于 C C 中无符号整数的问题 它们以及对它们的运算结果应始终为正或等于零 但与 uint16 t 的差异看起来并非如此 uint 在 C 头文件 cstdint 中定义 下一个程序采用 错误 分支 uint16 t beg 7
  • Django 如何知道渲染表单字段的顺序?

    如果我有一个 Django 表单 例如 class ContactForm forms Form subject forms CharField max length 100 message forms CharField sender f
  • Android Studio错误:数据错误循环冗余检查

    我正在开发一个项目 这需要我重新安装最新版本的 Android Studio 安装后 当我打开项目时 我收到此错误 我已经尝试过可用的单一答案 但它不起作用 我正在使用最新版本的 Android Studio 3 1 1 错误 数据错误 循
  • 未找到 Django related_name

    我有这个模型 class Person models Model something employers models ManyToManyField self blank True related name employees 当我做pe
  • Bootstrap 按钮问题:按钮杂乱无章,无法并排放置

    我正在从事一个房地产网站项目 我已经创建了 Photoshop 模板并将其上传到 Behance https www behance net csc103falld848 现在 我正在创建房地产商店模板的静态版本 我面临一个问题 我无法将按
  • PHP DOM 从第一个 ul 元素获取项目

    我有 html 文件 如下所示 ul li item 1 li li item 2 li li item 3 li ul ul li smth 1 2 3 li li another li ul ul li smth 1 2 3 li li
  • 当类层次结构中存在原始类型时,为什么 Scala 会抱怨非法继承?

    我正在编写一个采用 Scala 的包装器ObservableBuffer并激发与兼容的事件Eclipse JFace 数据绑定框架 在数据绑定框架中 有一个抽象ObservableList装饰一个普通的 Java 列表 我想重用这个基类 但
  • 以编程方式启用 Adob​​e PDF 使用权限

    有没有办法以编程方式从 net 代码启用 Adob e PDF 使用权限 我正在使用 ITextSharp 库用 XML 数据 从应用程序生成 填充 XFA 表单 但输出的 PDF 没有启用使用权限 因此用户无法与其交互 这通常不会成为问题
  • SQLite中根据Radius查询获取记录?

    我有这个查询在 MySQL 中运行良好 SELECT ACOS SIN 12 345 PI 180 SIN lat PI 180 COS 12 345 PI 180 COS lat PI 180 COS 67 89 lon PI 180 1
  • 我什么时候应该使用 Struct 和 OpenStruct?

    一般来说 与 Struct 相比 使用 OpenStruct 的优点和缺点是什么 哪些类型的一般用例适合这些用例 With an OpenStruct 可以任意创建属性 AStruct另一方面 必须在创建它时定义其属性 选择其中一种应主要取
  • 在 x86_64 上汇编 i386 代码

    以下代码无法按预期工作 intel syntax noprefix arch i386 data hello world ascii Hello world n hello world end equ hello world len hel