【发布时间】:2016-11-15 19:09:40
【问题描述】:
我尝试编写一个汇编代码来计算字符串中有多少个字符,但出现错误。
代码,我使用 gcc 和 intel_syntax
#include <stdio.h>
int main(){
char *s = "aqr b qabxx xryc pqr";
int x;
asm volatile (
".intel_syntax noprefix;"
"mov eax, %1;"
"xor ebx,ebx;"
"loop:"
"mov al,[eax];"
"or al, al;"
"jz print;"
"inc ebx;"
"jmp loop"
"print:"
"mov %0, ebx;"
".att_syntax prefix;"
: "=r" (x)
: "r" (s)
: "eax", "ebx"
);
printf("Length of string: %d\n", x);
return 0;
}
我得到了错误:
Error: invalid use of register
最后我想制作一个程序,它搜索正则表达式模式([pq][^a]+a)并打印它的起始位置和长度。我用 C 写的,但我必须让它在汇编中工作: 我的 C 代码:
#include <stdio.h>
#include <string.h>
int main(){
char *s = "aqr b qabxx xryc pqr";
int y,i;
int x=-1,length=0, pos = 0;
int len = strlen(s);
for(i=0; i<len;i++){
if((s[i] == 'p' || s[i] == 'q') && length<=0){
pos = i;
length++;
continue;
} else if((s[i] != 'a')) && pos>0){
length++;
} else if((s[i] == 'a') && pos>0){
length++;
if(y < length) {
y=length;
length = 0;
x = pos;
pos = 0;
}
else
length = 0;
pos = 0;
}
}
printf("position: %d, length: %d", x, y);
return 0;
}
【问题讨论】:
-
有错误的行号吗?
-
你不应该在编译器后面切换汇编语法,否则它会做错误的替换。如果您需要 intel 语法,请使用
-masm=intel编译器开关。 -
7 行,它开始组装块
-
@Jester 这是我教授的指令,我只能在 "mov eax, %1" 和 "print:" 之间编写代码
-
那你的教授不称职。
jmp loop之后还缺少一个分号。
标签: c string gcc assembly intel-syntax