繁体   English   中英

将argv中的第一个参数与char比较

[英]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 * 80 * 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM