看来嵌入汇编还是挺有魅力的,让我来晒晒今天实验的代码吧!(也算文章凑数吧,无所谓了怎么说都行了!)

 这是运行效果:

代码:这段代码是内存linux0.11中学来的,语义大概是从后面搜索每字节,如果找到1就把它改成2,然后返回改动处前一个字节的地址。(可以看到显示字符串的起始地址是0x404004,后面显示的地址为404009,因为是从后往前检索)

#include <stdio.h>

#define edi_val(edi) ({ \
register unsigned int __res; \
__asm__ __volatile__("std; repne; scasb; \
	movb $2, 1(%%edi); \
	cld" \
	:"=D"(__res) \
	:"0"(edi),"a"(1)); \
__res; \
})

int main(void) {
	static char str[10] = {1,1,1,1,1,1,1,3,3,3}; //这里的static等价于汇编中的db .byte
	for(int i = 9; i >= 0; i--)
		printf("%d\t", str[i]);
	printf("\n0x%x\n", str);
	printf("0x%x\n", edi_val(str + 10 - 1));
	for(int i = 9; i >= 0; i--)
		printf("%d\t", str[i]);

}

猜你喜欢

转载自blog.csdn.net/weixin_39410618/article/details/84558433