Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 迷失在装配NASM ELF64世界中_Linux_Assembly_64 Bit_Nasm - Fatal编程技术网

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 内核调用 呼叫系统退出并离开 这是到目前为

因此,作为我的计算机体系结构课程的一部分,我需要熟悉汇编,或者至少足够熟悉,我正在尝试读取用户的输入,然后重新打印它(暂时),这就是我如何尝试用伪代码来阐述这一点:

  • 声明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;
    
    ...