问题标签 [nasm]
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.
com - 在 x86 程序集中构建 COM 对象 vtable
我正在使用 NASM 在 x86 程序集中构建一个 COM 对象。我非常了解 COM,我也非常了解 x86 程序集,但是让两者相互融合让我挂断了……(顺便说一句,如果你想劝阻我不要使用 x86 程序集,请不要,我有非常特殊的原因为什么要在 x86 程序集中构建它!)
我正在尝试构建一个 vtable 以在我的 COM 对象中使用,但我不断收到奇怪的指针,而不是指向我的函数的实际指针。(我在想我得到了相对偏移量,或者 NASM 在其中嵌入了临时值,并且在链接期间它们没有被实际值替换)
我目前正在尝试构建的接口是IClassFactory
接口,代码如下:
注意:这不是所有代码,我在不同的文件中有 DllGetClassObject、DllMain 等。
但是当我组装(使用 NASM: nasm -f win32 comobject.asm
)和链接(使用 MS Link: link /dll /subsystem:windows /out:comobject.dll comobject.obj
),并使用 OllyDbg 检查可执行文件时,vtable 会出现奇怪的值。例如,在我上次构建中,函数的实际地址如下:
- 查询接口 - 0x00381012
- AddRef - 0x0038101A
- 发布 - 0x00381020
- 创建实例 - 0x00381026
- LockServer - 0x0038102E
但是 vtable 有这些值:
- 查询接口 - 0x00F51012
- AddRef - 0x00F5101A
- 发布 - 0x00F51020
- 创建实例 - 0x00F51026
- 锁定服务器 - 0x00F5102E
这些值看起来非常可疑......几乎就像搬迁没有采取一样。此外,vtable 显示为 0x00F5104A,所有这些都是不可访问的内存地址。(出于信息目的,这些值每次都不同)
我尝试使用 Visual Studio 2010 Express 在 C++ 中做同样的事情,一切都很好。所以我假设这只是我在装配中缺少的东西......
谁能向我指出为什么这些值没有正确显示?
linux - 从汇编中的文件读取
我正在尝试在 Linux 环境中学习汇编——x86。我能找到的最有用的教程是使用 NASM 编写有用的程序。我自己设置的任务很简单:读取文件并将其写入标准输出。
这就是我所拥有的:
这里的一个关键问题是本教程从未提及如何创建缓冲区、bufsize
变量或实际上是变量。
我该怎么做呢?
(顺便说一句:经过至少一个小时的搜索,我对学习装配的资源质量低下隐约感到震惊。当唯一的文档是在网上交易的传闻时,任何计算机到底是如何运行的?)
assembly - 我的汇编程序中的 SegFaults?但那是不可能的!:O
好的,所以我知道我们所有的 C/C++ 程序员都曾遇到过我们不合时宜的克星,恶魔信号 SIGSEGV,分段错误。现在,我理解(强调过去时)这是某种形式的故障安全/检查系统,它位于由神奇的 GCC(或 g++)编译器或您拥有的机器代码的某些部分中。
但!今天,我在虚拟化 Arch Linux 系统上使用了一些带有良好旧 NASM 的 x86 汇编程序,令我惊讶和懊恼的是,我的编码工作再次被邪恶的 SegFault 挫败。
这是产生可怕信号的代码:
现在,我知道 Linux 内核将您组装的程序加载到一个 shell 中并从那里执行它,但我认为这个 MOV 指令与处理器进行了 1 对 1 的交互,内核到底如何检测到我正在尝试访问一个它不想让我留下一点记忆,然后停止指令?
我不假装理解当你的程序加载到 shell 时究竟发生了什么,你在 shell 中拥有什么权限,甚至不知道 shell 是什么或它是如何工作的,但我曾经确信 ASM 给了你完全控制处理器。这个神奇的内核如何干扰我对处理器的直接命令,为什么我在编写本质上是纯机器代码时仍然被迫通过这个操作系统命令链?:O
assembly - ORG 组装说明有什么作用?
谁能给我关于 ORG 指令的全面描述?
何时以及为什么在汇编书面应用程序中使用它?
在 x86 或 AMD64 上使用 Nasm。
nasm - 使用 nasm 关闭计算机
是否可以从 nasm 关闭或切断计算机的电源(有区别吗?)。我知道您可以使用它来重新启动:
是否有相当于关闭的方法?我正在制作自己的 16 位操作系统。
nasm - 汇编.asm时,可以反汇编成相同的语法吗?
假设我有一个简单的 nasm 程序来打印你好!当然是 intel 语法,当我组装它(使用 -f elf)并使用 ndisasm 进行组装时,它完全不同!为什么它不能反汇编成与我的 hello world 程序相同的简单格式?不可能吗?
x86-64 - movlps 的 NASM 64 位立即地址给出“dword 数据超出范围”
我需要具有 64 位宽的立即地址的指令 movlps,根据英特尔手册,这应该是完全可能的。所以,像这样:
但我得到的只是 NASM 将操作数大小截断为 32 位并打印相应的警告:
我尝试了不同形式的 qword 前缀,但没有成功。
assembly - 为什么这是一个无效的操作数?
我有以下由我正在编写的编译器生成的 ASM 文件:
当我尝试编译它时,我收到以下错误:
test.asm:16:错误:操作码和操作数的无效组合
test.asm:19:错误:操作码和操作数的无效组合
test.asm:29:错误:操作码和操作数的无效组合
这真的没有意义,因为根据 NASM 文档,我可以:
MOV mem_offs, reg_eax 386
为什么我不能执行这个操作?
assembly - 如何以与操作系统无关的方式打印字符串?
我正在尝试以与操作系统无关的方式打印字符串。例如,程序在 Windows 上的运行应该与在 *nix 上的运行方式相同。
这甚至可能吗?我假设由于底层架构是相同的(x86),所以方法是相同的。像调用中断一样简单吗?
这样做的原因是我正在尝试编写一个生成汇编代码的编译器 - 在其开发的早期阶段,只有少数功能存在 - 我希望能够在任一 Windows 中测试生成的汇编代码或 *nix。以后,在生成相同代码的同时保持平台中立性是不可能的,但基本上我现在要做的就是打印一个字符串。
memory - 无法使用 32 位汇编器修改内存
我正在使用 NASM 来组装我的汇编代码。我组装的代码如下所示:
我在另一段代码中遇到了问题,我注意到我无法修改内存,所以我编写了这段代码来测试是否确实如此。它是!我将汇编的机器代码复制到软盘的第一个扇区,程序运行(我使用了 MS VirtualPC)。我检查了分配给 Virtual PC 的 RAM 内存并搜索了数字 4 8 15 16 23 42,这样我就可以找到二进制代码的复制位置。数据的第一个字节未被触及。为什么会这样?