我正在处理一个Assembly GAS/AT&T x86_64赋值,它要求我们获取一些命令行参数并使用它们进行一些操作。
我已经知道了它们在堆栈中的位置,但是我不知道如何将参数的内容与另一个字符串进行比较,以检测用户是否输入了特定的参数。下面是一个最小的例子,说明我正在尝试做的事情。但是,执行永远不会到达he
子例程。
.text
output: .asciz "%s"
arg: .ascii "-i"
.global main
main:
movq 8(%rsi), %rsi
movq arg, %rdi
cmpq %rsi, %rdi
je he
movq $0, %rdi
call exit
he:
movq $output, %rdi
movq $0, %rax
call printf
movq $0, %rdi
call exit
我做错了什么?提前感谢你的帮助!
1条答案
按热度按时间a7qyws3x1#
您正在比较指向
arg
字符串的8个字节的指针。要比较字符串,由于您使用的是C运行时,因此可以像在C中一样执行此操作:用
strcmp
表示。或者,如果参数足够短并且程序非常简单,则可以取消对
strcmp
的调用以提高性能。但我不建议这样做,除非是在最简单的情况下,因为GAS doesn't support string literals as immediates和您需要自己转换字符串(注意x86的小字节序),这降低了代码的可读性。
最后,对于在POSIX系统上运行的更复杂的程序,您可能需要考虑
getopt_long
and variants。下面是一个程序示例,该程序会问候在命令行上传递的名称,并使用两个可选参数来修改其行为。
请注意
getopt_long
将如何处理参数的重新排序、处理极端情况(例如,当用户将-un X
作为-u -n X
的缩写传递时)以及为我们处理--
。您可以使用GCC编译此程序,然后以下列方式运行: