Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/slides2014-07.pdf · 7 int...

18
© 2014 МГУ/ВМК/СП Лекция 7 1 марта

Upload: others

Post on 06-Oct-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Лекция 7

1 марта

Page 2: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Оператор do-while

2

int pcount_do(unsigned x) { int result = 0; do { result += x & 0x1; x >>= 1; } while (x); return result; }

int pcount_do(unsigned x) { int result = 0; loop: result += x & 0x1; x >>= 1; if (x) goto loop; return result; }

Page 3: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Оператор do-while

3

int pcount_do(unsigned x) { int result = 0; loop: result += x & 0x1; x >>= 1; if (x) goto loop; return result; }

mov ecx, 0 ; result = 0 .L2: ; loop: mov eax, edx and eax, 1 ; t = x & 1 add ecx, eax ; result += t shr edx, 1 ; x >>= 1 jne .L2 ; If !0, goto loop

Регистр Значение

edx x

ecx result

Page 4: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Оператор while

4

int pcount_while(unsigned x) { int result = 0; while (x) { result += x & 0x1; x >>= 1; } return result; }

int pcount_do(unsigned x) { int result = 0; if (!x) goto done; loop: result += x & 0x1; x >>= 1; if (x) goto loop; done: return result; }

int pcount_do(unsigned x) { int result = 0; loop: if (!x) goto done; result += x & 0x1; x >>= 1; goto loop; done: return result; }

Page 5: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Оператор for

5

#define WSIZE 8*sizeof(int) int pcount_for(unsigned x) { int i; int result = 0; for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } return result; }

int pcount_for_gt(unsigned x) { int i; int result = 0; i = 0; if (!(i < WSIZE)) goto done; loop: { unsigned mask = 1 << i; result += (x & mask) != 0; } i++; if (i < WSIZE) goto loop; done: return result; }

Page 6: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

6

int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for (i = 0; i < x; i++) { res = p_pred + pred; p_pred = pred; pred = res; } return res; }

fib: push ebp mov ebp, esp push ebx mov ecx, dword [ebp + 8] ; x xor edx, edx ; p_pred mov ebx, 1 ; pred mov eax, 1 ; res dec ecx jecxz .end .loop: lea eax, [edx + ebx] mov edx, ebx mov ebx, eax loop .loop .end: pop ebx pop ebp ret

Регистр Значение

ecx x

edx p_pred

ebx pred

eax res

Page 7: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

7

int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for (i = 0; i < x; i++) { res = p_pred + pred; p_pred = pred; pred = res; } return res; }

fib: push ebp mov ebp, esp push ebx mov ecx, dword [ebp + 8] ; x xor edx, edx ; p_pred mov ebx, 1 ; pred mov eax, 1 ; res dec ecx jecxz .end .loop: lea eax, [edx + ebx] mov edx, ebx mov ebx, eax loop .loop .end: pop ebx pop ebp ret

Регистр Значение

ecx x

edx p_pred

ebx pred

eax res

Page 8: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

8

int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for (i = 0; i < x; i++) { res = p_pred + pred; p_pred = pred; pred = res; } return res; }

fib: push ebp mov ebp, esp push ebx mov ecx, dword [ebp + 8] ; x xor edx, edx ; p_pred mov ebx, 1 ; pred mov eax, 1 ; res dec ecx jecxz .end .loop: lea eax, [edx + ebx] mov edx, ebx mov ebx, eax loop .loop .end: pop ebx pop ebp ret

Регистр Значение

ecx x

edx p_pred

ebx pred

eax res

Page 9: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

9

int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for (i = 0; i < x; i++) { res = p_pred + pred; p_pred = pred; pred = res; } return res; }

fib: push ebp mov ebp, esp push ebx mov ecx, dword [ebp + 8] ; x xor edx, edx ; p_pred mov ebx, 1 ; pred mov eax, 1 ; res dec ecx jecxz .end .loop: lea eax, [edx + ebx] mov edx, ebx mov ebx, eax loop .loop .end: pop ebx pop ebp ret

Регистр Значение

ecx x

edx p_pred

ebx pred

eax res

Page 10: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Обратная задача

10

f: ... mov edx, dword [ebp+8] ; (1) mov eax, 0 ; (2) test edx, edx ; (3) je .L7 ; (4) .L10: ; xor eax, edx ; (5) shr edx, 1 ; (6) jne .L10 ; (7) .L7: ; and eax, 1 ; (8) ...

int f(unsigned x) { int val = 0; while (________) { ____________; } return ________; }

Page 11: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Передача управления

Си

• if

• if-else

• switch

• do-while

• while

• for

• goto

• break

• contunue

• return

Ассемблер

• JMP

• Jcc

• CALL

• RET

• CMOVcc

11

Page 12: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

12

enum TargetPosition {

TARGET_AT_BEGINNING,

TARGET_AT_MIDDLE,

TARGET_AT_END

};

switch (targetPosition){

case TARGET_AT_BEGINNING:

offsetInWindow = 0;

break;

case TARGET_AT_MIDDLE:

offsetInWindow = MIN (newSize - size, newSize / 2);

break;

case TARGET_AT_END:

offsetInWindow = newSize - size;

break;

default:

_error_code = IllegalData;

_error_msg = tr("requested target position"

" is not a TargetPosition "

" enum member");

}

Page 13: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

13

Page 14: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

enum TargetPosition {

TARGET_AT_BEGINNING,

TARGET_AT_MIDDLE,

TARGET_AT_END

};

if (TARGET_AT_BEGINNING == targetPosition) {

offsetInWindow = 0;

} else if (TARGET_AT_MIDDLE == targetPosition) {

offsetInWindow = MIN (newSize - size, newSize / 2);

} else if (TARGET_AT_END == targetPosition) {

offsetInWindow = newSize - size;

} else {

_error_code = IllegalData;

_error_msg = tr("requested target position"

" is not a TargetPosition "

" enum member");

}

14

Page 15: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

15

; в edx помещено значение управляющего выражения ; т.е. targetPosition cmp edx, TARGET_AT_BEGINNING jne .comp2 ; код для case TARGET_AT_BEGINNING: jmp .switch_exit .comp2: cmp edx, TARGET_AT_MIDDLE jne .comp3 ; код для case TARGET_AT_MIDDLE: jmp .switch_exit .comp3: cmp edx, TARGET_AT_END jne .default ; код для case TARGET_AT_END: jmp .switch_exit .default: ; код для default: .switch_exit:

Page 16: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

16

Вспоминаем пример из курса «АиАЯ»: подсчет количества дней, прошедших с первого января.

Page 17: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

17

Page 18: Лекция 7 - msu.ruasmcourse.cs.msu.ru/wp-content/uploads/2014/03/Slides2014-07.pdf · 7 int fib(int x) { // x >= 1 int i; int p_pred = 0; int pred = 1; int res = 1; x--; for

© 2014 МГУ/ВМК/СП

Duff’s Device

18

void duffs_device(char *to, char *from, int count) {

register n = (count + 7) / 8; /* count > 0 assumed */

switch (count % 8) {

case 0: do { *to = *from++;

case 7: *to = *from++;

case 6: *to = *from++;

case 5: *to = *from++;

case 4: *to = *from++;

case 3: *to = *from++;

case 2: *to = *from++;

case 1: *to = *from++;

} while (--n > 0);

}

}