nasm相关内容
我想在 linux 中从汇编语言中调用 printf 函数. 我想知道 64 位和 32 位汇编语言程序的方法. 1) 如果我想在 printf 中用字符串传递 32 位论证和 64 位论证,请告诉我两种情况.我该怎么做? 2) 对于 x86 32 位架构,如果我想做与第 1 点相同的事情. 请告诉我代码.让我知道我是否需要为这两种情况调整堆栈,我是否只需要在寄存器中传递参
..
我正在将共享库从 32 位移植到 64 位.它由一些程序集(为 NASM 编写)组成,该程序集导出多个程序和一些更高级别的 C 粘合代码.我正在使用 NASM 2.10.01 和 GNU ld 2.22 的 64 位 Debian 机器上构建. 解决了所有推送/弹出问题(推送寄存器的 32 位部分显然在 64 位模式下不起作用)后,我有要组装的对象,但现在我被链接阶段暂停了.这是我的命令行
..
编辑: 我接受了下面的答案,并在代码的最终修订版中添加了我自己的答案.希望它向人们展示Shadow Space分配的实际例子,而不是更多的文字. 编辑 2:我还设法在 YouTube 视频的注释(所有内容)中找到了调用约定 PDF 的链接,该视频在 Linux 上的 Shadow Space 和 Red Zone 上有一些有趣的花絮.可以在这里找到:http://www.agner.o
..
我正在尝试在 64 位系统上使用 NASM 和 GCC 组装一些 32 位代码.我使用以下两个命令 nasm -f elf32 -g -F stabs coc.asmgcc -m32 -o coc coc.o NASM 看起来不错,但 LD 抱怨: /usr/bin/ld: 找不到 crt1.o: 没有那个文件或目录/usr/bin/ld: 找不到 crti.o: 没有那个文件或目录/usr
..
使用 NASM 和 Mingw-w64 我一直在尝试运行以下程序,该程序应该使用 Windows API 将消息打印到屏幕上.它运行,但控制台上没有显示任何内容,并导致对内存位置的无效访问(错误代码 0x3e6h).为什么会这样,我怎样才能让程序正常运行? 全局主外部退出进程外部获取标准句柄外部写入文件节.text主要的:mov rcx, 0fffffff5h调用 GetStdHandlemov
..
我知道在 x86_64 程序集中有(64 位)rax 寄存器,但它也可以作为 32 位寄存器 eax、16 位、ax 和 8 位、al 访问.在什么情况下我不会只使用完整的 64 位,为什么,会有什么优势? 以这个简单的 hello world 程序为例: section .datamsg: db "Hello World!", 0x0a, 0x00len: 等 $-msg节.text全局
..
我正在学习 ASM,但遇到了一个小问题.我不能在“section.data"中“声明"多个字符串.我正在尝试这样的事情: section .datastring1 db "test1 ", 0;string2 db "test2 ", 0;节.text全局 _test外部_puts_测试:lea rdi, [rel string1]看跌期权lea rdi, [rel string2]看跌期权退
..
我正在尝试使用 NASM 学习 MacOS 程序集,但我无法让一个简单的程序运行.我正在尝试“Hello, World"的变体,其中两个词由宏独立调用.我的源代码如下所示: %macro printString 2移动 rax, 0x2000004 ;写mov rdi, 1 ;标准输出mov rsi, %1移动 rdx, %2系统调用% 宏全局开始节.text开始:打印字符串 str1,str1
..
我正在尝试在我的 64 位 Linux 上编译 32 位汇编代码(NASM),但我不能,我已经尝试了其他教程,我安装了 ia32-libs... 当我尝试将其运行为: gcc asm1.o -o asm1 文件输入 `asm1.o' 的 i386 与输出 i386:x86-64 不兼容 当我尝试将其运行为: gcc -m32 asm1.o -o asm1 /usr/bin/ld
..
我正在使用 NASM 开发更深入的 hello world 以下本教程(第 4 节).本教程主要教您如何处理命令行输入. 这是有问题的代码片段: section .text全局_start_开始:流行 ebx ;参数计数流行 ebx ;arg[0] 程序名称流行 ebx ;arg[1-n] 剩余的 args;每个都必须单独弹出 代码在编译过程中出错,error:指令在64位模式下不支持,参考
..
我需要在汇编程序中确定数组中负数和正数的数量.汇编程序似乎没有将它们识别为负数.我怎么解决这个问题?我这样定义数组: word_array db 3, -2, 11, -1, -2, -7, -5, -20 我有这个计算正数的函数: count_positives:mov dx, word [word_array + 2*ecx - 2]cmp edx, 0JL跳过公司跳过:loopnz c
..
假设您在 EAX 中存储了一个数字.如何检查这个数字是否代表大写字符? 坦率地说,我什么都没试过.我最接近的想法是创建一个大写字符数组 ('A','B','C,'D',...) 然后检查 EAX 是否等于 any这些.在 NASM Assembly 中有没有更简单的方法来做到这一点? 对于 32 位程序,我使用的是 64 位 CentOS. 解决方案 对于 ASCII 字符,类
..
我正在做大学时的理论考试,有人问我这个问题:经过一些指令,esp 增长了 4,eip 增长了 20,可能是什么指令?我标记了“pop eip"和“ret".nasm 32位汇编中是否可以执行pop eip指令? 解决方案 pop eip 不是真正的 x86 指令. 没有汇编程序会汇编它,AFAIK. 这是用于解释 ret 做什么的伪代码.请参阅手册中的操作部分.特别是一个正常的“接近"r
..
我是一个初学者,正在编写汇编程序以使用以下代码打印从 1 到 9 的数字: section .text全局_start_开始:mov ecx,10移动 eax, '1'l1:mov [num], eax移动轴,4mov ebx, 1推ECXmov ecx, 编号mov edx, 1整数 0x80mov eax, [num]子 eax, '0'公司添加 eax, '0'流行音乐循环 l1mov e
..
我对程序集很陌生,我正在尝试使用程序.因此,每当我尝试编译它时,都会收到该行的错误,如代码中的注释下所列. 我想知道是否有人知道为什么在我为其余的汇编代码定义某些内容时 NASM 会检测到此错误? 也许它与 main 的定义方式有关? 附言我只列出了代码的第一部分,因为程序很长. 感谢您的帮助 .xlist ;尝试在任何非本地标签之前定义本地标签包括 stdlib.a ;
..
我对程序集很陌生,我正在尝试使用程序.因此,每当我尝试编译它时,都会收到该行的错误,如代码中的注释下所列. 我想知道是否有人知道为什么在我为其余的汇编代码定义某些内容时 NASM 会检测到此错误? 也许它与 main 的定义方式有关? 附言我只列出了代码的第一部分,因为程序很长. 感谢您的帮助 .xlist ;尝试在任何非本地标签之前定义本地标签包括 stdlib.a ;
..
我正在编写一个汇编程序,我希望能够执行以下(基本)操作: x = 100;y = 整数 [x] 例如y 的大小取决于 x 的值. 注意:我在 64 位 Ubuntu 系统上使用 NASM 指令集. 在汇编中,我知道需要在文件的数据部分中声明数组的大小,例如 myvariable resq 1000 问题是在我完成之前的计算之前我不知道它有多大.我真正想要的是: mov rax
..
我正在尝试读取传递给我的可执行文件的文件名并使用程序集写入该文件.它编译没有错误,但在执行时失败.我的代码到底有什么问题? BITS 32段.data文本数据库“文本".text 段全球主要主要的:流行音乐流行音乐流行 ebx ;将指向文件名的指针弹出到 ebxmov eax,0x5 ;系统调用打开mov ecx,0x2 ;标志读/写int 0x80 ;调用内核mov ebx,eax ;保存返回
..
我想将 argv[0] 存储在寄存器中然后打印它,但是当我运行我的汇编程序时出现了段错误. 跟踪: $ nasm -f macho -o scriptname.o --prefix _ scriptname.asm$ ld -o 脚本名 scriptname.o -arch i386 -lc -macosx_version_min 10.6 -e _start -no_pie$ ./脚本名
..
花了一段时间,但终于在 16 位图形中获得了平方 1.在这里,我清除屏幕并绘制一个像素: mov ax, 0a000h移动,斧头;es - Extra Segment 现在指向 VGA 位置mov ax, 0013h10 小时异或mov dx, 3c8h出 dx, al公司 dx运动, 63出 dx, al出 dx, al出 dx, almov ax, 0100h21 小时mov ax, 4c0
..