ассемблер - передать параметр и использовать его в программе - PullRequest
0 голосов
/ 06 ноября 2011

Я написал небольшую ассемблерную программу, которая получает и входной файл, выходной файл и альтернативный параметр (-a или -l).Теперь я хочу различить в программе, если пользователь передал -a или -l.Я знаю, что могу передать параметр, например,% eax следующим образом:

movl 16(%ebp),%eax

Но теперь я не знаю, как сравнить% eax с -a или с -l, чтобы проверить, какой параметр был передан.Программа работает на 32-битной ОС Linux.

Может кто-нибудь дать мне подсказку, пожалуйста?

Заранее спасибо,

enne

РЕДАКТИРОВАТЬ:У меня есть x86-процессор.Вот некоторые соответствующие части кода

 .section .data 
#######PROGRAM CODE###

.section .text

#STACK POSITIONS
.equ ST_SIZE_RESERVE, 8
.equ ST_FD_IN, 0
.equ ST_FD_OUT, 4
.equ ST_ARGC, 8      #Number of arguments
.equ ST_ARGV_0, 12   #Name of program
.equ ST_ARGV_1, 16   #Input file name
.equ ST_ARGV_2, 20   #Output file name
.equ ST_ARGV_3, 24   #-a or -l or nothing
.equ ST_EXIT_CODE, 28   #Exit code

.globl _start
_start:
###INITIALIZE PROGRAM###
subl  $ST_SIZE_RESERVE, %esp       #Allocate space for our pointers on the stack
movl  %esp, %ebp

### Set standard error code 0
movl $0, %ebx
movl %ebx, ST_EXIT_CODE(%ebp)
    movl ST_ARGV_3(%ebp),%eax  #eax contains now the alternative paramter

1 Ответ

1 голос
/ 06 ноября 2011

В "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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...