Как выделить нужное из этого кода? - Assembler
Формулировка задачи:
.387 .386p .model flat PUBLIC main EXTRN system:BYTE EXTRN printf:BYTE EXTRN scanf:BYTE EXTRN __iob:BYTE EXTRN fgetc:BYTE EXTRN _cstart_:BYTE DGROUP GROUP CONST,CONST2,_DATA _TEXT SEGMENT BYTE PUBLIC USE32 'CODE' ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP ; #include <stdio.h> ; #include <stdlib.h> ; void main (void) main: push ebx push esi push edi push ebp sub esp,0cH ; {int a,b,n,d; ; d=0; ; system("chcp 1251"); push offset FLAT:L$6 call near ptr FLAT:system add esp,4 ; system ("cls"); push offset FLAT:L$7 call near ptr FLAT:system add esp,4 ; printf("Введите a:"); push offset FLAT:L$8 call near ptr FLAT:printf add esp,4 ; scanf("%d",&a); mov eax,esp push eax push offset FLAT:L$9 call near ptr FLAT:scanf add esp,8 ; printf("Введите b:"); push offset FLAT:L$10 call near ptr FLAT:printf add esp,4 ; scanf("%d",&b); lea eax,4[esp] push eax push offset FLAT:L$9 call near ptr FLAT:scanf add esp,8 ; printf("Введите n:"); push offset FLAT:L$11 call near ptr FLAT:printf add esp,4 ; scanf("%d",&n); lea eax,8[esp] push eax push offset FLAT:L$9 call near ptr FLAT:scanf add esp,8 ; {d=(a*b)*n;} mov eax,dword ptr [esp] imul eax,dword ptr 4[esp] imul eax,dword ptr 8[esp] ; printf("(a+b)*n)=%d",d); push eax push offset FLAT:L$12 call near ptr FLAT:printf ; getchar();getchar(); mov ebx,dword ptr FLAT:__iob+4 add esp,8 test ebx,ebx jle L$1 mov eax,dword ptr FLAT:__iob movzx edx,byte ptr [eax] sub edx,0dH cmp edx,0dH ja L$4 L$1: push offset FLAT:__iob call near ptr FLAT:fgetc add esp,4 L$2: mov edi,dword ptr FLAT:__iob+4 test edi,edi jle L$5 mov eax,dword ptr FLAT:__iob movzx edx,byte ptr [eax] sub edx,0dH cmp edx,0dH jbe L$5 lea ebp,-1[edi] inc eax mov dword ptr FLAT:__iob+4,ebp mov dword ptr FLAT:__iob,eax ; } L$3: add esp,0cH pop ebp pop edi pop esi pop ebx ret L$4: lea esi,-1[ebx] inc eax mov dword ptr FLAT:__iob+4,esi mov dword ptr FLAT:__iob,eax jmp L$2 L$5: push offset FLAT:__iob call near ptr FLAT:fgetc add esp,4 jmp L$3 _TEXT ENDS CONST SEGMENT DWORD PUBLIC USE32 'DATA' L$6: DB 63H, 68H, 63H, 70H, 20H, 31H, 32H, 35H DB 31H, 0 L$7: DB 63H, 6cH, 73H, 0 L$8: DB 0c2H, 0e2H, 0e5H, 0e4H, 0e8H, 0f2H, 0e5H, 20H DB 61H, 3aH, 0 L$9: DB 25H, 64H, 0 L$10: DB 0c2H, 0e2H, 0e5H, 0e4H, 0e8H, 0f2H, 0e5H, 20H DB 62H, 3aH, 0 L$11: DB 0c2H, 0e2H, 0e5H, 0e4H, 0e8H, 0f2H, 0e5H, 20H DB 6eH, 3aH, 0 L$12: DB 28H, 61H, 2bH, 62H, 29H, 2aH, 6eH, 29H DB 3dH, 25H, 64H, 0 CONST ENDS CONST2 SEGMENT DWORD PUBLIC USE32 'DATA' CONST2 ENDS _DATA SEGMENT DWORD PUBLIC USE32 'DATA' _DATA ENDS END
Решение задачи: «Как выделить нужное из этого кода?»
textual
Листинг программы
format PE console 4.0 include 'win32a.inc' ; #include <stdio.h> ; #include <stdlib.h> ; void main (void) main: ; {int a,b,n,d; ; d=0; ; system("chcp 1251"); invoke system, @chcp ; system ("cls"); invoke system, @cls ; printf("Введите a:"); cinvoke printf, entr, _a ; scanf("%d",&a); cinvoke scanf, tpi, a ; printf("Введите b:"); cinvoke printf, entr, _b ; scanf("%d",&b); cinvoke scanf, tpi, b ; printf("Введите n:"); cinvoke printf, entr, _n ; scanf("%d",&n); cinvoke scanf, tpi, n ; {d=(a*b)*n;} mov eax,[a] imul eax,[b] imul eax,[n] mov [d], eax ; printf("(a*b)*n)=%d",d); cinvoke printf, rslt, eax ; getchar();getchar(); invoke _getch invoke exit,0 ; } @chcp db 'chcp 1251',0 @cls db 'cls',0 entr db 'Введите %s:',0 tpi db '%d',0 rslt db '(a*b)*n)=%d',0 ;;; KL+ в силу убогости реализации printf(); в msvcrt.dll приходится извращаться _a db 'a',0 _b db 'b',0 _n db 'n',0 ;;; KL- d dd 0 a dd ? b dd ? n dd ? ; import data in the same section data import library msvcrt,'MSVCRT.DLL' import msvcrt,\ system,'system',\ scanf,'scanf',\ printf,'printf',\ _getch,'_getch',\ exit,'exit' end data