Linux 迷失在装配NASM ELF64世界中
因此,作为我的计算机体系结构课程的一部分,我需要熟悉汇编,或者至少足够熟悉,我正在尝试读取用户的输入,然后重新打印它(暂时),这就是我如何尝试用伪代码来阐述这一点:Linux 迷失在装配NASM ELF64世界中,linux,assembly,64-bit,nasm,Linux,Assembly,64 Bit,Nasm,因此,作为我的计算机体系结构课程的一部分,我需要熟悉汇编,或者至少足够熟悉,我正在尝试读取用户的输入,然后重新打印它(暂时),这就是我如何尝试用伪代码来阐述这一点: 声明msg变量(将在屏幕上打印) 用足够长的值声明长度变量(由sys_write函数使用) 弹出堆栈一次以获取程序名 再次弹出堆栈以获取第一个参数 将堆栈的当前值移动到msg变量中 将消息移动到ECX(系统写入参数) 从Mov长度到EDX(系统写入参数) 使用标准输出调用sys_write 内核调用 呼叫系统退出并离开 这是到目前为
section .data
msg: db 'placeholder text',0xa;
length: dw 0x123;
section .text
global _start
_start:
pop rbx;
pop rbx;
; this is not working when I leave it in I get this error:
; invalid combination of opcode and operands
;mov msg, rbx;
mov ecx, msg;
mov edx, length;
mov eax, 4;
mov ebx, 1;
int 0x80;
mov ebx, 0;
mov eax, 1;
int 0x80;
当我省略它时(不将参数移到msg中),我得到这个输出
placeholder text
#.shstrtab.text.data
�@�$�`��
我们实际上刚刚开始使用NASM,因此非常感谢您的帮助,我一直在研究这个问题,并根据我的理解调整了一些示例,使注册表名称与之匹配
我正在ELF64下运行Ubuntu12.04,64位编译(甚至不确定这是否是正确的单词)NASM,很抱歉问这么一个愚蠢的问题,但我一直找不到一个足够简单的使用64位的NASM教程。您完全按照说明操作了——这是预期的输出 写入消息的堆栈变量只是一些二进制值——确切地说,它是指向包含命令行参数的字符串数组的指针。
要理解这一点,您必须打印这些字符串,或者将指针转换为ascii字符串,例如“0x12313132”。调用程序时,堆栈应如下所示:
+----------------+
| ... | <--- rsp + 24
+----------------+
| argument 2 | <--- rsp + 16
+----------------+
| argument 1 | <--- rsp + 8
+----------------+
| argument count | <--- rsp
+----------------+
由于代码在很多方面都不完善,您可能需要修改它。我的操作系统是Ubuntu 64位。编译代码时产生错误:
nasm print3.asm
print3.asm:12: error: instruction not supported in 16-bit mode
print3.asm:13: error: instruction not supported in 16-bit mode
“pop rbx”的确切位置
将“位64”添加到asm文件的顶部解决了此问题:
BITS 64
section .data
msg: db 'placeholder text',0xa;
length: dw 0x123;
...
我真的不明白你在问什么(这里面真的有问题吗?),但你写的长度是
0x123
,比实际文本长得多。这就是为什么在输出中会有很多额外的文本。这里的一些示例可能会有所帮助:附近的其他示例。谢谢Coodey,这正是我想要的!我明白了,好的,我将在将来减少我的系统写入调用的长度以避免这种情况,谢谢!
BITS 64
section .data
msg: db 'placeholder text',0xa;
length: dw 0x123;
...