因此,作为我的计算机体系结构课程的一部分,我需要熟悉组装,或者至少足够舒适,我正在尝试向用户读取输入然后重新打印它(暂时),这就是我尝试的方式用伪代码进行说明:
- 声明 msg 变量(这将打印在屏幕上)
- 用足够长的值声明长度变量(由 sys_write 函数使用)
- 出栈一次,获取程序名
- 再次弹出堆栈以获取第一个参数
- 将堆栈的当前值移动到 msg 变量中
- 将 msg 移至 ECX(sys_write 参数)
- 将长度移动到 EDX(sys_write 参数)
- 使用标准输出调用 sys_write
- 内核调用
- 调用 sys_exit 并离开
到目前为止,这是我的代码
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,所以任何帮助都将不胜感激,我一直在看这个http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html#stack和http:// syscalls.kernelgrok.com/调整示例以根据我的理解调整注册表名称以匹配http://www.nasm.us/doc/nasmdo11.html
我正在运行 Ubuntu 12.04,64 位编译(甚至不确定这是否是正确的词)ELF64 下的 NASM,很抱歉提出这样一个愚蠢的问题,但我一直无法为使用 64 位的 NASM 找到足够简单的教程.