-
Data: 2022-08-27 06:27:50
Temat: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
Od: JDX <j...@o...pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]On 26.08.2022 20:25, Atlantis wrote:
[...]
> Czy nie istnieje np. ryzyko, że kompilator spróbuje to niejawnie
> zoptymalizować i zdefiniuje sobie we flashy łańcuchu "Lights ", "on"
> oraz "off", a potem będzie tworzył ich kombinacje na stosie, przed
> przekazaniem w argumencie funkcji?
Skompiluj sobie do assemblera z parametrem -fverbose-asm np. taki programik:
===================== CIĄĆ TUTAJ=========================
void send(const char* str);
const int x = 5;
const int a;
int main(int argc, char *argv[])
{
const int y = 7;
static const int z = 8;
const char *s = "dupa";
const int t[] = {1, 2, 3, 4, 5};
send("Lights on");
send("Lights off");
return 0;
}
===================== CIĄĆ TUTAJ=========================
Np. w przypadku ARM-a wychodzi coś takiego:
===================== CIĄĆ TUTAJ=========================
.cpu arm7tdmi
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1 @ Tag_ABI_FP_denormal
.eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions
.eabi_attribute 23, 3 @ Tag_ABI_FP_number_model
.eabi_attribute 24, 1 @ Tag_ABI_align8_needed
.eabi_attribute 25, 1 @ Tag_ABI_align8_preserved
.eabi_attribute 26, 1 @ Tag_ABI_enum_size
.eabi_attribute 30, 6 @ Tag_ABI_optimization_goals
.eabi_attribute 34, 0 @ Tag_CPU_unaligned_access
.eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t
.file "testargt.c"
@ GNU C17 (GNU Toolchain for the Arm Architecture 11.2-2022.02
(arm-11.16)) version 11.2.1 20220111 (arm-none-eabi)
@ compiled by GNU C version 7.3-win32 20180312, GMP version 6.2.1, MPFR
version 3.1.6, MPC version 1.0.3, isl version isl-0.15-1-g835ea3a-GMP
@ GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
@ options passed: -mcpu=arm7tdmi -mfloat-abi=soft -marm -march=armv4t
.text
.global x
.section .rodata
.align 2
.type x, %object
.size x, 4
x:
.word 5
.global a
.align 2
.type a, %object
.size a, 4
a:
.space 4
.align 2
LC0:
.ascii "dupa\000"
.align 2
LC1:
.ascii "Lights on\000"
.align 2
LC2:
.ascii "Lights off\000"
.text
.align 2
.global main
.syntax unified
.arm
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 1, uses_anonymous_args = 0
push {fp, lr} @
add fp, sp, #4 @,,
sub sp, sp, #16 @,,
str r0, [fp, #-16] @ argc, argc
str r1, [fp, #-20] @ argv, argv
@ testargt.c:8: const int y = 7;
mov r3, #7 @ tmp115,
str r3, [fp, #-8] @ tmp115, y
@ testargt.c:10: const char *s = "dupa";
ldr r3, .L3 @ tmp116,
str r3, [fp, #-12] @ tmp116, s
@ testargt.c:13: send("Lights on");
ldr r0, .L3+4 @,
bl send @
@ testargt.c:14: send("Lights off");
ldr r0, .L3+8 @,
bl send @
@ testargt.c:16: return 0;
mov r3, #0 @ _6,
@ testargt.c:17: }
mov r0, r3 @, <retval>
sub sp, fp, #4 @,,
@ sp needed @
pop {fp, lr} @
bx lr @
L4:
.align 2
L3:
.word .LC0
.word .LC1
.word .LC2
.size main, .-main
.section .rodata
.align 2
.type t.0, %object
.size t.0, 20
t.0:
.word 1
.word 2
.word 3
.word 4
.word 5
.align 2
.type z.1, %object
.size z.1, 4
z.1:
.word 8
.ident "GCC: (GNU Toolchain for the Arm Architecture 11.2-2022.02
(arm-11.16)) 11.2.1 20220111"
===================== CIĄĆ TUTAJ=========================
Jak widać, stringi lądują w sekcji .rodata (czasami nazywanej też
rdata), która w przypadku systemów embedded zazwyczaj jest umieszczana
we Flashu (aczkolwiek ktoś na starcie systemu może chcieć skopiować ją
do SRAM, bo odczyty z SRAM są szybsze). I tak jest ,,wszędzie". Natomiast
const-y ,,typów prostych" zazwyczaj również lądują w .rodata, ale nie
zawsze - na ARM (jak widać) czy na x86-64 tak, ale na MIPS już nie
(tutaj w sekcji .sdata - ,,small data").
Powyższe dotyczy oczywiście jedynie słusznego kompilatora, czyli gcc.
Następne wpisy z tego wątku
- 27.08.22 06:41 J.F
- 27.08.22 08:10 Atlantis
- 27.08.22 10:28 Dawid Rutkowski
- 27.08.22 11:34 Marek
- 27.08.22 11:53 JDX
- 27.08.22 12:59 Atlantis
- 27.08.22 15:59 Dawid Rutkowski
- 27.08.22 16:06 Dawid Rutkowski
- 27.08.22 16:53 J.F
- 27.08.22 20:30 a...@m...uni.wroc.pl
- 27.08.22 20:55 JDX
- 27.08.22 21:43 Dawid Rutkowski
- 28.08.22 12:34 JDX
- 28.08.22 14:27 Dawid Rutkowski
- 28.08.22 14:30 Atlantis
Najnowsze wątki z tej grupy
- Położyłem dwa telefony obok siebie
- Przekaźnik na szynę DIN (?)
- Taśma LED
- Jak odróżnić myjki wibrujące od ultradźwiękowych.
- Ledy na wyłączniku czasowym błyskają
- Re: Kompensacja mocy biernej przy 230VAC
- Re: Kompensacja mocy biernej przy 230VAC
- RCD wybija
- Re: Kompensacja mocy biernej przy 230VAC
- Łożysko ślizgowe - jaki olej
- Re: Kompensacja mocy biernej przy 230VAC
- Re: Kompensacja mocy biernej przy 230VAC
- Współczesny falomierz
- Zasilacz 7V na szynę DIN
- Waga z legalizacją
Najnowsze wątki
- 2025-04-09 [przegląd prasy] - raport mniejszosci
- 2025-04-09 [przegląd prasy] - wypadek autobusu w Warszwie - wyrok (prawomocny)
- 2025-04-09 [przegląd prasy] - przejścia na drogach rowerowych
- 2025-04-09 Czy blokowanie sali obrad Sejmu przez PO-opozycje pod rządami PiS już się przedawniło? [mecenas Giertych dołki kopie?]
- 2025-04-09 Koniec produkcji Leapmotor T03
- 2025-04-09 Pruszków => Specjalista ds. public relations <=
- 2025-04-09 Rzeszów => International Freight Forwarder <=
- 2025-04-09 Ryga => Konsultant Wdrożeniowy Comarch XL/Optima (Księgowość i Kad
- 2025-04-09 Poznań => Konsultant wdrożeniowy Comarch XL/Optima (Księgowość i
- 2025-04-09 Chrzanów => Spedytor Międzynarodowy (handel ładunkami/prowadzenie f
- 2025-04-09 Warszawa => JavaScript / Node / Fullstack Developer <=
- 2025-04-09 Warszawa => Senior Product Manager <=
- 2025-04-09 Warszawa => Starszy Konsultant SAP FICO <=
- 2025-04-09 Warszawa => NMS System Administrator <=
- 2025-04-07 C++. Podróż Po Języku - komentarz