1. 程式人生 > >看來嵌入彙編還是挺有魅力的,讓我來晒晒今天實驗的程式碼吧!(也算文章湊數吧,無所謂了怎麼說都行了!)

看來嵌入彙編還是挺有魅力的,讓我來晒晒今天實驗的程式碼吧!(也算文章湊數吧,無所謂了怎麼說都行了!)

 這是執行效果:

程式碼:這段程式碼是記憶體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]);

}