Как выделить нужное из этого кода? - 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

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы