这是运行效果:
代码:这段代码是内存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]);
}