بالنسبة لوجود الgoto في الكود source level فلا توجد مشكله بتاتا في حال تم استخدام الgoto مكان الcontinue ، لكن فقط لن يسهل قرائه الكود وتتبعه ، يعني الأمر في الReadability ، لذلك يتم تجنبها خصوصا كلما يكبر المشروع ،،
بالنسبة للbinary level فلا فرق بينهم أيضا ، وكلاهم يولد نفس الكود ، كما سيلي ذلك :
المثال الأول :
#include <stdio.h>
int main () {
int x = 0;
while( x < 10) { //The condition...
x++;
if( (x%2) == 0 )//Is it an even number?
continue; //return to the condition
printf("x = %d\n",x);
}
return (0);
}بعد عمل disassembling للكود :
C:\Documents and Settings\wgdee\Desktop>gcc test.c -g -o a.exe C:\Documents and Settings\wgdee\Desktop>gdb -q a.exe (gdb) set dis intel (gdb) disassemble main Dump of assembler code for function main: 0x004012f0 <main+0>: push ebp 0x004012f1 <main+1>: mov ebp,esp 0x004012f3 <main+3>: sub esp,0x18 0x004012f6 <main+6>: and esp,0xfffffff0 0x004012f9 <main+9>: mov eax,0x0 0x004012fe <main+14>: add eax,0xf 0x00401301 <main+17>: add eax,0xf 0x00401304 <main+20>: shr eax,0x4 0x00401307 <main+23>: shl eax,0x4 0x0040130a <main+26>: mov DWORD PTR [ebp-0x8],eax 0x0040130d <main+29>: mov eax,DWORD PTR [ebp-0x8] 0x00401310 <main+32>: call 0x401870 <_alloca> 0x00401315 <main+37>: call 0x4013f0 <__main> 0x0040131a <main+42>: mov DWORD PTR [ebp-0x4],0x0 0x00401321 <main+49>: cmp DWORD PTR [ebp-0x4],0x9 0x00401325 <main+53>: jg 0x40134d <main+93> 0x00401327 <main+55>: lea eax,[ebp-0x4] 0x0040132a <main+58>: inc DWORD PTR [eax] 0x0040132c <main+60>: mov eax,DWORD PTR [ebp-0x4] 0x0040132f <main+63>: and eax,0x1 0x00401332 <main+66>: test eax,eax 0x00401334 <main+68>: jne 0x401338 <main+72> 0x00401336 <main+70>: jmp 0x401321 <main+49> 0x00401338 <main+72>: mov eax,DWORD PTR [ebp-0x4] 0x0040133b <main+75>: mov DWORD PTR [esp+0x4],eax 0x0040133f <main+79>: mov DWORD PTR [esp],0x403000 0x00401346 <main+86>: call 0x4018d0 <printf> 0x0040134b <main+91>: jmp 0x401321 <main+49> 0x0040134d <main+93>: mov eax,0x0 0x00401352 <main+98>: leave 0x00401353 <main+99>: ret End of assembler dump. (gdb)
اما البرنامج الثاني :
#include <stdio.h>
int main () {
int x = 0;
lbl:
while( x < 10) { //The condition...
x++;
if( (x%2) == 0 )//Is it an even number?
goto lbl;
printf("x = %d\n",x);
}
return (0);
}الDisassembling له :
C:\Documents and Settings\wgdee\Desktop>gcc test2.c -g -o b.exe C:\Documents and Settings\wgdee\Desktop>gdb -q b.exe (gdb) set dis intel (gdb) disasemble main Undefined command: "disasemble". Try "help". (gdb) disassemble main Dump of assembler code for function main: 0x004012f0 <main+0>: push ebp 0x004012f1 <main+1>: mov ebp,esp 0x004012f3 <main+3>: sub esp,0x18 0x004012f6 <main+6>: and esp,0xfffffff0 0x004012f9 <main+9>: mov eax,0x0 0x004012fe <main+14>: add eax,0xf 0x00401301 <main+17>: add eax,0xf 0x00401304 <main+20>: shr eax,0x4 0x00401307 <main+23>: shl eax,0x4 0x0040130a <main+26>: mov DWORD PTR [ebp-0x8],eax 0x0040130d <main+29>: mov eax,DWORD PTR [ebp-0x8] 0x00401310 <main+32>: call 0x401870 <_alloca> 0x00401315 <main+37>: call 0x4013f0 <__main> 0x0040131a <main+42>: mov DWORD PTR [ebp-0x4],0x0 0x00401321 <main+49>: cmp DWORD PTR [ebp-0x4],0x9 0x00401325 <main+53>: jg 0x40134d <main+93> 0x00401327 <main+55>: lea eax,[ebp-0x4] 0x0040132a <main+58>: inc DWORD PTR [eax] 0x0040132c <main+60>: mov eax,DWORD PTR [ebp-0x4] 0x0040132f <main+63>: and eax,0x1 0x00401332 <main+66>: test eax,eax 0x00401334 <main+68>: jne 0x401338 <main+72> 0x00401336 <main+70>: jmp 0x401321 <main+49> 0x00401338 <main+72>: mov eax,DWORD PTR [ebp-0x4] 0x0040133b <main+75>: mov DWORD PTR [esp+0x4],eax 0x0040133f <main+79>: mov DWORD PTR [esp],0x403000 0x00401346 <main+86>: call 0x4018d0 <printf> 0x0040134b <main+91>: jmp 0x401321 <main+49> 0x0040134d <main+93>: mov eax,0x0 0x00401352 <main+98>: leave 0x00401353 <main+99>: ret End of assembler dump. (gdb)
;كما نشاهد بدءا من أول تعلمية في البرنامج (في عنوان 0x0040131a فما قبل ذلك كله تهيئة للمكدس Function prolog) سنجد ان البرنامجين متطابقين تماما ،
والله أعلم :) .
http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة
https://moalfat.com للكتب الالكترونية والكورسات التعليمية
Everything we see now is just an engineering solution based on old science


