By iteration through pointers and iterates whether or not the same code is generated by indexing

xiaoxiao2021-03-06  41

Does the compiler iterate through a pointer and whether it is an iteration of the index creates the same code? The problem comes from the "THE C Program Language" Chapter 5 Exercise 8.

The test code is as follows: (automatically generates console applications using VC.NET wizard)

#include "stdafx.h"

Void Fi (char v []) // line 5

{

For (int i = 0; v [i]! = 0; i) {

v [i] = 1;

}

}

Void fp (char v []) // line 12

{

For (char * p = v; * p! = 0; p) {

* PA = 1;

}

}

INT _TMAIN (int Argc, _tchar * argv []) // Line 19

{

Char a [8] = {'A', 'B', 'C', 'D', 'E', 'F', 'g', 'h'};

FP (a);

Fi (a);

Return 0;

}

Use the parameter FA on VC 7.NET, and the assembly code generated is as follows (not optimized):

Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077

Title ./5_8.cpp

.386P

INCLUDE LISTING.INC

... ...

IncludeLib LibCD

IncludeLib OldNames

PUBLIC? FI @@ yaxqad @ z; fi, function fi code start

EXTRN __RTC_INITBASE: NEAR

EXTRN __RTC_SHUTDOWN: NEAR

COMDAT RTC $ IMZ

File D: /VSProject/5_8/5_8.cpp

RTC $ IMZ Segment

__RTC_INITBASE.RTC $ IMZ DD FLAT: __ RTC_INITBASE

RTC $ IMZ Ends

COMDAT RTC $ TMZ

RTC $ TMZ Segment

__RTC_SHUTDOWN.RTC $ TMZ DD FLAT: __ RTC_SHUTDOWN

Function Compile Flags: / ODT / RTCSU / ZI

RTC $ TMZ ENDS

COMDAT? FI @@ yaxqad @ z

_Text segment

_i $ 10435 = -8; SIZE = 4

_v $ = 8; size = 4

? Fi @@ yaxqad @ z proc Near; Fi, Comdat

LINE 6

Push EBP

MOV EBP, ESP

SUB ESP, 204; 000000CCH

Push EBX

PUSH ESI

Push EDI

Lea EDI, DWORD PTR [EBP-204] MOV ECX, 51; 00000033H

Mov Eax, -858993460; cccccccch

Rep StosD

Line 7 // *******************************

Mov DWORD PTR _i $ 10435 [EBP], 0

JMP SHORT $ l10436

$ L10437:

Mov Eax, DWORD PTR _i $ 10435 [EBP]

Add Eax, 1

Mov DWORD PTR _I $ 10435 [EBP], EAX

$ L10436:

MOV Eax, DWORD PTR _V $ [EBP]

Add Eax, DWORD PTR _I $ 10435 [EBP]

Movsx ECX, Byte Ptr [EAX]

Test ECX, ECX

JE SHORT $ l10434

Line 8

MOV Eax, DWORD PTR _V $ [EBP]

Add Eax, DWORD PTR _I $ 10435 [EBP]

Movsx ECX, Byte Ptr [EAX]

Add ECX, 1

MOV EDX, DWORD PTR _V $ [EBP]

Add Edx, DWORD PTR_I $ 10435 [EBP]

MOV BYTE PTR [EDX], CL

LINE 9

JMP SHORT $ l10437

$ L10434:

Line 10

POP EDI

POP ESI

POP EBX

MOV ESP, EBP

POP EBP

Ret 0

? Fi @@ yaxqad @ z endp; fi

_Text Ends

PUBLIC? FP @@ yaxqad @ z; fp, function fp code start

Function Compile Flags: / ODT / RTCSU / ZI

COMDAT? FP @@ yaxqad @ z

_Text segment

_P $ 10442 = -8; SIZE = 4

_v $ = 8; size = 4

? fp @@ yaxqad @ z proc Near; FP, Comdat

LINE 13

Push EBP

MOV EBP, ESP

SUB ESP, 204; 000000CCH

Push EBX

PUSH ESI

Push EDI

Lea EDI, DWORD PTR [EBP-204]

MOV ECX, 51; 00000033H

Mov Eax, -858993460; cccccccch

Rep StosD

LINE 14 // **************************************

MOV Eax, DWORD PTR _V $ [EBP]

Mov DWORD PTR _P $ 10442 [EBP], EAXJMP SHORT $ l10443

$ L10444:

MOV EAX, DWORD PTR _P $ 10442 [EBP]

Add Eax, 1

MOV DWORD PTR _P $ 10442 [EBP], EAX

$ L10443:

MOV EAX, DWORD PTR _P $ 10442 [EBP]

Movsx ECX, Byte Ptr [EAX]

Test ECX, ECX

JE SHORT $ l10441

LINE 15

MOV EAX, DWORD PTR _P $ 10442 [EBP]

Movsx ECX, Byte Ptr [EAX]

Add ECX, 1

Mov EDX, DWORD PTR _P $ 10442 [EBP]

MOV BYTE PTR [EDX], CL

LINE 16

JMP SHORT $ l10444

$ L10441:

LINE 17

POP EDI

POP ESI

POP EBX

MOV ESP, EBP

POP EBP

Ret 0

? fp @@ yaxqad @ z endp; fp

_Text Ends

Public _main

EXTRN @ _RTC_CheckstackVars @ 8: Near

EXTRN __RTC_CHECKESP: NEAR

Function Compile Flags: / ODT / RTCSU / ZI

Comard_main

... ...

End

Note that the assembled statements before and after LINE8 and LINE15 are exactly the same. That is, without any optimization, iterates the iteration through the pointer and iterates the same code.

What is the result if it is fully optimized? For the same file, use Release in VC7.NET, open global optimization, the resulting assembly code is as follows. It can be seen that the code of the two functions is still the same.

Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077

Title ./5_8.cpp

.386P

INCLUDE LISTING.INC

... ...

Includelib Libc

IncludeLib OldNames

PUBLIC? FI @@ yaxqad @ z; fi, function fi code start

Function Compile Flags: / OGTY

COMDAT? FI @@ yaxqad @ z

_Text segment

_v $ = 8; size = 4

? Fi @@ yaxqad @ z proc Near; Fi, Comdat

File D: /VSProject/5_8/5_8.cpp

LINE 7

MOV EAX, DWORD PTR _V $ [ESP-4]

CMP Byte Ptr [EAX], 0

JE SHORT $ 1624

NPAD 7

$ L9622:

Line 8

Inc Byte PTR [EAX]

Mov Cl, Byte PTR [EAX 1]

INC EAX

TEST CL, CL

JNE SHORT $ 1622

$ L9624:

Line 10

Ret 0

? Fi @@ yaxqad @ z endp; fi

_Text Ends

PUBLIC? FP @@ yaxqad @ z; fp, function fp code start

Function Compile Flags: / OGTY

COMDAT? FP @@ yaxqad @ z

_Text segment

_v $ = 8; size = 4

? fp @@ yaxqad @ z proc Near; FP, Comdat

LINE 14

MOV EAX, DWORD PTR _V $ [ESP-4]

CMP Byte Ptr [EAX], 0

Je Short $ l9631

NPAD 7

$ L9629:

LINE 15

Inc Byte PTR [EAX]

Mov Cl, Byte PTR [EAX 1]

INC EAX

TEST CL, CL

JNE SHORT $ 1629

$ L9631:

LINE 17

Ret 0

? fp @@ yaxqad @ z endp; fp

_Text Ends

Public _main

EXTRN ___ security_cookie: DWORD

EXTRN @__ security_check_cookie @ 4: Near

Function Compile Flags: / OGTY

Comard_main

... ...

End

转载请注明原文地址:https://www.9cbs.com/read-50947.html

New Post(0)