将字符串参数从c传递到程序集x86

时间:2018-04-15 00:32:02

标签: c string assembly x86

所以我试图要求并接收2个单独字符串的输入。现在它们最多为30并以换行符结尾。是的,我知道整个事情不要使用fgets(),但它适用于我想要做的事情。

无论如何,有了这两个字符串,我想调用一个汇编函数来计算字符串1是否“大于”字符串2.我已经在汇编本身完成了它并且它工作正常,但是试图从ac文件中获取它是工作不正常。我想这是因为我没有正确地将字符串加载到寄存器中。以下是两个文件中的代码:

stringgt.asm:

global  stringgt

SECTION .text

stringgt:

    push    ebp                      ; setting upstack frame
    mov     ebp, esp
    mov eax, [ebp+8]     ; eax = start of string c
    mov ecx, [ebp+12]        ; ecx = start of string d
    push edx

    xor edx, edx ; index edx = 0
    cld

top:
    mov al, [eax + edx]   ;comparing first element of two strings
    cmp [ecx + edx], al
    jb output_true       ; jump to output_true if first is greater
    ja output_false      ; jump to output_false if second is greater
    cmp al, 10           ; checking for newline
    je output_false      ; if newline, then they are either equal or 2nd is greater
                         ; therefore first is not greater output false
    inc edx              ; increment index
    jmp top              ; back to start of loop

output_true:
    mov   eax, 1                 ; eax = 1, eax is return value
    jmp exit                 ; exit

output_false:
    mov   eax, 0                 ; eax = 0, eax is return value

exit:
    pop edx
    mov esp, ebp
    pop ebp
    ret

现在string.c:

#include <stdio.h>

extern int stringgt(char* s1, char* s2);

int main()
{
  char* c;
  char* d;
  printf("Type first string: ");
  fgets(c, 30, stdin);
  printf("Type second string: ");
  fgets(d, 30, stdin);
  int i = stringgt(c, d);
  if (i != 0)
  {
    printf("True\n");
  }
  else
  {
    printf("False\n");
  }
  return 0;
}

问题似乎是它几乎所有事情都是假的。我确实认为我正在将字符串加载到eax和ecx中,可能第二个字符串不是位于e​​bp + 12而是位于其他地方?

0 个答案:

没有答案