Top Banner
Assembly 07
65

Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

Jan 19, 2016

Download

Documents

Darrell Cameron
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

Assembly 07

Page 2: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

2

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 3: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

3

Boxes within Boxes

• Procedures help manage code complexity• Procedures make code more:

• Readable• Maintainable• Reusable

What does this code do

again?

Page 4: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

4

Boxes within Boxes

• Unlike high-level languages, assembly does not “ship” with built-in procedures (e.g., printf in C++)

• You have to write your own procedures• Read from file• Write to file• Etc.

Page 5: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

5

Boxes within Boxes

• Book uses example of “getting up in the morning”• Shut off clock radio• Climb out of bed• Let dogs out• Eat breakfast• Brush your teeth• Shower

Page 6: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

6

Boxes within Boxes

• Each task can be divided into smaller tasks:• E.g., Brushing your teeth:

• Pick up toothpaste• Unscrew cap• Place cap on sink counter• …

• Same idea with procedures• Divide tasks into subtasks

Page 7: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

7

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 8: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

8

Procedure Definition

• Must begin with a label• Must have at least one ret (return)• E.g.,

my_print: ; label for “my_print” proc<instruction> ; some instruction<instruction> ; some instructionret ; return

Page 9: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

9

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 10: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

10

call Mnemonic

call -> used to invoke the procedure

usage: call <procedure_name>;

Page 11: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

11

ret Mnemonic

ret -> returns from procedure

usage:ret ; takes no operands

; returns to instruction after call

Page 12: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

12

call / ret Mnemonics

• call puts esp onto stack• esp has address of next instruction (after call)

• ret pops esp from stack• Execution resumes at the instruction after call

Page 13: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

13

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack

esp

1. instruction executes

Page 14: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

14

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack

esp

2. call to my_print made

Page 15: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

15

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack

esp

3. esp+1 value pushed to stack

address of <next instr>;

Page 16: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

16

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack

esp

4. flow of execution goes to my_print

address of <next instr>;

Page 17: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

17

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack5. my_print executes address of <next instr>;

esp

Page 18: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

18

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack6. ret (return) reached in my_print

address of <next instr>;

esp

Page 19: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

19

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack7. Address popped off stack

8. esp set to address

address of <next instr>;

esp

Page 20: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

20

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack9. Flow of execution continues at instruction after call

esp

Page 21: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

21

my_print:

<instruction>;

<instruction>;

ret;

<instruction>;

call my_print;

<next instr>;

stack10. Flow of execution continues…

esp

Page 22: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

22

stack

Every time you make a call, the stack grows by 32 bits.

Why??

return address

return address

return address

return address

return address

Page 23: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

23

stack

Every time you return from a procedure (with ret), the stack shrinks by 32 bits.

return address

return address

return address

Page 24: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

msg: db “Hello There!!!”,10 ; in .datamsgLen: equ $-msg ; in .data

call my_print ; in .textcall my_print ; in .textcall my_print ; in .text

my_print: ; in .textmov eax, 4 ; make sys_write callmov ebx, 1 ; write to stdoutmov ecx, msg ; write contents of msgmov edx, msgLen ; number of bytes to write int 0x80 ; make system callret ; return

Page 25: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

25

call / ret Mnemonics

UNIX> ./a.outHello World!!!Hello World!!!Hello World!!!UNIX>

msg: db “Hello There!!!”,10msgLen: equ $-msg call my_printcall my_printcall my_print

my_print:mov eax, 4mov ebx, 1mov ecx, msgmov edx, msgLenint 0x80ret

Page 26: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

26

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 27: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

27

Saving Register Values

• What is the result of add eax, ebx?

mov eax, 42;mov ebx, 58;call my_print;add eax, ebx;

Page 28: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

28

Saving Register Values

mov eax, 42;mov ebx, 58;call my_print;add eax, ebx;

eax

ebx

Page 29: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

29

Saving Register Values

mov eax, 42;mov ebx, 58;call my_print;add eax, ebx;

42

58

eax

ebx

Page 30: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

30

Saving Register Values

mov eax, 42;mov ebx, 58;call my_print;add eax, ebx;

4

1

eax

ebx

my_print sets eax to “4” for sys_write

my_print sets ebx to “1” for stdout

Page 31: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

31

Saving Register Values

mov eax, 42;mov ebx, 58;call my_print;add eax, ebx;

5

1

eax

ebx

were we expecting “5” or “100”??

Page 32: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

32

Saving Register Values

• Often important to save registers before calling a procedure

• Guards against bugs that are extremely hard to track down

spooky

Page 33: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

33

Saving Register Values

• Use the stack to save registers• Push registers onto stack before procedure call• Pop registers off of stack after procedure returns

• Be mindful of order!• Last In First Out

Page 34: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

34

Saving Register Values

• If you “own” the procedure code, you can push / pop registers within the procedure

• Push registers at beginning of procedure

• Pop registers at end of procedure

Page 35: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

35

Saving Register Values

mov eax, 42;mov ebx, 58;pushad;call my_print;popad;add eax, ebx;

eax

ebx

Page 36: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

36

Saving Register Values

mov eax, 42;mov ebx, 58;pushad;call my_print;popad;add eax, ebx;

42

58

eax

ebx

Page 37: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

37

Saving Register Values

mov eax, 42;mov ebx, 58;pushad;call my_print;popad;add eax, ebx;

42

58

eax

ebx

all 32-bit GP registers pushed to stack

Page 38: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

38

Saving Register Values

mov eax, 42;mov ebx, 58;pushad;call my_print;popad;add eax, ebx;

4

1

eax

ebx

Page 39: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

39

Saving Register Values

mov eax, 42;mov ebx, 58;pushad;call my_print;popad;add eax, ebx;

42

58

eax

ebx

pop all 32-bit registers from stack back to registers

Page 40: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

40

Saving Register Values

mov eax, 42;mov ebx, 58;pushad;call my_print;popad;add eax, ebx;

100

58

eax

ebx

Page 41: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

41

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 42: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

42

Passing Arguments

• How do you pass arguments to assembly procedures?• … and no, this is not a setup for a hilarious joke…

• Use registers!• Caller puts arguments into pre-ordained registers• E.g., eax is argument 1, ebx is argument 2, etc.

• Important to clearly comment your procedures!!• Especially expectations for arguments• E.g., integer in eax, pointer in ebx, etc.

Page 43: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

43

Passing Arguments

• Example: procedure to add two numbers, print result to stdout• Numbers will be arguments to procedure

• Simplified version: only prints results between 0 and 9…• Printing results > 10 may be part of your homework…

Page 44: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

SIZE: equ 10 ; in .dataoutput: resb SIZE ; in .bss

; below in .textmov eax, 2 ; argument 1 in eaxmov ebx, 3 ; argument 2 in ebxcall my_add ; invoke procedure to add/print

my_add: ; procedure to add / print resultadd eax, ebx ; add argumentsadd eax, ‘0’ ; convert to ASCII numbermov [output], eax; ; put result in output buffermov byte [output+1], 10 ; add carriage returncall my_print ; write output buffer to stdoutret ; return to caller

Page 45: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

45

Procedure Arguments

UNIX> ./a.out5UNIX>

msg: SIZE: equ 10output: resb SIZE

mov eax, 2mov ebx, 3call my_add

my_add:add eax, ebxadd eax, ‘0’mov [output], eaxmov byte [output+1], 10 call my_printret

Page 46: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

46

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 47: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

47

Return Value(s)

• How do you return value(s) from assembly procedures?

• Register(s), of course!!

• Example: convert character from lowercase to uppercase

Page 48: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’ ; argument 1 in alcall convert ; convert ‘a’ to ‘A’

; cl now has converted

covert: ; procedure to convertmov cl, al ; copy argument 1sub cl, 32 ; make return value uppercase

; (‘A’ is 32 less than ‘a’)ret ; return to caller

Page 49: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’;call convert;

covert:mov cl, alsub cl, 32ret

al

cl

Page 50: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’;call convert;

covert:mov cl, alsub cl, 32ret

96 = 0x61 = ‘a’al

cl

Page 51: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’;call convert;

covert:mov cl, alsub cl, 32ret

96 = 0x61 = ‘a’al

cl

Page 52: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’;call convert;

covert:mov cl, alsub cl, 32ret

96 = 0x61 = ‘a’

96 = 0x61 = ‘a’

al

cl

Page 53: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’;call convert;

covert:mov cl, alsub cl, 32ret

96 = 0x61 = ‘a’

65 = 0x41 = ‘A’

al

cl

Page 54: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

mov al, ‘a’;call convert;

covert:mov cl, alsub cl, 32ret

96 = 0x61 = ‘a’

65 = 0x41 = ‘A’

al

cl

now cl has return value ‘A’

Page 55: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

55

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 56: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

56

Global vs. Local Data

• Global: can be accessed anywhere in code• Local: can only be accessed “locally” (e.g., within procedure)

• In x86 assembly, all declared data items are global• Can declare data items in .text (!!!)

• Appear local, but actually global

Page 57: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

57

Examples of Local Data

• Using the stack to temporarily store data in procedures• Data pushed to stack (during procedure) only visible to that procedure

• Data items declared in external code libraries• Only visible to external code • (But there is a mechanism to make global)

Page 58: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

58

Outline

• Boxes within Boxes• Procedure Definition• call, ret• Saving / Restoring Registers• Argument(s)• Return Value(s)• Global vs. Local Data• Accidental Recursion

Page 59: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

59

Accidental Recursion

• “Uncommon but inevitable bug”

• Watch out for incorrect base case• Pay attention to instruction => flags

• Will eventually run out of stack space• Each call pushes 32-bits onto stack (Why?)• Eventually causes a Segmentation Fault (Why?)

Page 60: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

60

Accidental Recursion Example

• “Not so accidental” recursion

call recur; ; 1st instruction in .text ; after _start

recur:call my_print ; call procedure to print “LINE”call recur ; make recursive callret ; never reached..

Page 61: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

61

Accidental Recursion Example

UNIX> ./a.outLINELINELINELINELINE... (on and on..)Segmentation FaultUNIX>

call recur;

recur:call my_printcall recurret

stdout in BLUEstderr in GREEN

Page 62: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

62

Accidental Recursion Example

UNIX> ./a.out > output.txtSegmentation FaultUNIX> head –n 2 output.txtLINELINEUNIX> wc –l output.txt 2094543 output.txt

Page 63: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

63

Accidental Recursion Example

UNIX> ./a.out > output.txtSegmentation FaultUNIX> head –n 2 output.txtLINELINEUNIX> wc –l output.txt 2094543 output.txt

> : redirect stdout to a file named “output.txt”

stderr ignored

Page 64: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

64

Accidental Recursion Example

UNIX> ./a.out > output.txtSegmentation FaultUNIX> head –n 2 output.txtLINELINEUNIX> wc –l output.txt 2094543 output.txt

head –n 2 output.txt : output top 2 lines of file output.txtoutput.txt contains “LINE” printed once per line

Page 65: Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.

65

Accidental Recursion Example

UNIX> ./a.out > output.txtSegmentation FaultUNIX> head –n 2 output.txtLINELINEUNIX> wc –l output.txt 2094543 output.txt

wc –l output.txt :count number of lines in file output.txt

output.txt contains 2,094,543 lines.recur called 2+ million times!!