more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1)...
Transcript of more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1)...
![Page 1: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/1.jpg)
more C / assembly intro
1
![Page 2: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/2.jpg)
last time
program memory layoutstack versus heap versus code/globalsat fixed locations (by convention only)
compile/assemble/linkobject file
machine code + data (from assembly)placeholders for addresses (labels in assembly)
linkingdecide where in memory object files gofix placeholders
pointer arithmetic — how arrays in C worktreat pointer as a number, add/etc.
2
![Page 3: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/3.jpg)
anonymous feedback (1)
(paraphrased) I like learning from videos; can you suggest some forthis course?
other comp. arch. courses (e.g. CMU, Georgia Tech)? — but not sametopics/instruction setfor particular topics (pipelining, virtual memory) can probably find some
3
![Page 4: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/4.jpg)
anonymous feedback (2)
“In the slides, what is said in class, and the questions asked on thequiz, I have seen/heard the content presented pretty ambiguously.As a native English speaker, I’ve had trouble interpreting what issaid or being asked, so I can’t imagine the trouble a non-nativespeaker could be having. This may be the reason so manyclarification questions are being asked in class. Can you try to be alittle more clear and precise about what you intend to portray?”
I believe you!…but this isn’t specific enough to help me
4
![Page 5: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/5.jpg)
anonymous feedback (3)
(paraphrased) can quizzes be due on Tuesday?
intent is when we have reading quizzes:quiz on lecture/lab material done Thurs-Satquiz on reading done Sun-Tues
currently: no reading quiz
but want to get you used to when lecture/lab quizzes are
5
![Page 6: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/6.jpg)
on the quiz (1)
“In addition to the machine code itself, the object file contains information aboutwhere in the machine code memory addresses will be when the program runs”
relocations (placeholders) say “linker, put a memory address here”so object file must say where memory address will eventually be
“the object file contains the names of labels from the corresponding assembly file”symbol tableobject files refer to things from other object files by label name
6
![Page 7: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/7.jpg)
on the quiz (2)
“in addition to the machine code itself, the object file contains information aboutwhere each instruction starts in the machine code”
can tell from machine code itself, but…only care about labels/placeholders — not every instructionI should have bold+italiced each
endianness question — yes, would’ve been better if I said “in memory” (referring tohow arrays work in memory)
7
![Page 8: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/8.jpg)
on the quiz (3)
in comments, please don’t refer to the randomized answer letters
8
![Page 9: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/9.jpg)
lab this week
you will download an 64-bit Linux executable
use debugger, other tools to figure out what input it expects
note: tools output AT&T syntax assembly by defaultlab writeup mentions options to get Intel syntax assembly instead
in theory: just 2150 stuff?
in practice: we’ll be reviewing assembly
9
![Page 10: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/10.jpg)
arrays and pointers
*(foo + bar) exactly the same as foo[bar]
arrays ‘decay’ into pointers
10
![Page 11: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/11.jpg)
arrays of non-bytes
array[2] and *(array + 2) still the same1 int numbers[4] = {10, 11, 12, 13};2 int *pointer;3 pointer = numbers;4 *pointer = 20; // numbers[0] = 20;5 pointer = pointer + 2;6 /* adds 8 (2 ints) to address */7 *pointer = 30; // numbers[2] = 30;8 // numbers is 20, 11, 30, 13
assembly: addq $8, …
11
![Page 12: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/12.jpg)
arrays of non-bytes
array[2] and *(array + 2) still the same1 int numbers[4] = {10, 11, 12, 13};2 int *pointer;3 pointer = numbers;4 *pointer = 20; // numbers[0] = 20;5 pointer = pointer + 2;6 /* adds 8 (2 ints) to address */7 *pointer = 30; // numbers[2] = 30;8 // numbers is 20, 11, 30, 13
assembly: addq $8, …
11
![Page 13: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/13.jpg)
arrays: not quite pointers (1)
int array[100];int *pointer;
Legal: pointer = array;same as pointer = &(array[0]);
Illegal:(((((((((((((((hhhhhhhhhhhhhhharray = pointer;
12
![Page 14: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/14.jpg)
arrays: not quite pointers (1)
int array[100];int *pointer;
Legal: pointer = array;same as pointer = &(array[0]);
Illegal:(((((((((((((((hhhhhhhhhhhhhhharray = pointer;
12
![Page 15: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/15.jpg)
arrays: not quite pointers (2)
int array[100];int *pointer = array;
sizeof(array) == 400size of all elements
sizeof(pointer) == 8size of address
sizeof(&array[0]) == ???(&array[0] same as &(array[0]))
13
![Page 16: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/16.jpg)
arrays: not quite pointers (2)
int array[100];int *pointer = array;
sizeof(array) == 400size of all elements
sizeof(pointer) == 8size of address
sizeof(&array[0]) == ???(&array[0] same as &(array[0]))
13
![Page 17: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/17.jpg)
arrays: not quite pointers (2)
int array[100];int *pointer = array;
sizeof(array) == 400size of all elements
sizeof(pointer) == 8size of address
sizeof(&array[0]) == ???(&array[0] same as &(array[0]))
13
![Page 18: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/18.jpg)
a note on precedence
&foo[1] is the same as &(foo[1]) (not (&foo)[1])
*foo[0] is the same as *(foo[0]) (not (*foo)[0])
*foo++ is the same as *(foo++) (not (*foo)++)
14
![Page 19: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/19.jpg)
interlude: command line tips
cr4bd@reiss-lenovo:~$ man man
15
![Page 20: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/20.jpg)
man man
16
![Page 21: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/21.jpg)
man man
17
![Page 22: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/22.jpg)
man chmod
18
![Page 23: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/23.jpg)
chmod
chmod --recursive og-r /home/USER
others and group (student)- remove
read
user (yourself) / group / others- remove / + add
read / write / execute or search
19
![Page 24: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/24.jpg)
chmod
chmod --recursive og-r /home/USER
others and group (student)- remove
read
user (yourself) / group / others- remove / + add
read / write / execute or search
19
![Page 25: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/25.jpg)
chmod
chmod --recursive og-r /home/USER
others and group (student)- remove
read
user (yourself) / group / others- remove / + add
read / write / execute or search
19
![Page 26: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/26.jpg)
tar
the standard Linux/Unix file archive utility
Table of contents: tar tf filename.tar
eXtract: tar xvf filename.tar
Create: tar cvf filename.tar directory
(v: verbose; f: file — default is tape)
20
![Page 27: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/27.jpg)
Tab completion and history
21
![Page 28: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/28.jpg)
Back To C
22
![Page 29: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/29.jpg)
stdio.h
C does not have <iostream>
instead <stdio.h>
23
![Page 30: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/30.jpg)
stdio
cr4bd@power1: /if22/cr4bd ; man stdio
…STDIO(3) Linux Programmer's Manual STDIO(3)
NAMEstdio - standard input/output library functions
SYNOPSIS#include <stdio.h>
FILE *stdin;FILE *stdout;FILE *stderr;
DESCRIPTIONThe standard I/O library provides a simple and efficientbuffered stream I/O interface. Input and output is mapped intological data streams and the physical I/O characteristics areconcealed. The functions and macros are listed below; moreinformation is available from the individual man pages.
24
![Page 31: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/31.jpg)
stdio
STDIO(3) Linux Programmer's Manual STDIO(3)
NAMEstdio - standard input/output library functions
…
List of functionsFunction Description---------------------------------------------------------------clearerr check and reset stream statusfclose close a stream
…
printf formatted output conversion
…
25
![Page 32: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/32.jpg)
printf
1 int custNo = 1000;2 const char *name = "Jane Smith"3 printf("Customer #%d: %s\n " ,4 custNo, name);5 // "Customer #1000: Jane Smith"6 // same as:7 cout << "Customer #" << custNo8 << ": " << name << endl;
format string must match types of argument
26
![Page 33: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/33.jpg)
printf
1 int custNo = 1000;2 const char *name = "Jane Smith"3 printf("Customer #%d: %s\n " ,4 custNo, name);5 // "Customer #1000: Jane Smith"6 // same as:7 cout << "Customer #" << custNo8 << ": " << name << endl;
format string must match types of argument
26
![Page 34: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/34.jpg)
printf
1 int custNo = 1000;2 const char *name = "Jane Smith"3 printf("Customer #%d: %s\n " ,4 custNo, name);5 // "Customer #1000: Jane Smith"6 // same as:7 cout << "Customer #" << custNo8 << ": " << name << endl;
format string must match types of argument
26
![Page 35: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/35.jpg)
printf formats quick referenceSpecifier Argument Type Example(s)%s char * Hello, World!%p any pointer 0x4005d4%d int/short/char 42%u unsigned int/short/char 42%x unsigned int/short/char 2a%ld long 42%f double/float 42.000000
0.000000%e double/float 4.200000e+01
4.200000e-19%g double/float 42, 4.2e-19%% (no argument) %
detailed docs: man 3 printf
27
![Page 36: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/36.jpg)
printf formats quick referenceSpecifier Argument Type Example(s)%s char * Hello, World!%p any pointer 0x4005d4%d int/short/char 42%u unsigned int/short/char 42%x unsigned int/short/char 2a%ld long 42%f double/float 42.000000
0.000000%e double/float 4.200000e+01
4.200000e-19%g double/float 42, 4.2e-19%% (no argument) %
detailed docs: man 3 printf
27
![Page 37: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/37.jpg)
goto
for (...) {for (...) {if (thingAt(i, j)) {
goto found;}
}}printf("not found!\n");return;
found:printf("found!\n");
assembly:jmp found
assembly:found:
28
![Page 38: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/38.jpg)
goto
for (...) {for (...) {if (thingAt(i, j)) {
goto found;}
}}printf("not found!\n");return;
found:printf("found!\n");
assembly:jmp found
assembly:found:
28
![Page 39: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/39.jpg)
struct
struct rational {int numerator;int denominator;
};// ...struct rational two_and_a_half;two_and_a_half.numerator = 5;two_and_a_half.denominator = 2;struct rational *pointer = &two_and_a_half;printf("%d/%d\n",
pointer->numerator,pointer->denominator);
29
![Page 40: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/40.jpg)
struct
struct rational {int numerator;int denominator;
};// ...struct rational two_and_a_half;two_and_a_half.numerator = 5;two_and_a_half.denominator = 2;struct rational *pointer = &two_and_a_half;printf("%d/%d\n",
pointer->numerator,pointer->denominator);
29
![Page 41: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/41.jpg)
typedef struct (1)
struct other_name_for_rational {int numerator;int denominator;
};typedef struct other_name_for_rational rational;// ...rational two_and_a_half;two_and_a_half.numerator = 5;two_and_a_half.denominator = 2;rational *pointer = &two_and_a_half;printf("%d/%d\n",
pointer->numerator,pointer->denominator);
30
![Page 42: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/42.jpg)
typedef struct (1)
struct other_name_for_rational {int numerator;int denominator;
};typedef struct other_name_for_rational rational;// ...rational two_and_a_half;two_and_a_half.numerator = 5;two_and_a_half.denominator = 2;rational *pointer = &two_and_a_half;printf("%d/%d\n",
pointer->numerator,pointer->denominator);
30
![Page 43: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/43.jpg)
typedef struct (2)struct other_name_for_rational {
int numerator;int denominator;
};typedef struct other_name_for_rational rational;// same as:typedef struct other_name_for_rational {
int numerator;int denominator;
} rational;
// almost the same as:typedef struct {
int numerator;int denominator;
} rational;
31
![Page 44: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/44.jpg)
typedef struct (2)struct other_name_for_rational {
int numerator;int denominator;
};typedef struct other_name_for_rational rational;// same as:typedef struct other_name_for_rational {
int numerator;int denominator;
} rational;
// almost the same as:typedef struct {
int numerator;int denominator;
} rational;
31
![Page 45: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/45.jpg)
typedef struct (2)struct other_name_for_rational {
int numerator;int denominator;
};typedef struct other_name_for_rational rational;// same as:typedef struct other_name_for_rational {
int numerator;int denominator;
} rational;
// almost the same as:typedef struct {
int numerator;int denominator;
} rational;31
![Page 46: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/46.jpg)
linked lists / dynamic allocation
typedef struct list_t {int item;struct list_t *next;
} list;// ...
list* head = malloc(sizeof(list));/* C++: new list; */
head->item = 42;head->next = NULL;// ...free(head);
/* C++: delete list */
head
item: 42next: NULL
on heap
32
![Page 47: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/47.jpg)
linked lists / dynamic allocation
typedef struct list_t {int item;struct list_t *next;
} list;// ...
list* head = malloc(sizeof(list));/* C++: new list; */
head->item = 42;head->next = NULL;// ...free(head);
/* C++: delete list */
head
item: 42next: NULL
on heap
32
![Page 48: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/48.jpg)
linked lists / dynamic allocation
typedef struct list_t {int item;struct list_t *next;
} list;// ...
list* head = malloc(sizeof(list));/* C++: new list; */
head->item = 42;head->next = NULL;// ...free(head);/* C++: delete list */
head
item: 42next: NULL
on heap
32
![Page 49: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/49.jpg)
linked lists / dynamic allocation
typedef struct list_t {int item;struct list_t *next;
} list;// ...
list* head = malloc(sizeof(list));/* C++: new list; */
head->item = 42;head->next = NULL;// ...free(head);/* C++: delete list */
head
item: 42next: NULL
on heap
32
![Page 50: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/50.jpg)
dynamic arrays
int *array = malloc(sizeof(int)*100);// C++: new int[100]
for (i = 0; i < 100; ++i) {array[i] = i;
}// ...free(array); // C++: delete[] array
array
0 1 2 3 4 5 6 … 99somewhere on heap
400 bytes
33
![Page 51: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/51.jpg)
dynamic arrays
int *array = malloc(sizeof(int)*100);// C++: new int[100]
for (i = 0; i < 100; ++i) {array[i] = i;
}// ...free(array); // C++: delete[] array
array
0 1 2 3 4 5 6 … 99somewhere on heap
400 bytes
33
![Page 52: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/52.jpg)
miss vector? (1)
typedef struct range_t {int size;int *data;
} range;
range vec;vec.size = 100;vec.data = malloc(sizeof(int) * 100);// like: vector<int> vec(100);
34
![Page 53: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/53.jpg)
miss vector? (1)
typedef struct range_t {int size;int *data;
} range;
range vec;vec.size = 100;vec.data = malloc(sizeof(int) * 100);// like: vector<int> vec(100);
34
![Page 54: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/54.jpg)
miss vector? (2)
typedef struct range_t {int size;int *data;
} range;
range vec2;vec2.size = vec.size;vec2.data = malloc(sizeof(int) * vec.size);for (int i = 0; i < vec.size; ++i) {
vec2.data[i] = vec.data[i];}// like: vector<int> vec2 = vec;
Why not range vec2 = vec?
35
![Page 55: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/55.jpg)
miss vector? (2)
typedef struct range_t {int size;int *data;
} range;
range vec2;vec2.size = vec.size;vec2.data = malloc(sizeof(int) * vec.size);for (int i = 0; i < vec.size; ++i) {
vec2.data[i] = vec.data[i];}// like: vector<int> vec2 = vec;
Why not range vec2 = vec?35
![Page 56: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/56.jpg)
unsigned and signed typestype min maxsigned int = signed = int −231 231 − 1unsigned int = unsigned 0 232 − 1signed long = long −263 263 − 1unsigned long 0 264 − 1
...
36
![Page 57: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/57.jpg)
unsigned/signed comparison trap (1)
int x = -1;unsigned int y = 0;printf("%d\n", x < y);
result is 0
short solution: don’t compare signed to unsigned:(long) x < (long) y
37
![Page 58: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/58.jpg)
unsigned/signed comparison trap (1)
int x = -1;unsigned int y = 0;printf("%d\n", x < y);
result is 0
short solution: don’t compare signed to unsigned:(long) x < (long) y
37
![Page 59: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/59.jpg)
unsigned/signed comparison trap (1)
int x = -1;unsigned int y = 0;printf("%d\n", x < y);
result is 0
short solution: don’t compare signed to unsigned:(long) x < (long) y
37
![Page 60: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/60.jpg)
unsigned/sign comparison trap (2)
int x = -1;unsigned int y = 0;printf("%d\n", x < y);
compiler converts both to same type firstint if all possible values fitotherwise: first operand (x, y) type from this list:
unsigned longlongunsigned intint
38
![Page 61: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/61.jpg)
C evolution and standards
1978: Kernighan and Ritchie publish The C Programming Language— “K&R C”
very different from modern C
1989: ANSI standardizes C — C89/C90/-ansicompiler option: -ansi, -std=c90looks mostly like modern C
1999: ISO (and ANSI) update C standard — C99compiler option: -std=c99adds: declare variables in middle of blockadds: // comments
2011: Second ISO update — C11
39
![Page 62: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/62.jpg)
C evolution and standards
1978: Kernighan and Ritchie publish The C Programming Language— “K&R C”
very different from modern C
1989: ANSI standardizes C — C89/C90/-ansicompiler option: -ansi, -std=c90looks mostly like modern C
1999: ISO (and ANSI) update C standard — C99compiler option: -std=c99adds: declare variables in middle of blockadds: // comments
2011: Second ISO update — C11
39
![Page 63: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/63.jpg)
C evolution and standards
1978: Kernighan and Ritchie publish The C Programming Language— “K&R C”
very different from modern C
1989: ANSI standardizes C — C89/C90/-ansicompiler option: -ansi, -std=c90looks mostly like modern C
1999: ISO (and ANSI) update C standard — C99compiler option: -std=c99adds: declare variables in middle of blockadds: // comments
2011: Second ISO update — C11
39
![Page 64: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/64.jpg)
C evolution and standards
1978: Kernighan and Ritchie publish The C Programming Language— “K&R C”
very different from modern C
1989: ANSI standardizes C — C89/C90/-ansicompiler option: -ansi, -std=c90looks mostly like modern C
1999: ISO (and ANSI) update C standard — C99compiler option: -std=c99adds: declare variables in middle of blockadds: // comments
2011: Second ISO update — C1139
![Page 65: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/65.jpg)
undefined behavior example (1)
#include <stdio.h>#include <limits.h>int test(int number) {
return (number + 1) > number;}
int main(void) {printf("%d\n", test(INT_MAX));
}
without optimizations: 0
with optimizations: 1
40
![Page 66: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/66.jpg)
undefined behavior example (1)
#include <stdio.h>#include <limits.h>int test(int number) {
return (number + 1) > number;}
int main(void) {printf("%d\n", test(INT_MAX));
}
without optimizations: 0
with optimizations: 1
40
![Page 67: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/67.jpg)
undefined behavior example (1)
#include <stdio.h>#include <limits.h>int test(int number) {
return (number + 1) > number;}
int main(void) {printf("%d\n", test(INT_MAX));
}
without optimizations: 0
with optimizations: 140
![Page 68: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/68.jpg)
undefined behavior example (2)
int test(int number) {return (number + 1) > number;
}
Optimized:test:
movl $1, %eax # eax ← 1ret
Less optimized:test:
leal 1(%rdi), %eax # eax ← rdi + 1cmpl %eax, %edisetl %al # al ← eax < edimovzbl %al, %eax # eax ← al (pad with zeros)ret
41
![Page 69: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/69.jpg)
undefined behavior
compilers can do whatever they wantwhat you expectcrash your program…
common types:signed integer overflow/underflowout-of-bounds pointersinteger divide-by-zerowriting read-only dataout-of-bounds shift (later)
42
![Page 70: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/70.jpg)
undefined behavior
why undefined behavior?
different architectures work differentlyallow compilers to expose whatever processor does “naturally”don’t encode any particular machine in the standard
flexibility for optimizations
43
![Page 71: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/71.jpg)
more C later
bitwise operatorsafter we talk about assembly a bitwe’ll maybe have more of a use-case
44
![Page 72: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/72.jpg)
x86-64 manuals
Intel manuals:https://software.intel.com/en-us/articles/intel-sdm24 MB, 4684 pagesVolume 2: instruction set reference (2190 pages)
AMD manuals:https://support.amd.com/en-us/search/tech-docs“AMD64 Architecture Programmer’s Manual”
45
![Page 73: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/73.jpg)
example manual page
46
![Page 74: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/74.jpg)
Linux x86-64 calling convention
47
![Page 75: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/75.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 76: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/76.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 77: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/77.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 78: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/78.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 79: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/79.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 80: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/80.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 81: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/81.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 82: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/82.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 83: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/83.jpg)
what’s in those files?#include <stdio.h>int main(void) {
puts("Hello, World!");return 0;
}
hello.c.text
main:sub $8, %rspmov $.Lstr, %rdicall putsxor %eax, %eaxadd $8, %rspret
.data.Lstr: .string "Hello,␣World!"
hello.s
text (code) segment:48 83 EC 08 BF 00 00 00 00 E8 00 0000 00 31 C0 48 83 C4 08 C3data segment:48 65 6C 6C 6F 2C 20 57 6F 72 6C 00relocations:
take 0s at and replace withtext, byte 6 ( ) data segment, byte 0text, byte 10 ( ) address of puts
symbol table:main text byte 0
hello.o
(actually binary, but shown as hexadecimal) …48 83 EC 08 BF A7 02 04 00E8 08 4A 04 00 31 C0 4883 C4 08 C3 ……(code from stdio.o) …48 65 6C 6C 6F 2C 20 57 6F72 6C 00 ……(data from stdio.o) …
hello.exe+ stdio.o
48
![Page 84: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/84.jpg)
hello.s
.section .rodata.str1.1,"aMS",@progbits,1.LC0:
.string "Hello, World!"
.text
.globl mainmain:
subq $8, %rspmovl $.LC0, %edicall putsmovl $0, %eaxaddq $8, %rspret
49
![Page 85: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/85.jpg)
hello.o
hello.o: file format elf64-x86-64
SYMBOL TABLE:0000000000000000 g F .text 0000000000000018 main0000000000000000 *UND* 0000000000000000 puts
RELOCATION RECORDS FOR [.text]:OFFSET TYPE VALUE0000000000000005 R_X86_64_32 .rodata.str1.1000000000000000a R_X86_64_PC32 puts-0x0000000000000004
Contents of section .text:0000 4883ec08 bf000000 00e80000 0000b800 H...............0010 00000048 83c408c3 ...H....Contents of section .rodata.str1.1:0000 48656c6c 6f2c2057 6f726c64 2100 Hello, World!.
50
![Page 86: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/86.jpg)
strings in Cint main() {
const char *hello = "Hello World!";...
}
0x4005C0hello (on stack/register)
…'H''e''l''l''o'' ␣''W''o''r''l''d''!''\0'…read-only data
51
![Page 87: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/87.jpg)
exercise explanation
better style: *pointer = 'z';better style: foo[1] = 'a';
1 char foo[4] = "foo";2 // {'f', 'o', 'o', '\0'}3 char *pointer;4 pointer = foo;5 *pointer = 'b';6 pointer = pointer + 2;7 pointer[0] = 'z';8 *(foo + 1) = 'a';
'f''o''o''\0'foo (on stack)
pointerfoo + 1 == &foo[0] + 1
52
![Page 88: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/88.jpg)
exercise explanation
better style: *pointer = 'z';better style: foo[1] = 'a';
1 char foo[4] = "foo";2 // {'f', 'o', 'o', '\0'}3 char *pointer;4 pointer = foo;5 *pointer = 'b';6 pointer = pointer + 2;7 pointer[0] = 'z';8 *(foo + 1) = 'a';
'f''o''o''\0'foo (on stack)
pointerfoo + 1 == &foo[0] + 1
52
![Page 89: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/89.jpg)
exercise explanation
better style: *pointer = 'z';better style: foo[1] = 'a';
1 char foo[4] = "foo";2 // {'f', 'o', 'o', '\0'}3 char *pointer;4 pointer = foo;5 *pointer = 'b';6 pointer = pointer + 2;7 pointer[0] = 'z';8 *(foo + 1) = 'a';
'b''o''o''\0'foo (on stack)
pointerfoo + 1 == &foo[0] + 1
52
![Page 90: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/90.jpg)
exercise explanation
better style: *pointer = 'z';better style: foo[1] = 'a';
1 char foo[4] = "foo";2 // {'f', 'o', 'o', '\0'}3 char *pointer;4 pointer = foo;5 *pointer = 'b';6 pointer = pointer + 2;7 pointer[0] = 'z';8 *(foo + 1) = 'a';
'b''o''o''\0'foo (on stack)
pointerfoo + 1 == &foo[0] + 1
52
![Page 91: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/91.jpg)
exercise explanation
better style: *pointer = 'z';better style: foo[1] = 'a';
1 char foo[4] = "foo";2 // {'f', 'o', 'o', '\0'}3 char *pointer;4 pointer = foo;5 *pointer = 'b';6 pointer = pointer + 2;7 pointer[0] = 'z';8 *(foo + 1) = 'a';
'b''o''z''\0'foo (on stack)
pointerfoo + 1 == &foo[0] + 1
52
![Page 92: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/92.jpg)
exercise explanation
better style: *pointer = 'z';better style: foo[1] = 'a';
1 char foo[4] = "foo";2 // {'f', 'o', 'o', '\0'}3 char *pointer;4 pointer = foo;5 *pointer = 'b';6 pointer = pointer + 2;7 pointer[0] = 'z';8 *(foo + 1) = 'a';
'b''a''z''\0'foo (on stack)
pointerfoo + 1 == &foo[0] + 1
52
![Page 93: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/93.jpg)
middle of blocks?
Examples of things not allowed in 1989 ANSI C:printf("Before calling malloc()\n");int *pointer = malloc(sizeof(int) * 100);
pointer must be declared earlier
for (int x = 0; x < 10; ++x)
x must be declared earlier
53
![Page 94: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/94.jpg)
pointer arithmetic
…'H''e''l''l''o'' ␣''W''o''r''l''d''!''\0'…read-only data
hello + 0
0x4005C0
hello + 5
0x4005C5
*(hello + 0) is 'H' *(hello + 5) is ' ␣'
hello[0] is 'H' hello[5] is ' ␣'
54
![Page 95: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/95.jpg)
pointer arithmetic
…'H''e''l''l''o'' ␣''W''o''r''l''d''!''\0'…read-only data
hello + 0
0x4005C0
hello + 5
0x4005C5
*(hello + 0) is 'H' *(hello + 5) is ' ␣'
hello[0] is 'H' hello[5] is ' ␣'
54
![Page 96: more C / assembly introcr4bd/3330/F2017/notes/20170829--slid… · anonymousfeedback(1) (paraphrased)Ilikelearningfromvideos;canyousuggestsomefor thiscourse? othercomp. arch. courses(e.g.](https://reader036.fdocuments.in/reader036/viewer/2022070813/5f0d2ae87e708231d4390151/html5/thumbnails/96.jpg)
pointer arithmetic
…'H''e''l''l''o'' ␣''W''o''r''l''d''!''\0'…read-only data
hello + 0
0x4005C0
hello + 5
0x4005C5
*(hello + 0) is 'H' *(hello + 5) is ' ␣'
hello[0] is 'H' hello[5] is ' ␣'
54