[英]Comparing first argument in argv to a char
根据标准调用约定,argv中的参数存储在寄存器rsi中。
假设我的argc是2,命令行是这样的:
./program a
我想比较是否等于“ a”。 我有以下代码:
mov r12, rsi
mov r13, 0
mov r14, qword[r12+r13*8]
cmp r14, "a"
je Success
; Code here that displays error
Success:
; etc.
因此,我不确定自己在做什么错,但是并不能成功,但是应该正确吗?
我将不胜感激任何帮助。
a
将为argv[1]
,但是您正在加载argv[0]
(按照惯例是程序名,但是如果您的程序是通过execve()
从普通shell以外的程序调用的,则可以是NULL指针或任意字符串) 。 "a"
与指针值进行比较,而不是与指向字符串的数据进行比较。 即您编写的C版本
if( (intptr_t)argv[0] == "a" ){
success:
}
对于汇编时间常数索引,应该只使用位移而不是索引寄存器。 您可以使用汇编时间表达式(例如1 * 8
或0 * 8
以对人类看起来不错的方式编写它。
global main
main:
cmp edi, 2
jb too_few_args ; if(argc<2) avoid segfaults in both of the next 2 insns
mov rdx, [rsi + 8*1] ; r14 = argv[1]
cmp byte [rdx], "a" ; argv[1][0] == 'a'
je success
...
success:
xor eax,eax
ret ; return 0
r14
是x86-64 System V ABI中的一个保留呼叫的寄存器,因此如果您的main
call exit
返回而不是call exit
,则应将R14保留与进入时相同的值。 通过linux x86-64函数调用可以保留哪些寄存器
RDX是呼叫密集型的,因此它是暂存器的不错选择。
它还节省了一个代码大小的字节以使用RDX或其他一些不需要REX前缀而不是R8..15的暂存寄存器。 qword mov
将始终需要REX前缀,但字节cmp
则不需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.