问题1:我有以下汇编代码,其目的是循环输入字符串,并计算它遇到的转义字符'%'的数量:
.globl sprinter
.data
.escape_string: .string "%"
.num_escape: .long 0
.num_characters: .long 0
.text
sprinter:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%ecx # %ecx = parameter 1
loop:
cmpb $0, (%ecx) # if end of string reached
jz exit
cmpl $.escape_string,(%ecx) # if escape character found
je increment
back:
incl .num_characters
incl %ecx
jmp loop
increment:
incl .num_escape
jmp back # jump to 'back'
exit:
movl .num_escape, %eax # return num_escape
popl %ebp
ret
此汇编代码与以下 C 代码一起编译:
#include <stdio.h>
extern int sprinter (char* string);
int main (void)
{
int n = sprinter("a %d string of some %s fashion!");
printf("value: %d",n);
return 0;
}
运行此代码的预期输出是value: 2
(因为字符串中有两个 '%' 字符),但它返回value: 0
,这意味着以下行失败(因为它从不增加计数器):
cmpl $.escape_string,(%ecx) # if escape character found
我是否使用了错误的字符串比较方法?外循环工作正常,并且 .num_characters 正确包含我的字符串中的字符数。我为一个简单的 C 程序生成了一些汇编代码,该程序将字符串“hello”与“hello2”进行了比较,这是相关代码:
.LC0:
.string "hello"
.LC1:
.string "hello2"
...
movl $.LC0, -4(%ebp)
cmpl $.LC1, -4(%ebp)
它看起来与我尝试的非常相似,不是吗?
问题 2。这段代码是用汇编语言编写的简化 sprintf 函数的一部分。这意味着第一个参数应该是结果字符串,第二个参数是格式。如何将字节字符从一个寄存器中的当前位置复制到另一个寄存器中的当前位置?假设我们已将参数分配到两个寄存器中:
movl 8(%ebp),%edx # %edx = result-string
movl 12(%ebp),%ecx # %ecx = format-string
我在循环中尝试了以下内容:
movb (%ecx), %al
movb %al, (%edx) # copy current character to current position in result register
incl %ecx
incl %edx
但是结果字符串只包含a
(我的字符串中的第一个字符),而不是我预期的完整字符串。
感谢所有帮助,因为这个比较问题(问题 1)目前让我陷入困境。