Лабораторная работа № 1.
Цель: изучить основы программирования на языке Assembler.
Задача: Исследовать программы первой части работы и написать программу, позволяющую осуществлять ввод с клавиатуры двоичных чисел и их вычитание.
Ход выполнения лабораторной работы.
Исследование программ:
1.
Дизассемблированный код программы (Turbo Debugger) |
Приложение на языке С++ |
|
b: cs:0291 push cs:0292 mov cs:0294 push cs:0295 push cs:0296 mov #LABA1#4 cs:0299 mov cs:029C jmp #LABA1#7 cs:029E mov cs:02A0 imul cs:02A2 mov cs:02A4 add cs:02A6 add cs:02A9 mov #LABA1#8 cs:02AB dec #LABA1#5 cs:02AC or cs:02AE jg #LABA1#10 cs:02B0 mov cs:02B2 jmp #LABA1#11 cs:02B4 pop cs:02B5 pop cs:02B6 pop cs:02B7 ret |
bp bp, sp si di di,[bp+4] si,000A #LABA1#5 (02AC) ax, si si dx, di dx, ax dx, FFFD di, dx si si, si #LABA1#7 (029E) ax, di #LABA1#11 (02B4) di si bp |
int b(int j) { int i; i = 10; j = j + i * i - 3; i --; while ( i > 0) { return j ; } |
int b ( int j ) { int i ; i = 10; while ( i > 0) { j = j + i * i - 3; i --; } return j ; }
2.
Дизассемблированный код программы (Turbo Debugger) |
Приложение на языке С++ |
|
f2: cs:0291 push cs:0292 mov cs:0294 sub cs:0297 push cs:0298 mov #LABA2#5 cs:029B or cs:029D jne cs:029F mov cs:02A2 jmp #LABA2#6 cs:02A4 mov cs:02A6 shl cs:02A8 mov #LABA2#7 cs:02AB mov cs:02AE jmp #LABA2#8 cs:02B0 pop cs:02B1 mov cs:02B3 pop cs:02B4 ret |
bp bp, sp sp, 0002 si si, [bp+4] si, si #LABA2#6 (02A4) ax, 0030 #LABA2#8 (02B0) ax, [si] ax, 1 [bp-02], ax ax, [bp-02] 02A2 si sp, bp bp |
int f2(int *x) { int j; if (x == NULL) return 48; j = *x * 2; return j ; } |
int f2(int *x) { int j; if (x == NULL) return 48; j = *x * 2; return j; }
в случае если по адресу x, хранится 0x0, то код возврата будет 48 и j вычисляться не будет.
3.
#include <stdlib.h> #include <stdio.h> int a(int i, int j); int b(int i, int j); int b(int i, int j) { if (j <= 0) return i+1; return a(i, j-1)+1; }
int a(int i, int j) { if (i <= 0) return j+1; return b(i-1, j)+b(i-1, j-1); }
int main(int argc, char **argv) { int i; if (argc != 3) return 1; i = a(atoi(argv[1]), atoi(argv[2]));
return 0; }
Дизассемблированный код программы (Turbo Debugger) |
Приложение на языке С++ |
|
b: |
int b(int i, int j) |
|
cs:0291 push |
bp |
{ |
cs:0292 mov |
bp, sp |
|
cs:0294 push |
si |
|
cs:0295 push |
di |
|
cs:0296 mov |
si, [bp+04] |
|
cs:0299 mov |
di, [bp+06] |
|
#LABA3#7 |
||
cs:029C or |
di, di |
if (j <= 0) |
cs:029E jg |
#LABA3#8 (02A5) |
|
cs:02A0 mov |
ax, si |
|
cs:02A2 inc |
ax |
return i+1; |
cs:02A3 jmp |
#LABA3#9 (02B1) |
|
#LABA3#8 |
||
cs:02A5 mov |
ax, di |
return a(i, j-1)+1; |
cs:02A7 dec |
ax |
} |
cs:02A8 push |
ax |
|
cs:02A9 push |
si |
|
cs:02AA call |
a |
|
cs:02AD pop |
cx |
|
cs:02AE pop |
cx |
|
cs:02AF jmp |
02A2 |
|
#LABA3#9 |
||
cs:02B1 pop |
di |
|
cs:02B2 mov |
si |
|
cs:02B3 pop |
bp |
|
cs:02B4 ret |
||
a: |
||
cs:02B5 push |
bp |
int a(int i, int j) |
cs:02B6 mov |
bp, sp |
{ |
cs:02B8 push |
si |
|
cs:02B9 push |
di |
|
cs:02BA mov |
si, [bp+04] |
|
cs:02BD mov |
di, [bp+06] |
|
#LABA3#13 |
||
cs:02C0 or |
si, si |
if (i <= 0) |
cs:02C2 jg |
#LABA3#14 (02C9) |
|
cs:02C4 mov |
ax, si |
|
cs:02C6 inc |
ax |
return j+1; |
cs:02C7 jmp |
#LABA3#15 (02E8) |
|
#LABA3#14 |
||
cs:02C9 push |
di, |
return b(i-1, j)+b(i-1, j-1); |
cs:02CA mov |
ax, si |
|
cs:02CC dec |
ax |
|
cs:02CD push |
ax |
|
cs:02CE call |
b |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.