问题标签 [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.

0 投票
1 回答
3572 浏览

assembly - 在 YASM 或 NASM 程序集中执行退格键

我有一个程序以原始模式读取字符。也就是说,任何输入的字符都会被立即读取,而不是被缓冲。

我想知道如何执行退格。也就是说,当我按下退格键时,它应该删除左边的字符并将光标向左移动一位。

我尝试输出一个退格字符,后跟一个空格字符。由于某种原因,这会删除左侧的字符,但会将光标向右移动两个空格。

我也尝试过自己输出 Backspace 字符。这会将光标向左移动一格,但不会删除字符。

我的汇编程序是 YASM,我使用的是 64 位 Linux。下面是一些相关的代码。

首先,这是我用来输出字符的函数:

以下代码打印退格键。它不会像您的常规 Backspace 那样将光标向左移动一位。

此代码打印一个退格键,后跟一个空格键。它将光标向右移动两个空格而不是一个空格。

Len 建议打印 Backspace,然后是 Space,然后是 Backspace。这似乎有效:

请注意,正如我之前提到的,我正在以原始模式读取字符。提前致谢!

0 投票
2 回答
19808 浏览

assembly - tword、oword 和 yword 操作数的大小是多少?

NASM / YASM 手册中使用的大小tword和操作数是多少?在相关的说明中,这些名称是否有技巧或潜在的想法?有没有办法给更大的字长赋予逻辑名称?owordyword

我知道虽然系统之间的字长可能不同,但 NASMword是 2 个字节,dword是两倍(4 个字节),qword是一个四字(8 个字节),但是......是tword一个三字(6 个字节)?而且我什owordyword想不出一个似是而非的意思。

请注意,这可能是一个简单的问题,但我找不到答案。在 NASM 和 YASM 手册中没有解释这些大小,甚至在DQ, DT, DY, RESQ, REST,RESY伪指令中也没有解释。我在某处读到 MASM 使用类似的系统,但也找不到任何东西。


编辑:根据答案,这是完整列表:

  • 1 字节(8 位):byte, DB,RESB
  • 2 个字节(16 位):word, DW,RESW
  • 4 字节(32 位):dword, DD,RESD
  • 8 字节(64 位):qword, DQ,RESQ
  • 10 字节(80 位):tword, DT,REST
  • 16 字节(128 位):oword, DO, RESO, DDQ,RESDQ
  • 32 字节(256 位):yword, DY,RESY
  • 64 字节(512 位):zword, DZ,RESZ
0 投票
3 回答
1796 浏览

linux - 如何避免不适合缓冲区的标准输入被发送到 Linux 64 位 Intel (x86-64) 程序集中的 shell

编辑:标题已更改,正如@Gunner 指出的那样,这不是缓冲区溢出。

在从 Linux 64 位 Intel 程序集中读取用户输入时stdinNR_read我想知道如何避免将不适合输入缓冲区的输入发送到 Linux shell,例如。重击?例如,在这个示例程序中,我定义了一个 255 字节的输入缓冲区(缓冲区的大小可以是 >= 1)。超过 255 字节的输入的其余部分被发送到 bash(如果从 bash 运行),这显然是一个严重的漏洞。应该如何在 Linux 64 位汇编中读取输入以避免此漏洞?

这是我的代码:

0 投票
3 回答
4484 浏览

assembly - 构建 YASM/NASM Hello World 时遇到问题

我正在尝试将hello.asm构建到 Windows 可执行文件中,但是当我使用建议的命令来组装、链接和编译代码时,我得到了错误。无论我使用的是Strawberry Perl的 GCC 还是MinGW的 GCC,都会对相同的 YASM/NASM 代码给出错误。

这是痕迹。要么我在 Makefile 或 .ASM 中做错了,要么链接过程有问题。无论哪种方式,我都希望有人帮助我解决错误。

无论我使用 nasm 还是 yasm 来组装目标文件,我都会得到相同的结果。

草莓 Perl GCC 跟踪:

MinGW GCC 跟踪:

眼镜:

  • 雅思 1.2.0
  • NASM 2.10.05
  • 草莓 Perl gcc 4.4.3
  • MinGW gcc 4.5.2
  • 草莓 Perl 5.12
  • MinGW 0.1
  • Windows 7 专业版 x64
  • MacBook Pro 2009
0 投票
2 回答
3814 浏览

macos - MacOS Mountain Lion 中带有 yasm 的简单 asm 程序

我想以 64 位编译和执行一个非常简单的程序。

编译它的行:

还尝试了另一种格式macho[|32|64], elf[|32] bin,但都没有成功。

链接它的行:

还尝试了一些选项,gcc例如-m64 -arch x86_64.

0 投票
2 回答
2132 浏览

makefile - Makefile 错误 - make: *** No rule to make target `boot.o', `all' 需要。停止

我正在完成一个类似unix的内核开发教程,并且遇到了一个我敢肯定的菜鸟问题:谁能告诉我这有什么问题?

提前致谢

0 投票
1 回答
2203 浏览

assembly - Yasm 使用 intel 语法编译 64 位代码

我有这个文件:

使用以下指令与 yasm 很好地编译:

我的问题是:有没有办法使用 nasm 解析器通过 intel 语法编译 64 位代码?我不太喜欢 AT&T 语法

0 投票
1 回答
1310 浏览

macos - Mac OS X:YASM:错误:macho:抱歉,无法在 64 模式下应用 32 位绝对重定位

NASM 编译得很好,但是当我使用 YASM 时出现以下错误:

hello.asm:12:错误:macho:抱歉,不能在 64 位模式下应用 32 位绝对重定位,请考虑“[_symbol wrt rip]”用于内存访问,“qword”和“dq _foo”用于指针。

生成文件

系统公司

你好.asm

有谁知道发生了什么?如果你能解释为什么 NASM 有效,但 YASM 不是,那将是一个奖励。

0 投票
2 回答
313 浏览

x86 - x86:为什么在移动到内存地址时未设置进位标志?

我意识到这可能看起来像一个骗局,但我没有发现任何与我的问题很相似的东西。说我有 yasm:

为什么在进入 a 时不设置进位标志?只是一个字节!当我清楚地移入它时,它比一个字节大得多。事实上,在 gdb 中,整个数字都存储在 a 中。鉴于它的声明,这怎么可能?

0 投票
1 回答
290 浏览

assembly - 在 VSYASM 中使用 win64 展开数据指令

代码一切正常,但后来我添加了创建展开数据的指令,而 YASM 开始拒绝汇编我的代码。

构建设置适用于 x64,如自动生成的命令行中的“-f x64”所示:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\"vsyasm.exe -Xvc -f x64 -o "x64\Debug\\" -l "" -P "" --mapdir= "" -E "" --prefix "" --suffix "" -rnasm -pnasm -m amd64

通常-m开关不在那里,但我添加它是为了很好的衡量。那没有帮助。

-f将switch的参数更改为win64也无济于事:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\"vsyasm.exe -Xvc -f win64 -o "x64\Debug\\" -l "" -P "" --mapdir= "" -E "" --prefix "" --suffix "" -rnasm -pnasm -m amd64

在这段代码中,

VSYASM 抱怨函数标签的重新定义,这可能意味着它没有被识别proc_frame为指令。它也说error: unrecognized directive 'alloc_stack'和相同的save_xmm128。它不抱怨endprolog

放入proc_frame括号会使第一个错误消失(标签重新定义),但手册说不带括号使用它,无论如何它并不能解决问题。

我该如何解决?最好以创建适当展开数据的方式。