问题标签 [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.
assembly - yasm movsx, movsxd 操作数 2 的大小无效
我正在尝试使用 yasm 组装下面的代码。我在 yasm 报告错误“错误:操作数 2 的大小无效”的地方添加了“此处”注释。为什么会发生此错误?
assembly - 在 yasm 中为 ELF32 部分指定物理地址?
我正在尝试使用 yasm 构建一个简单的 ELF 程序。但是,我不知道如何让它以 .TEXT 部分为目标,以便它的 VMA 地址从 0x1000 开始,而不是 0。我尝试使用 START 和 ORG 指令,但这些仅在定位时似乎有效斌,不是精灵。这可以在yasm中做到吗?
assembly - YASM:不能在 64 位模式下应用 32 位绝对重定位
相关代码:
yasm 构建错误:
我对这些 x64 asm 代码知之甚少,有人可以帮我修复paddd指令中的这个错误吗?
assembly - 在yasm中,定义一个内容等于宏参数值的字符串
在宏内部,我想声明一个字符串,其值等于宏参数的文本值。
例如,我想要类似的东西:
宏扩展后应该导致装配:
这将组装到带有尾随空值的字符串“bar”。
linux - 汇编数字列表的最小值、中间值、最大值、总和和整数平均值
我需要创建一个简单的 x96-64 汇编语言程序来计算数字列表的最小值、中间值、最大值、总和和整数平均值。当我尝试组装时,它给了我错误。到目前为止我的代码:
使用 YASM 组装时遇到的错误类似于:
为什么我会收到这些错误,我该如何解决?
macos - 在 Yasm 中声明变量
这是一个简单的程序:
问题是变量a
包含的值与 18 不同。这lldb
向我展示了:
(lldb) pa
(void *) $0 = 0x0000000000001412
(lldb) pb
(void *) $1 = 0x0000000000000014
(lldb) p --format decimal a
有什么想法吗?我知道如果我声明a
为dq
,它会好的,但我想了解它为什么会发生。
assembly - x86-64汇编shell排序算法转换
我一直在研究这个汇编程序来对数字列表进行排序,似乎我正在遵循 shell 排序的逻辑,但是当我运行它时,它会连续运行,因此在我的排序中存在一个问题,我正在制作一个错误?我很确定以 36 为基数的整数宏可以工作,但我需要让排序工作,从头开始重写并遇到同样的问题。最初我使用的是整个 300 列表,我通过循环获得了大约 6 次运行的正确值,但我在某个时候遇到了问题,决定将 lst 缩短为 5 并重写。
macos - 在 macOS 上使用 brk 系统调用,Yasm
我一直在尝试找到一种brk
在 macOS 上的 Yasm 程序中使用系统调用的方法。我查看了syscall.inc
该系统调用的文件,但在那里找不到。brk
在 macOS 上有什么替代方案吗?
assembly - YASM(x86_64架构)中的有符号乘法后跟有符号除法
我正在为处理器架构使用yasm
汇编程序。x86_64
假设我已经在该部分中定义了三个数字.data
:
我想要做的是将有符号双字dVar1
乘以有符号字,dVar2
然后再除以有符号字节bVar3
。
下面我将参考本书介绍我的“解决方案”,以了解我为什么要执行每个步骤。问题在文末。
dVar1 * wVar2(有符号)
我没有看到任何明确的规则,即乘法仅适用于相同大小的数字。但是看到一些隐含的。这就是为什么我使用转换wVar2
:
现在“它们”的大小相同,所以我只是将它们相乘:
...例如,将ax(16 位)乘以字操作数(也是 16 位)的结果提供双字(32 位)结果。然而,结果并没有放在eax中(这可能更容易),它放在两个寄存器中,dx用于高阶结果(16 位)和ax用于低阶结果(16 位),通常写为dx:ax(按照惯例)。
正如我正确理解的那样,结果现在在edx:eax
.
edx:eax / bVar3(签名)
...被除数需要D寄存器(用于高阶部分)和A(用于低阶部分)...如果执行了先前的乘法,则D和A寄存器可能已经正确设置(这是我的案例[OP的注释])。
和
...此外,必须将A以及可能的D寄存器组合用于被除数。
- Byte Divide: ax for 16-bits
- 字除法:dx:ax用于 32 位
- 双字除法:edx:eax用于 64 位(这是我的情况 [OP's note])
- 四字除法:rdx:rax for 128-bits
因此,最初我转换bVar3
为双字,然后将其分开:
整个代码然后
我使用调试器并查看正确答案:
但我不确定以下几点。
- 真的有必要做我做过的那些步骤吗?它是“尽可能少的行数”解决方案吗?
- 这是正确的解决方案吗?我的意思是我可能在这里犯了一个错误或错过了一些重要的事情。
PS 也许这个问题更可能是 CodeReview SE 问题。如果你也这么认为,请告诉我。