首页 > 解决方案 > 我是否错误地将参数从 x86 程序集中的 C 加载到寄存器中?

问题描述

所以我有这个C文件,我从stdin获得两个输入字符串,我试图将它们传递给我的汇编代码并让我的汇编代码确定第一个字符串是否会出现在字典中的第二个字符串之后,如果是,那么返回一个 1。

#include <stdio.h>

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

int main(){
        char s1[30];
        fgets(s1, 31, stdin);
        char s2[31];
        fgets(s2, 31, stdin);
        int ret = stringcheck(s1, s2);
        if(ret == 1){
                printf("True\n");
        }
        if(ret == 0){
                printf("False\n");
        }
        return 0;
}

在这个汇编代码中,我尝试将我的字符串加载到适当的寄存器中,然后在循环中使用 cmpsb 并在进位标志设置为 1 的情况下让程序跳转到“秒”。但是发生的情况是,无论输入的字符串如何总是会跳到“第二个”块并返回 9 所以我假设我在准备要检查的字符串时搞砸了。

    global stringcheck
    section .text
    stringcheck:

    ; save state of registers and setup stack frame
    push rbp
    mov rbp, rsp
    push rax
    push rbx
    push rdx

    lea rsi, [rbp+60] ; move first arg into rsi
    lea rdi, [rbp+30] ; move second arg into rdi

    mov rcx, 30 ; set up incrementer
    cld

    top:    cmpsb
    jc second
    loop top

    jmp first

    first:  pop rdx
    pop rbx
    pop rax
    mov rsp, rbp
    pop rbp
    mov rax, 1
    ret

    second: pop rdx
    pop rbx
    pop rax
    mov rsp, rbp
    pop rbp
    mov rax, 0
    ret

标签: carraysassemblyx86-64calling-convention

解决方案


推荐阅读