问题标签 [yasm]
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.
c++ - YASM 程序集在 jited 函数中调用 stdout.write
我正在尝试编写一个即时编译器,但我有一段不想工作的代码。我的平台是 x86-64 ubuntu。
我有以下用 yasm 编写的代码:
因此,如果我理解正确,这应该写入A
标准输出。现在我编译这段代码
这导致了以下机器代码:
然后我用 C++ 读取生成的代码并调用它:
我认为 C++ 部分很好,因为我已经尝试过简单的算术运算并且效果很好。
所以无论如何都没有分段错误,代码似乎已执行但没有任何反应,stdout 中没有任何内容。
有什么建议吗?
//编辑:完整的 C++ 代码:
c++ - Cmake:构建 YASM 源文件
我正在使用 CMake 3.4.1 生成和构建 Visual Studio 2013 64 位 C++ 解决方案。其中一个项目还包含我们在 VisualStudio 中使用 yasm 汇编器作为 lib 编译的 .asm 文件。如何配置 CMake 以对这些文件使用 yasm?我还没有找到任何有关如何设置它的示例的文档。
linux - 64 位汇编:为什么 ld 使用 32 位系统调用,而不是 64 位系统调用?
我想知道为什么我必须使用来自/usr/include/asm/unistd_32.h
, not unistd_64.h
的系统调用号,即使我正在使用 64 位寄存器并使用(我认为)适当的命令进行组装和链接:
文件 hello.asm 是(我知道我在 32.h 中使用数字 4 进行写入,使用数字 1 进行退出,因为使用 64.h 中的数字不起作用。那里的 Write 是 1,并且退出 60,我尝试了没有结果的那些。)
file
在可执行文件和目标文件上返回:
目标文件:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
可执行:ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
我/usr/include/unistd.h
的是:
如果你已经通过这篇文章做到了这一点,你就会知道为什么我的“你好世界”程序说“嘿你美女”:我喜欢我的电脑像酒吧里的一个肮脏的老人一样跟我说话.
c - 调用c函数的yasm程序编译或链接失败
yasm
在 linux ( ) 上尝试从汇编代码 ( ) 调用 c 函数时x86-64
,执行失败。
代码
function_call_c.asm:
编译:
执行时:
它提示:
bash: ./a.out: 没有这样的文件或目录
但a.out
确实存在,并且有执行权限。
使用objdump,获取可执行文件的信息:
使用readelf,获取可执行文件的信息:
问题是:
- 为什么执行失败,是代码错误吗?还是我以错误的方式编译它?
linux - 我创建的文件名末尾的额外字符
我正在尝试学习汇编程序,但本教程遇到了问题http://www.tutorialspoint.com/assembly_programming/assembly_file_management.htm
除了写出文件时,它工作得很好而且很漂亮。取而代之的是myfile.txt
,它被命名为myfile.txtWelcome to Tutorials PointWritten to file?
。
我似乎无法找出原因。我从教程中删除了源代码,它做了同样的事情。
有人能告诉我为什么吗?
我正在使用 nasm 2.12.02。我也在 yasm 1.2.0 上尝试过,所以我很确定这是汇编代码造成的。
我正在建造和运行OpenSUSE Linux 3.16.7-35-default #1 SMP Sun Feb 7 17:32:21 UTC 2016 (832c776) x86_64 x86_64 x86_64 GNU/Linux
c - 将编译后的代码与 NASM 和 MSVC 链接时未解决的参考
我正在尝试将程序集(用 编译)与/yasm
编译的对象结合起来,我试图将(用)链接到 a中,然后将其链接到最终的可执行文件。msvc
cl.exe
link.exe
.dll
从源代码创建对象文件和从这些对象创建 dll 都可以正常工作。
在最后一步中,将.dll
与可执行文件链接会出现以下错误:
我正在使用 C。尽管 Win64 没有名称修饰,但我尝试了多种方案(如_xxx_xxxx
or __imp_xxx_xxxx
)。
检查目标文件会dumpbin.exe
显示所有符号:
但不在从以下导出的符号中.dll
:
即使我已将声明标记为在内部导出.dll
,使用__declspec(dllexport)
.
任何想法如何满足链接器并告诉他符号确实存在?
assembly - gdb 对于 .bss 中的符号与 .data 中的符号的行为不同
我最近开始使用 YASM 为 Intel x86-64 架构学习汇编语言。在解决一本书(Ray Seyfarth)中提出的一项任务时,我遇到了以下问题:
当我将一些字符放入 .bss 部分的缓冲区时,在 gdb 中调试它时仍然看到一个空字符串。将字符放入 .data 部分的缓冲区中会按预期在 gdb 中显示。
在 gdb 中我得到:
在 LINE 1: 之后
x/s &buf
,结果 -0x7ffff7dd2740 <buf>: ""
在 LINE 2: 之后
x/s &str_test
,结果 -0x601030: "A"
看起来&buf
没有评估到正确的地址,所以它仍然看到全零。根据其 0x7ffff7dd2740 不在被调试进程的 BSS 中/proc/PID/maps
,因此这没有任何意义。 为什么&buf
评估到错误的地址,但&str_test
评估到正确的地址?两者都不是“全局”符号,但我们确实使用调试信息构建。
在 x86-64 Ubuntu 15.10 上使用 GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10 进行测试。
我正在建造
nm
在可执行文件上显示正确的符号地址:
(编者注:我重写了很多问题,因为奇怪的是 gdb 的行为,而不是 OP 的 asm!)。
assembly - 当我使用与寻址模式相同的表达式计算地址时,为什么 gdb 没有显示 BSS 数组中的变化?
在 .bss 段中编写了带有大缓冲区的简单程序
然后尝试增加某个数组单元格的值。
仍然在 gdb 中,在第三条指令执行之前和之后看到相同的值(0)。
当我尝试检查存储到的地址时,为什么我仍然看到 0?
c - 无法使 libtool 合并 yasm 创建的目标文件
我正在努力获得libtool
并yasm
一起工作。
yasm
.o files
从我的来源创建正确的.asm
,但我无法弄清楚如何libtool
构建关联.lo
和.dep
文件。它想要构建共享库,合并.o
文件。
x86-64 - 为什么没有用零填充
为 10000 位分配的数组 = 1250 字节(10000/8):
测试指针:
已分配内存:
试图用零填充分配的内存:
检查第一个字节:
检查最后一个字节(0 - 第一个字节,1249 - 最后一个字节)
已解决的问题
应该输入x/1c $rax + 1249