Linux nasm程序打印的参数比它应该打印的多

Linux nasm程序打印的参数比它应该打印的多,linux,command-line,nasm,Linux,Command Line,Nasm,我正在编写一个简单的程序,其中应该获取第一个命令行参数,并将其打印到标准输出。 我的代码如下所示: section .bss env resb 100 section .text global _start _start: mov rbp, rsp add rbp, 16 mov rsi, arg mov rsi, [rbp] mov rax, 1 mov rdi, 1 mov rdx, 100 syscall 因此,当我从Linux终端调用我的程序时,就像这样:/program hel

我正在编写一个简单的程序,其中应该获取第一个命令行参数,并将其打印到标准输出。 我的代码如下所示:

section .bss
env resb 100

section .text
global _start
_start:
mov rbp, rsp

add rbp, 16
mov rsi, arg
mov rsi, [rbp]

mov rax, 1
mov rdi, 1
mov rdx, 100
syscall
因此,当我从Linux终端调用我的程序时,就像这样:
/program hello
,我希望它打印出“hello”。但是输出是这样的:
helloLC\u PAPER=bs\u BA.UTF-8XDG\u VTNR=7LC\u ADDRESS=bs\u BA.UTF-8SSH\u AGENT\u PID=1483XDG\u SESSION\u ID=c2LC
。 我知道这些都是环境变量,但我就是不明白为什么会打印出来


非常感谢您的帮助。

事实上,如果您仔细检查,您会发现从内存中的“hello”地址开始打印了100个字符

替换

mov rdx, 100


您没有显示实际打印字符串的代码。所以很难回答这个问题。但是我怀疑,无论您调用什么来打印字符串,它都希望您提供一个未提供的字符串终止字符,或者它希望您在寄存器中提供未提供的字符串长度。如果您使用的是
syscall
4(
sys\u write
)然后其中一个参数必须是正在写入的缓冲区的长度(本例中为字符串)。
mov rdx, 5 ; len of "hello", instead of 100