c语言循环结构体数组结束,简单C语言反汇编(循环,判断,数组,结构体,共用体,枚举类型)...

关键一句:以C语言为母语的程序员,常常

找一些汇编语言改写为C语言,是学习汇编

的快捷方式之一。

0818b9ca8b590ca3270a3433284dd417.png

一,for循环

int myfunction(int a,int b)

{

int c=a+b;

int i;

for(i=0;i<50;i++)

{

c=c+i;

}

return c;

}

for(i=0;i<50;i++)

dword ptr [i],0

myfunction+39h (412BD9h)

00412BD0h          eax,dword ptr [i]

eax,1

dword ptr [i],eax

00412BD9h          dword ptr [i],32h

jge myfuntion+4Ah (412BEAh)     ;jge指令,两数比较,前者大于等于后者则跳转

{

c=c+i;

mov eax,dword ptr [c]

add eax,dword ptr [i]

mov dword ptr [c],eax

}

jmp myfuntion+30h (412BD0h)

00412BEAh         mov eax,dword ptr [c]

反汇编后的结构大意:

mov ,                  ;给循环变量赋初值

jmp B                                                  ;跳到第一次循环处

A:(改动循环变量)                                ;修改循环变量

……

B:cmp ,              ;检查循环条件

jge 跳出循环

(循环体)

……

jmp A                                                   ;跳回去修改循环变量

二,do循环

do{

c=c+1;

00411A55h mov eax,dword ptr [c]

add eax,dword ptr [i]

mov dword ptr [c],eax

}while(c<100);

cmp dword ptr [c],64h

jl myfunction+35h (411A55h)    ;汇编语言中条件转移语句:JL/JNGE, 用于有符号数的条件转移指令,小于\不大于且不等于转移;

return c;

……

三,while循环

while(c<100){

00411A55h       cmp dword ptr [c],64h

jge myfuntion+64h (411A66h)

c=c+1;

mov eax,dword ptr [c]

add eax,dword ptr [i]

00411A64h       mov dword ptr [c],eax

}

jmp myfuntion+35h (411A55h)

四,if-else判断分支

if(c>0&&c<10)

{

printf("c>0");

}

else if(c>10&&c<10)

{

printf("c>10&&c<100");

}

else

{

printf("c>10&&c<100");

}

if(c>0&&c<10)

00411A66     cmp dword ptr [c],0

00411A6A     myfunction+61h (411A81h)

00411A6C     cmp dword ptr [c],0Ah

00411A70     jge myfunction+61h (411A81h)

{

printf("c>0");

00411A72     push offset string "c>0"(4240Dch)

00411A77     call @ILT+1300(_printf) (411519h)

00411A7C     add esp,4

}

else if(c>10&&c<100)

00411A7F    jmp myfunction+89h (411AA9h)

00411A81    cmp dword ptr [c],0Ah

00411A85    jle myfuntion+7ch (411A9Ch)

00411A87    cmp dword ptr [c],64h

00411A8B    jge myfunction+7Ch (411A9ch)

五,switch-case判断分支

switch(c)

{

case 0:

printf("c>0");

case 1:

{

printf("c>10&&c<100");

break;

}

default:

printf("c>10&&c<100");

}

switch(c)

00411A66   mov eax,dword ptr [c]

00411A69   mov dword ptr [ebp-0E8h],eax

00411A6F   cmp dword ptr [ebp-0E8h],0

00411A76   je myfuntion+63h (411A93h)

00411A78   cmp dword ptr [ebp-0E8h],1

00411A7F   je myfuntion+70h (411A90h)

00411A81   jmp myfuntion+7Fh (411A9Fh)

case 0:

printf("c>0");

00411A83   push offset string "c>0"(4240DCh)

00411A88   call @ILT+1300(_printf)(411519h)

00411A8D  add esp,4

case 1:

{

printf("c>10&&c<100");

00411A90  push  offset string "c>10&&c<100"(424288h)

00411A95  call @ILT+1300(_printf)(411AACh)

00411A9A add esp,4

break;

00411A9D jmp myfunction+8Ch(411AACh)

}

default:

printf("c>10&&c<100");

00411A9F  push offset string "c>10&&c<100"(424288h)

00411AA4 call @ITL+1300(_printf)(411519h)

00411AA9  add esp,4

}

六,C语言数组与结构

typedef struct{

int a;

int b;

int c;

}mystruct;

int myfunction(int a,int b)

{

unsigned char *buf[100];

mystruct *str=(mystruct *)buf;

int i;

for(i=0;i<5;i++)

{

strs[i].a=0;

strs[i].b=1;

strs[i].c=2;

}

return 0;

}

int i;

for(i=0;i<5;i=+)

mov dword ptr [i],0

jmp myfunction=45h (413695h)

00413686h      mov eax,dword ptr [i]

add eax,1

mov dword ptr [i],eax

00413695h   cmp dword ptr [i],5

jge myfuntion+94h (4136E4h)

{

strs[i].a=0;

mov eax,dword ptr [i]

imul eax,eax,0ch

mov ecx,dword ptr [strs]

mov dword ptr [ecx+eax],0

strs[i].b=1;

mov eax,dword ptr [i]

imul eax,eax,0ch

mov ecx,dword ptr [strs]

;这里与.a不同,增加偏移量取得b的位置

mov dword ptr [ecx+eax+4],1

strs[i].c=2;

mov eax,dword ptr [i]

imul eax,eax,0ch

mov ecx,dword ptr [strs]

mov dword ptr [ecx+eax+8],2

}

jmp myfunction+36h(413686h)

004136E4   xor eax,eax

imul这个指令令人想到结构体数组,这是一个特征。程序在访问一个结构体的数组时,往往需要得到数组中某个结构体元素的开始地址。很显然,某个元素的起始位置=下标*单个元素的长度+数组的起始地址。

七,C语言的共用体和枚举类型

typedef enum{

ENUM_1=1,

ENUM_2=2,

ENUM_3,

ENUM_4,

}myenum;

typedef struct{

int a;

int b;

int c;

}mystruct;

typedef union{

mystruct s;

myenum e[3];

}myunion;

int myfunction(int a,int b)

{

unsigned char buf[100]={0};

myunion *uns=(myunion *)buf;

int i;

for(i=0;i<5;i++)

{

uns[i].s.a=0;

uns[i].s.b=1;

}

return 0;

}

for(i=0;i<5;i++)

mov dword ptr [i],0

jmp myfuntion+49h(411A69h)

00411A60     mov eax,dword ptr [i]

add eax,1

mov dword ptr [i],eax

00411A69    cmp dword ptr [i],5

jge myfunction+83h(411AA3h)

{

uns[i].s.a=0;

mov eax,dword ptr [i]

imul eax,eax,0ch

mov ecx,dword ptr [uns]

mov dword ptr [ecx+eax],0

uns[i].s.b=1;

mov eax,dword ptr [i]

imul eax,eax,0ch

mov ecx,dword ptr [uns]

mov dword ptr [ecx+eax+4],1

uns[i].e[2]=ENUM_4;

mov eax,dword ptr [i]

imul eax,eax,0ch

mov ecx,dword ptr [uns]

mov dword ptr [ecx+eax+8],4

}

jmp myfunction+40h (411A60h)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以通过结构体数组循环右移来实现将结果保存到新的结构体数组,同时保持原来的结构体数组不变。下面是一个示例代码: ```c #include <stdio.h> #define SIZE 5 // 定义结构体 typedef struct { int id; char name[20]; } Student; // 结构体数组循环右移函数 void rotateRight(Student* src, Student* dest, int size, int shift) { for (int i = 0; i < size; i++) { int newIndex = (i + shift) % size; dest[newIndex] = src[i]; } } int main() { // 原始结构体数组 Student students[SIZE] = { {1, "Alice"}, {2, "Bob"}, {3, "Charlie"}, {4, "David"}, {5, "Eve"} }; // 新的结构体数组 Student rotatedStudents[SIZE]; // 循环右移并保存结果到新的结构体数组 rotateRight(students, rotatedStudents, SIZE, 2); // 打印原始结构体数组 printf("原始结构体数组:\n"); for (int i = 0; i < SIZE; i++) { printf("id: %d, name: %s\n", students[i].id, students[i].name); } // 打印循环右移后的新结构体数组 printf("循环右移后的新结构体数组:\n"); for (int i = 0; i < SIZE; i++) { printf("id: %d, name: %s\n", rotatedStudents[i].id, rotatedStudents[i].name); } return 0; } ``` 运行以上代码,将会得到以下输出: ``` 原始结构体数组: id: 1, name: Alice id: 2, name: Bob id: 3, name: Charlie id: 4, name: David id: 5, name: Eve 循环右移后的新结构体数组: id: 4, name: David id: 5, name: Eve id: 1, name: Alice id: 2, name: Bob id: 3, name: Charlie ``` 以上代码中,`rotateRight`函数实现了结构体数组循环右移操作,将结果保存到新的结构体数组`dest`中。在`main`函数中,我们定义了一个原始的结构体数组`students`,并调用`rotateRight`函数将结果保存到新的结构体数组`rotatedStudents`中。最后,我们分别打印了原始结构体数组循环右移后的新结构体数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值