c - 我是否错误地将参数从 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
解决方案
推荐阅读
- smooth-scrolling - 在其他人的帖子中发现的滚动平滑代码中发现了错误,但不知道如何修复
- flutter - 更新设置状态内的变量
- svg - 将 SVG 字体转换为 SVG 路径
- python - Numpy Matrix 插入的意外结果,这是如何工作的?
- c++ - 单步编译期间是否生成了目标文件?
- topojson - 我的 topojson 文件的结构是否正确以便在 folium 上渲染地图?
- python - 在python中,在二维零网格上的两点之间插入一行值
- android - Clean Architecture - 简单的视图逻辑应该在 Presenter 上还是在 View 上?
- java - 如何禁用在 EditText 中选择单词的双击?
- swift - SwiftUI 导航栏颜色