Assembly / Isas

Assembly / Isas

Changelog Changes made in this version not seen in first lecture: assembly / ISAs 5 September 2017: slide 3: lea destination should have been rax, not rsp 5 September 2017: slide 10: signed result w/o truncation is −264 + 1, not −264 − 1 5 September 2017: slide 12: changed version B and C to use jge 5 September 2017: slide 14: fix bugs in third version: compare to10 (not 9), end with %rbx set 8 September 2017: slide 11: use %rax, not %rbx 1 1 last time the quiz: ASM AT&T syntax movq %rsp, %rax movq (%rax,%rcx,4), %rbx = # %rax ← %rsp = X mov RBX, QWORD PTR [RAX + RCX * 4] pushq %rax ← C to assembly # %rsp %rsp - 8 = X - 8 strategy — write with gotos first # memory[%rsp] = %rax subq %rsp, %rax condition codes # %rax ← %rax - %rsp = X - (X - 8) = 8 set by arithmetic instructions + cmp or test leaq (%rax, %rax, 2), %rax used by conditional jump # %rax ← %rax + %rax * 2 = 8 + 8 * 2 = 24 names based on subtraction (cmp) result = 0: equal; result positive: greater; result negative: less than …more detail today 2 3 upcoming labs last time this week: pointer-heavy code in C AT&T syntax movq (%rax,%rcx,4), %rbx = use tool to find malloc/free-related mistakes mov RBX, QWORD PTR [RAX + RCX * 4] fix broken circular doubly-linked list implementation C to assembly strategy — write with gotos first next week: in-lab quiz condition codes set by arithmetic instructions + cmp or test implement library functions strlen/strsep used by conditional jump names based on subtraction (cmp) no notes result = 0: equal; result positive: greater; result negative: less than …more detail today 4 5 condition codes and jumps condition codes: closer look jg, jle, etc x86 condition codes: ZF (“zero flag”) — was result zero? (sub/cmp: equal) named based on interpreting result of subtraction SF (“sign flag”) — was result negative? (sub/cmp: less) CF (“carry flag”) — did computation overflow (as unsigned)? zero: equal OF (“overflow flag”) — did computation overflow (as signed)? (and one more we won’t talk about) negative: less than GDB: part of “eflags” register positive: greater than set by cmp, test, arithmetic 6 7 closer look: condition codes (1) closer look: condition codes (1) movq $−10, %rax movq $−10, %rax movq $20, %rbx movq $20, %rbx cmpq %rax, %rbx cmpq %rax, %rbx // result = %rbx - %rax = 30 // result = %rbx - %rax = 30 as signed: 20 − (−10) = 30 as signed: 20 − (−10) = 30 X X X X 64 64XX 64 64XX as unsigned: 20 − (2 − 10) = −2 −X30XX 30 (overflow!) as unsigned: 20 − (2 − 10) = −2 −X30XX 30 (overflow!) ZF = 0 (false) not zero rax and rbx not equal ZF = 0 (false) not zero rax and rbx not equal 8 8 closer look: condition codes (1) closer look: condition codes (1) movq $−10, %rax movq $−10, %rax movq $20, %rbx movq $20, %rbx cmpq %rax, %rbx cmpq %rax, %rbx // result = %rbx - %rax = 30 // result = %rbx - %rax = 30 as signed: 20 − (−10) = 30 as signed: 20 − (−10) = 30 X X X X 64 64XX 64 64XX as unsigned: 20 − (2 − 10) = −2 −X30XX 30 (overflow!) as unsigned: 20 − (2 − 10) = −2 −X30XX 30 (overflow!) ZF = 0 (false) not zero rax and rbx not equal ZF = 0 (false) not zero rax and rbx not equal SF = 0 (false) not negative rax <= rbx SF = 0 (false) not negative rax <= rbx OF = 0 (false) no overflow as signed correct for signed 8 8 closer look: condition codes (1) exercise: condition codes (2) movq $−10, %rax // 2^63 - 1 movq $20, %rbx movq $0x7FFFFFFFFFFFFFFF, %rax // 2^63 (unsigned); -2**63 (signed) cmpq %rax, %rbx movq $0x8000000000000000, %rbx // result = %rbx - %rax = 30 cmpq %rax, %rbx // result = %rbx - %rax as signed: 20 − (−10) = 30 ZF = ? X X 64 64XX as unsigned: 20 − (2 − 10) = −2 −X30XX 30 (overflow!) SF = ? OF = ? ZF = 0 (false) not zero rax and rbx not equal CF = ? SF = 0 (false) not negative rax <= rbx OF = 0 (false) no overflow as signed correct for signed CF = 1 (true) overflow as unsigned incorrect for unsigned 8 9 closer look: condition codes (2) closer look: condition codes (2) // 2**63 - 1 // 2**63 - 1 movq $0x7FFFFFFFFFFFFFFF, %rax movq $0x7FFFFFFFFFFFFFFF, %rax // 2**63 (unsigned); -2**63 (signed) // 2**63 (unsigned); -2**63 (signed) movq $0x8000000000000000, %rbx movq $0x8000000000000000, %rbx cmpq %rax, %rbx cmpq %rax, %rbx // result = %rbx - %rax // result = %rbx - %rax 63 63 X64XX 63 63 X64XX as signed: −2 − 2 − 1 = −2X+XX 1 1 (overflow) as signed: −2 − 2 − 1 = −2X+XX 1 1 (overflow) as unsigned: 263 − 263 − 1 = 1 as unsigned: 263 − 263 − 1 = 1 ZF = 0 (false) not zero rax and rbx not equal ZF = 0 (false) not zero rax and rbx not equal 10 10 closer look: condition codes (2) closer look: condition codes (2) // 2**63 - 1 // 2**63 - 1 movq $0x7FFFFFFFFFFFFFFF, %rax movq $0x7FFFFFFFFFFFFFFF, %rax // 2**63 (unsigned); -2**63 (signed) // 2**63 (unsigned); -2**63 (signed) movq $0x8000000000000000, %rbx movq $0x8000000000000000, %rbx cmpq %rax, %rbx cmpq %rax, %rbx // result = %rbx - %rax // result = %rbx - %rax 63 63 X64XX 63 63 X64XX as signed: −2 − 2 − 1 = −2X+XX 1 1 (overflow) as signed: −2 − 2 − 1 = −2X+XX 1 1 (overflow) as unsigned: 263 − 263 − 1 = 1 as unsigned: 263 − 263 − 1 = 1 ZF = 0 (false) not zero rax and rbx not equal ZF = 0 (false) not zero rax and rbx not equal SF = 0 (false) not negative rax <= rbx (if correct) SF = 0 (false) not negative rax <= rbx (if correct) OF = 1 (true) overflow as signed incorrect for signed 10 10 closer look: condition codes (2) closer look: condition codes (3) // 2**63 - 1 movq $−1, %rax movq $0x7FFFFFFFFFFFFFFF, %rax addq $−2, %rax // 2**63 (unsigned); -2**63 (signed) movq $0x8000000000000000, %rbx // result = -3 cmpq %rax, %rbx // result = %rbx - %rax as signed: −1 + (−2) = −3 X 63 63 X64X 64 64 65XXX 64 as signed: −2 − 2 − 1 = −2X+XX 1 1 (overflow) as unsigned: (2 − 1) + (2 − 2) = 2 −XX3 2 − 3 (overflow) as unsigned: 263 − 263 − 1 = 1 ZF = 0 (false) not zero result not zero ZF = 0 (false) not zero rax and rbx not equal SF = 0 (false) not negative rax <= rbx (if correct) OF = 1 (true) overflow as signed incorrect for signed CF = 0 (false) no overflow as unsigned correct for unsigned 10 11 start_loop: if (b < 10) goto end_loop; foo(); b += 1; goto start_loop; end_loop: closer look: condition codes (3) while exercise movq $−1, %rax while (b < 10) { foo(); b += 1; } addq $−2, %rax Assume b is in callee-saved register %rbx. Which are correct assembly // result = -3 translations? // version A // version B // version C as signed: −1 + (−2) = −3 start_loop: start_loop: start_loop: call foo cmpq $10, %rbx movq $10, %rax 64 64 65X X 64 as unsigned: (2 − 1) + (2 − 2) = 2 X−XX3 2 − 3 (overflow) addq $1, %rbx jge end_loop subq %rbx, %rax cmpq $10, %rbx call foo jge end_loop ZF = 0 (false) not zero result not zero jl start_loop addq $1, %rbx call foo jmp start_loop addq $1, %rbx SF = 1 (true) negative result is negative end_loop: jmp start_loop OF = 0 (false) no overflow as signed correct for signed end_loop: CF = 1 (true) overflow as unsigned incorrect for unsigned 11 12 while to assembly (1) while to assembly (1) while (b < 10) { while (b < 10) { foo(); foo(); b += 1; b += 1; } } start_loop: if (b < 10) goto end_loop; foo(); b += 1; goto start_loop; end_loop: 13 13 cmpq $10, %rbx cmpq $10, %rbx cmpq $10, %rbx jge end_loop jge end_loop jge end_loop start_loop: movq $10, %rax movq $10, %rax call foo subq %rbx, %rax subq %rbx, %rax addq $1, %rbx movq %rax, %rbx movq %rax, %rbx cmpq $10, %rbx start_loop: start_loop: jne start_loop call foo call foo end_loop: decq %rbx decq %rbx ... jne start_loop jne start_loop ... movq $10, %rbx movq $10, %rbx ... end_loop: end_loop: while — levels of optimization while — levels of optimization while (b < 10) { foo(); b += 1; } while (b < 10) { foo(); b += 1; } start_loop: start_loop: cmpq $10, %rbx cmpq $10, %rbx cmpq $10, %rbx jge end_loop jge end_loop jge end_loop start_loop: call foo call foo call foo addq $1, %rbx addq $1, %rbx addq $1, %rbx jmp start_loop jmp start_loop cmpq $10, %rbx end_loop: end_loop: jne start_loop ... ... end_loop: ... ... ... ... ... ... ... ... ... 14 14 while — levels of optimization compiling switches (1) while (b < 10) { foo(); b += 1; } switch (a) { case 1: ...; break; start_loop: cmpq $10, %rbx cmpq $10, %rbx case 2: ...; break; cmpq $10, %rbx jge end_loop jge end_loop ... jge end_loop start_loop: movq $10, %rax call foo call foo subq %rbx, %rax default: ... addq $1, %rbx addq $1, %rbx movq %rax, %rbx } jmp start_loop cmpq $10, %rbx start_loop: end_loop: jne start_loop call foo // same as if statement? ... end_loop: decq %rbx cmpq $1, %rax ... ... jne start_loop je code_for_1 ... ... movq $10, %rbx cmpq $2, %rax ... ... end_loop: je code_for_2 cmpq $3, %rax je code_for_3 ... jmp code_for_default 14 15 compiling switches (2) compiling switches (3) switch (a) { switch (a) { case 1: ...; break; case 1: ...; break; case 2: ...; break; case 2: ...; break; ... ... case 100: ...; break; case 100: ...; break; default: ... default: ... } } // binary search table: cmpq $50, %rax // jump table // not instructions jl code_for_less_than_50 cmpq $100, %rax // .quad = 64-bit (4 x 16) constant cmpq $75, %rax jg code_for_default .quad code_for_1 jl code_for_50_to_75 cmpq $1, %rax .quad code_for_2 ... jl code_for_default .quad code_for_3 code_for_less_than_50: jmp *table(,%rax,8) .quad code_for_4 cmpq $25, %rax ... jl less_than_25_cases ... 16 17 computed jumps preview: our Y86 condition codes cmpq $100, %rax ZF (zero flag), SF (sign flag) jg code_for_default cmpq $1, %rax just won’t handle overflow/underflow jl code_for_default // jump to memory[table + rax * 8] // table of pointers to instructions jmp *table(,%rax,8) // intel: jmp QWORD PTR[rax*8 + table] ..

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    32 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us