В "C" вы хотите сделать следующее:
if (strcmp(argv[3], "-a") == 0) {
/* stuff here */
}
Поскольку вы работаете без стандартной библиотеки C, вам нужно создать strcmp
самостоятельно.Это не слишком сложно, так как составляет:
int strcmp(const char* str1, const char* str2) {
while (*str1 && *str1 == *str2) {
str1++;
str2++;
}
return *str1 - *str2;
}
Или в сборке:
strcmp:
push %ebp
mov %esp, %ebp
movl 0x8(%ebp), %esi # str1
movl 0xc(%ebp), %edi # str2
1:
movb (%esi), %al
or %al, %al # *str1 zero?
jz 2f
movb (%edi), %ah
cmp %ah, %al # equal to *str2?
jne 2f
# move to next character
inc %esi
inc %edi
jmp 1b
2:
# result is difference between the two characters compared
movb (%esi), %al
subb (%edi), %al
movsx %al, %eax # Sign-extend to 32-bits
pop %ebp
ret
Конечно, если вы на самом деле не используете вычисленную разницу между строками (этополезно для сортировки) вы можете немного упростить процедуру.
И используя ее:
# [snip]
movl ST_ARGV_3(%ebp),%eax #eax contains now the alternative paramter
push %eax # first argument
pushl $dasha # second argument "-a"
call strcmp # compare strings
add $8, %esp # pop arguments
cmpl $0, %eax # Strings equal?
je strings_are_equal # Subtitute your own logic here
jmp strings_are_not_equal # and here..
Обратите внимание, что это предполагает, что у вас есть строка для сравнения с помещенной в ваш раздел данных, например:1016 *
.section .data
dasha: .asciz "-a"