问题标签 [intel-syntax]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
279 浏览

g++ - 如何将函数参数传递到内联汇编块而不将它们分配给c ++中的寄存器变量

我正在尝试编写一个函数,该函数将字符串打印到标准输出而不导入<cstdio><iostream>.

为此,我尝试将 2 个参数(const char* 和 const unsigned)传递给asm(...)c++ 代码中的部分。并调用write系统调用。

这工作正常:

如果没有我将参数分配给寄存器的前两行,是否可以做到这一点?

下一行不起作用:

我正在用g++ -masm=intel. 我在 x86_64 Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8,Ubuntu 19.04 5.0.0-36-generic 内核(如果重要的话)。

编辑:根据Compiler Explorer,可以使用下一个:

但它总是rbp寄存器吗?它会如何随着参数数量的增加而变化?

0 投票
0 回答
1376 浏览

c++ - gcc: asm 语法 'mov eax, OFFSET FLAT: .LC0'?

所以我看到了一些代码

根据我收集到的信息,当内存模型平坦时使用 OFFSET FLAT。OFFSET 将转换为段选择器 (DS) 和 OFFSET,而 OFFSET FLAT 转换为标签 LC0 相对于 0 的绝对地址(因为这是平面模式下 DS 段的基础),链接器在它之后解析已组装。

但为什么edirdi呢?为什么没有指令mov rdi, moffs64?标签将有一个 64 位地址。我想也许是因为 ELF 基础在 linux 上将是 4MiB?(虽然我对Linux内核知之甚少,只有Windows,它位于0x140000000)。所以也许这是指令的大小优化,但这不排除数据部分大于4GB吗?(不是那样)。它只是安全地假设它不会吗?

0 投票
2 回答
301 浏览

assembly - 将 [symbol + constant] Intel 语法寻址模式转换为 AT&T 语法?

我只是无法弄清楚如何在移动值时向目标添加偏移量,特别是在我拥有的英特尔语法中:

对于 AT&T 语法,我尝试将其转换为:

编译时会出错,junk '(2,1)' after expression但使用gdtr(,1)效果很好。

我不明白为什么我不能使用基本偏移,而只能使用比例因子。

0 投票
0 回答
15 浏览

assembly - far jmp 从 NASM/Intel 到 GAS/AT&T 的转换

我在 GAS/AT&T 语法中只有一行简单的 NASM/Intel 语法汇编。这条线是

我在网上找不到任何东西,但我尝试过:

其中之一是正确的吗?如果没有,谁能提供正确的转换?我不太确定0x08效果如何JMP 0x08:reload_CS,因此对这里发生的事情的解释也会有所帮助。

0 投票
1 回答
276 浏览

assembly - 在 GAS .intel-syntax 程序集中的内存标签和寄存器上使用“偏移”和“[]”有什么区别?

使用 GCC,为 32 位 Intel 架构编译,带有.intel_syntax noprefix. 假设我有以下.data部分:

当用作操作数时,以下各项有什么区别:A, [A], offset A? [..]另外,在寄存器和内存标签上使用时有什么区别?

这里很好地[..]回答了简单编写寄存器和放入寄存器之间的区别。

0 投票
1 回答
368 浏览

gcc - GCC 上 x86 intel asm 中方括号前的偏移量

从我发现的所有文档中,没有提到offset[var+offset2]英特尔 x86 语法中的语法,但 GCC 具有以下标志

gcc -S hello.c -o - -masm=intel

对于这个程序

生产

我想突出显示mov BYTE PTR -1[rbp], 104偏移量-1出现在方括号之外的行。TBH,我只是猜测它是一个偏移量,任何人都可以指导我找到一个适当的文档来强调这一点吗?

这是一个类似的问题:来自 IDA 的 x86 asm 中的 Squared Brackets评论确实提到它是一个偏移量,但我真的很想要一个适当的文档参考。

0 投票
1 回答
613 浏览

gcc - mov的无效指令后缀?

我有这段内联汇编代码应该以文本模式打印 A:

但是,当我尝试使用 gcc 编译它时(使用 -m32 和 -masm=intel):

顺便说一句,这段代码来自我的操作系统内核,所以我不能使用 stdio.h 或类似的东西。

0 投票
1 回答
191 浏览

assembly - 使用寄存器与值调用 JMP 的不同行为

我正在尝试执行到地址 0x7C00 的绝对跳转,作为爱好 OS 中程序的一部分。我在 GAS 中使用英特尔语法并在 QEMU 中进行测试。我尝试了两种方法:

第二种方法似乎按我的预期工作并跳转到 0x7C00,但第一种方法导致 QEMU 崩溃,说明它“试图在 0x40007c00 处执行 RAM 或 ROM 之外的代码”。有谁知道为什么它会跳转到不同的地址并且高字节被设置为 0x4000?

编辑:

拆机时,我分别收到以下信息:

所以他们的编译方式不同,尽管我仍然对第二个到底在做什么有点困惑,看起来像是跳转到 0x7c3d

0 投票
1 回答
103 浏览

x86 - 禁用分页后操作系统在远跳转时重置

我正在修改一个在实模式之间切换以执行 BIOS 中断的例程,但遇到了分页问题我之前没有分页,但现在我的操作系统使用分页,我需要在进入实模式之前禁用它(并在之后启用它)。

我的问题是,当执行远跳转导致页面禁用生效时,出现了严重错误,我重新启动。

下面显示的代码首先使用页表创建身份映射,该页表boot_page_table1只是身份映射前 4 MiB 的页表。这必须完成,因为我目前使用分页从更高的内存运行我的内核代码,并且所有内核代码都在0xC01000000x00100000. 然后我刷新 TLB 并跳转到附近的标签,但这次使用的是较低内存中的地址。我的指令指针现在应该指向标识映射代码,并且禁用分页应该是安全的。然后在 中禁用分页位cr3,TLB 再次刷新,因为我很偏执,并且切换模式的代码继续进行。

该代码通过将自身处理到 0x7c00 的 16 位内存中,然后跳转到该位置,以便它可以在 16 位实模式下工作。

如果我不禁用分页位并使其他所有内容保持不变,jmpw CODE16:REBASE(p_mode16)则进入跳转后的工作和无限循环让我认为这个问题是由于我禁用分页的方式而发生的。禁用分页时我错过了什么吗?我在其他帖子 上看到“因为您所做的事情非常不寻常,您可能会遇到模拟器的错误和兼容性问题”,但我不确定它是否只是我的代码错误。

该代码是使用带有 GAS 汇编器的 intel 语法编写的。

永远不会到达带有jmp .-2atp_mode16标签的行,而是会重新启动。如果将jmp .-2放在 之前,jmpw则操作系统按预期进入无限循环。我在 QEMU 版本 2.11.1 上使用qemu-system-i386.

0 投票
0 回答
92 浏览

assembly - 英特尔语法中逗号的“目的”是什么?

我一直在编写编程游戏——随之而来的是编写编程语言。最初,我希望编程语言是汇编语言的大体简化(如果有人知道那是什么,就像游戏 EXAPUNKS)。

但随着事情的发展,我对功能上瘾了,该语言最终变得非常像带有 intel 语法的稍微简化的 x86。有一个关键区别:

我的语言不需要逗号。mov [eax+1] ebx在我的游戏中完全有效。

那么,为什么 intel 语法中需要逗号?在某些情况下,缺少逗号会导致歧义吗?我正在考虑实施逗号只是为了让语言更熟悉,但它并不真正需要它们。