Получить ассемблерный листинг из кода на с++ - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Требуется написать программу на ассемблере, которая бы занималась неким преобразованием текста. По условию не возбраняется получить ассемблерный код с помощью кода, написанного на любом высокоуровневом языке. Код должен запускаться каким-то образом. Также необходимо объяснить, что и почему сделал компилятор среды, в которой программа писалась. Помогите, пожалуйста. Пробовал получать ассемблерный листинг в visual studio 2010 и затем в этой же среде запускать, но ничего не вышло.
#include <stdio.h>
 
int j=0;
 
int pravilo1(char* str) {
    for (int i = 0; i<100; i++) if ((str[i]>64)&&(str[i]<91)) str[i]=65+25-(str[i]-65);  //здесь надо заменить каждую заглавную букву её симметричной из алфавита (A -> Z, B -> Y и т.д.)
        printf("modified string = %s \n \n",str);
        return 0;
}

int pravilo2(const char* str) {
    char buffer2[100];
    for (int i = 0; i<100; i++) if (str[i]!=str[i-1]) { buffer2[j]=str[i]; j++;}  //а здесь, если попадаются подряд несколько одинаковых символов, то оставить один из них.
        printf("modified string = %s \n \n",buffer2);
        return 0;
}
 
void main(void)
{
    char buffer[100];       //на вход с клавы идёт строка не более 100 символов
    char c=0; // просто, чтобы пауза в конце была
    int pravilo=0; //есть два правила, по которым строка будет преобразовываться
 
    for (int i = 0; i<100; i++) buffer[i]=0;
    gets(buffer);           // прочитать строку
    printf(" \n \nishodnaya stroka = %s \n \n",buffer);    // требуется вывести исходную строку сразу
    for (int i = 0; i<100; i++) {if (buffer[i]==0) continue; if (((buffer[i]>47)&&(buffer[i]<58))||((buffer[i]>64)&&(buffer[i]<91))||((buffer[i]>96)&&(buffer[i]<123))) pravilo=1; else pravilo=2;}  //если текст включает в себя только цифры и латинские буквы, тогда применяется правило 1, если присутствуют иные символы, тогда правило 2
    printf("pravilo = %d \n \n", pravilo); //необходимо сослаться на номер используемого правила
    if (pravilo==1) pravilo1(buffer);
    if (pravilo==2) pravilo2(buffer);
    gets(&c);
}
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 
 
    TITLE   C:\Users\Админ\Documents\Visual Studio 2010\Projects\2 ДЗ ПО ИНФЕ\2 ДЗ ПО ИНФЕ\дз по инфе.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat
 
INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES
 
PUBLIC  ?j@@3HA                     ; j
_BSS    SEGMENT
?j@@3HA DD  01H DUP (?)             ; j
_BSS    ENDS
PUBLIC  ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@ ; `string'
PUBLIC  ?pravilo1@@YAHPAD@Z             ; pravilo1
EXTRN   __imp__printf:PROC
EXTRN   __RTC_CheckEsp:PROC
EXTRN   __RTC_Shutdown:PROC
EXTRN   __RTC_InitBase:PROC
;   COMDAT ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@
; File c:\users\админ\documents\visual studio 2010\projects\2 дз по инфе\2 дз по инфе\дз по инфе.cpp
CONST   SEGMENT
??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@ DB 'modifie'
    DB  'd string = %s ', 0aH, ' ', 0aH, 00H        ; `string'
CONST   ENDS
;   COMDAT rtc$TMZ
rtc$TMZ SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ ENDS
;   COMDAT rtc$IMZ
rtc$IMZ SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ ENDS
;   COMDAT ?pravilo1@@YAHPAD@Z
_TEXT   SEGMENT
_i$3853 = -8                        ; size = 4
_str$ = 8                       ; size = 4
?pravilo1@@YAHPAD@Z PROC                ; pravilo1, COMDAT
; Line 5
    push    ebp
    mov ebp, esp
    sub esp, 204                ; 000000ccH
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-204]
    mov ecx, 51                 ; 00000033H
    mov eax, -858993460             ; ccccccccH
    rep stosd
; Line 6
    mov DWORD PTR _i$3853[ebp], 0
    jmp SHORT $LN4@pravilo1
$LN3@pravilo1:
    mov eax, DWORD PTR _i$3853[ebp]
    add eax, 1
    mov DWORD PTR _i$3853[ebp], eax
$LN4@pravilo1:
    cmp DWORD PTR _i$3853[ebp], 100     ; 00000064H
    jge SHORT $LN2@pravilo1
    mov eax, DWORD PTR _str$[ebp]
    add eax, DWORD PTR _i$3853[ebp]
    movsx   ecx, BYTE PTR [eax]
    cmp ecx, 64                 ; 00000040H
    jle SHORT $LN1@pravilo1
    mov eax, DWORD PTR _str$[ebp]
    add eax, DWORD PTR _i$3853[ebp]
    movsx   ecx, BYTE PTR [eax]
    cmp ecx, 91                 ; 0000005bH
    jge SHORT $LN1@pravilo1
    mov eax, DWORD PTR _str$[ebp]
    add eax, DWORD PTR _i$3853[ebp]
    movsx   ecx, BYTE PTR [eax]
    sub ecx, 65                 ; 00000041H
    mov edx, 90                 ; 0000005aH
    sub edx, ecx
    mov eax, DWORD PTR _str$[ebp]
    add eax, DWORD PTR _i$3853[ebp]
    mov BYTE PTR [eax], dl
$LN1@pravilo1:
; Line 7
    jmp SHORT $LN3@pravilo1
$LN2@pravilo1:
    mov esi, esp
    mov eax, DWORD PTR _str$[ebp]
    push    eax
    push    OFFSET ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@
    call    DWORD PTR __imp__printf
    add esp, 8
    cmp esi, esp
    call    __RTC_CheckEsp
; Line 8
    xor eax, eax
; Line 9
    pop edi
    pop esi
    pop ebx
    add esp, 204                ; 000000ccH
    cmp ebp, esp
    call    __RTC_CheckEsp
    mov esp, ebp
    pop ebp
    ret 0
?pravilo1@@YAHPAD@Z ENDP                ; pravilo1
_TEXT   ENDS
PUBLIC  __$ArrayPad$
PUBLIC  ?pravilo2@@YAHPBD@Z             ; pravilo2
EXTRN   ___security_cookie:DWORD
EXTRN   @__security_check_cookie@4:PROC
EXTRN   @_RTC_CheckStackVars@8:PROC
; Function compile flags: /Odtp /RTCsu /ZI
;   COMDAT ?pravilo2@@YAHPBD@Z
_TEXT   SEGMENT
_i$3863 = -120                      ; size = 4
_buffer2$ = -108                    ; size = 100
__$ArrayPad$ = -4                   ; size = 4
_str$ = 8                       ; size = 4
?pravilo2@@YAHPBD@Z PROC                ; pravilo2, COMDAT
; Line 12
    push    ebp
    mov ebp, esp
    sub esp, 316                ; 0000013cH
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-316]
    mov ecx, 79                 ; 0000004fH
    mov eax, -858993460             ; ccccccccH
    rep stosd
    mov eax, DWORD PTR ___security_cookie
    xor eax, ebp
    mov DWORD PTR __$ArrayPad$[ebp], eax
; Line 14
    mov DWORD PTR _i$3863[ebp], 0
    jmp SHORT $LN4@pravilo2
$LN3@pravilo2:
    mov eax, DWORD PTR _i$3863[ebp]
    add eax, 1
    mov DWORD PTR _i$3863[ebp], eax
$LN4@pravilo2:
    cmp DWORD PTR _i$3863[ebp], 100     ; 00000064H
    jge SHORT $LN2@pravilo2
    mov eax, DWORD PTR _str$[ebp]
    add eax, DWORD PTR _i$3863[ebp]
    movsx   ecx, BYTE PTR [eax]
    mov edx, DWORD PTR _str$[ebp]
    add edx, DWORD PTR _i$3863[ebp]
    movsx   eax, BYTE PTR [edx-1]
    cmp ecx, eax
    je  SHORT $LN1@pravilo2
    mov eax, DWORD PTR _str$[ebp]
    add eax, DWORD PTR _i$3863[ebp]
    mov ecx, DWORD PTR ?j@@3HA          ; j
    mov dl, BYTE PTR [eax]
    mov BYTE PTR _buffer2$[ebp+ecx], dl
    mov eax, DWORD PTR ?j@@3HA          ; j
    add eax, 1
    mov DWORD PTR ?j@@3HA, eax          ; j
$LN1@pravilo2:
    jmp SHORT $LN3@pravilo2
$LN2@pravilo2:
; Line 15
    mov esi, esp
    lea eax, DWORD PTR _buffer2$[ebp]
    push    eax
    push    OFFSET ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@
    call    DWORD PTR __imp__printf
    add esp, 8
    cmp esi, esp
    call    __RTC_CheckEsp
; Line 16
    xor eax, eax
; Line 17
    push    edx
    mov ecx, ebp
    push    eax
    lea edx, DWORD PTR $LN9@pravilo2
    call    @_RTC_CheckStackVars@8
    pop eax
    pop edx
    pop edi
    pop esi
    pop ebx
    mov ecx, DWORD PTR __$ArrayPad$[ebp]
    xor ecx, ebp
    call    @__security_check_cookie@4
    add esp, 316                ; 0000013cH
    cmp ebp, esp
    call    __RTC_CheckEsp
    mov esp, ebp
    pop ebp
    ret 0
$LN9@pravilo2:
    DD  1
    DD  $LN8@pravilo2
$LN8@pravilo2:
    DD  -108                    ; ffffff94H
    DD  100                 ; 00000064H
    DD  $LN7@pravilo2
$LN7@pravilo2:
    DB  98                  ; 00000062H
    DB  117                 ; 00000075H
    DB  102                 ; 00000066H
    DB  102                 ; 00000066H
    DB  101                 ; 00000065H
    DB  114                 ; 00000072H
    DB  50                  ; 00000032H
    DB  0
?pravilo2@@YAHPBD@Z ENDP                ; pravilo2
_TEXT   ENDS
PUBLIC  ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@ ; `string'
PUBLIC  ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@ ; `string'
PUBLIC  __$ArrayPad$
PUBLIC  _main
EXTRN   __imp__gets:PROC
;   COMDAT ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@
CONST   SEGMENT
??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@ DB 'pravilo = %d ', 0aH
    DB  ' ', 0aH, 00H               ; `string'
CONST   ENDS
;   COMDAT ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@
CONST   SEGMENT
??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@ DB ' '
    DB  0aH, ' ', 0aH, 'ishodnaya stroka = %s ', 0aH, ' ', 0aH, 00H ; `string'
; Function compile flags: /Odtp /RTCsu /ZI
CONST   ENDS
;   COMDAT _main
_TEXT   SEGMENT
_i$3879 = -156                      ; size = 4
_i$3874 = -144                      ; size = 4
_pravilo$ = -132                    ; size = 4
_c$ = -117                      ; size = 1
_buffer$ = -108                     ; size = 100
__$ArrayPad$ = -4                   ; size = 4
_main   PROC                        ; COMDAT
; Line 20
    push    ebp
    mov ebp, esp
    sub esp, 352                ; 00000160H
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-352]
    mov ecx, 88                 ; 00000058H
    mov eax, -858993460             ; ccccccccH
    rep stosd
    mov eax, DWORD PTR ___security_cookie
    xor eax, ebp
    mov DWORD PTR __$ArrayPad$[ebp], eax
; Line 22
    mov BYTE PTR _c$[ebp], 0
; Line 23
    mov DWORD PTR _pravilo$[ebp], 0
; Line 25
    mov DWORD PTR _i$3874[ebp], 0
    jmp SHORT $LN14@main
$LN13@main:
    mov eax, DWORD PTR _i$3874[ebp]
    add eax, 1
    mov DWORD PTR _i$3874[ebp], eax
$LN14@main:
    cmp DWORD PTR _i$3874[ebp], 100     ; 00000064H
    jge SHORT $LN12@main
    mov eax, DWORD PTR _i$3874[ebp]
    mov BYTE PTR _buffer$[ebp+eax], 0
    jmp SHORT $LN13@main
$LN12@main:
; Line 26
    mov esi, esp
    lea eax, DWORD PTR _buffer$[ebp]
    push    eax
    call    DWORD PTR __imp__gets
    add esp, 4
    cmp esi, esp
    call    __RTC_CheckEsp
; Line 27
    mov esi, esp
    lea eax, DWORD PTR _buffer$[ebp]
    push    eax
    push    OFFSET ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@
    call    DWORD PTR __imp__printf
    add esp, 8
    cmp esi, esp
    call    __RTC_CheckEsp
; Line 28
    mov DWORD PTR _i$3879[ebp], 0
    jmp SHORT $LN11@main
$LN10@main:
    mov eax, DWORD PTR _i$3879[ebp]
    add eax, 1
    mov DWORD PTR _i$3879[ebp], eax
$LN11@main:
    cmp DWORD PTR _i$3879[ebp], 100     ; 00000064H
    jge $LN9@main
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    test    ecx, ecx
    jne SHORT $LN8@main
    jmp SHORT $LN10@main
$LN8@main:
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    cmp ecx, 47                 ; 0000002fH
    jle SHORT $LN5@main
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    cmp ecx, 58                 ; 0000003aH
    jl  SHORT $LN6@main
$LN5@main:
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    cmp ecx, 64                 ; 00000040H
    jle SHORT $LN4@main
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    cmp ecx, 91                 ; 0000005bH
    jl  SHORT $LN6@main
$LN4@main:
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    cmp ecx, 96                 ; 00000060H
    jle SHORT $LN7@main
    mov eax, DWORD PTR _i$3879[ebp]
    movsx   ecx, BYTE PTR _buffer$[ebp+eax]
    cmp ecx, 123                ; 0000007bH
    jge SHORT $LN7@main
$LN6@main:
    mov DWORD PTR _pravilo$[ebp], 1
    jmp SHORT $LN3@main
$LN7@main:
    mov DWORD PTR _pravilo$[ebp], 2
$LN3@main:
    jmp $LN10@main
$LN9@main:
; Line 29
    mov esi, esp
    mov eax, DWORD PTR _pravilo$[ebp]
    push    eax
    push    OFFSET ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@
    call    DWORD PTR __imp__printf
    add esp, 8
    cmp esi, esp
    call    __RTC_CheckEsp
; Line 30
    cmp DWORD PTR _pravilo$[ebp], 1
    jne SHORT $LN2@main
    lea eax, DWORD PTR _buffer$[ebp]
    push    eax
    call    ?pravilo1@@YAHPAD@Z         ; pravilo1
    add esp, 4
$LN2@main:
; Line 31
    cmp DWORD PTR _pravilo$[ebp], 2
    jne SHORT $LN1@main
    lea eax, DWORD PTR _buffer$[ebp]
    push    eax
    call    ?pravilo2@@YAHPBD@Z         ; pravilo2
    add esp, 4
$LN1@main:
; Line 32
    mov esi, esp
    lea eax, DWORD PTR _c$[ebp]
    push    eax
    call    DWORD PTR __imp__gets
    add esp, 4
    cmp esi, esp
    call    __RTC_CheckEsp
; Line 33
    xor eax, eax
    push    edx
    mov ecx, ebp
    push    eax
    lea edx, DWORD PTR $LN20@main
    call    @_RTC_CheckStackVars@8
    pop eax
    pop edx
    pop edi
    pop esi
    pop ebx
    mov ecx, DWORD PTR __$ArrayPad$[ebp]
    xor ecx, ebp
    call    @__security_check_cookie@4
    add esp, 352                ; 00000160H
    cmp ebp, esp
    call    __RTC_CheckEsp
    mov esp, ebp
    pop ebp
    ret 0
    npad    1
$LN20@main:
    DD  2
    DD  $LN19@main
$LN19@main:
    DD  -108                    ; ffffff94H
    DD  100                 ; 00000064H
    DD  $LN17@main
    DD  -117                    ; ffffff8bH
    DD  1
    DD  $LN18@main
$LN18@main:
    DB  99                  ; 00000063H
    DB  0
$LN17@main:
    DB  98                  ; 00000062H
    DB  117                 ; 00000075H
    DB  102                 ; 00000066H
    DB  102                 ; 00000066H
    DB  101                 ; 00000065H
    DB  114                 ; 00000072H
    DB  0
_main   ENDP
_TEXT   ENDS
END
Под сишный код visual studio выдаёт такой вот ассемблерный листинг. Оптимизация вроде отключена (я старался её отключить, но не уверен что она всё-таки отключилась). Подскажите, пожалуйста, что нужно редактировать в ассемблерном коде, чтобы он потом запускался? Может, использовать не visual studio?
P.S. Операционная система windows 7 x64

Решение задачи: «Получить ассемблерный листинг из кода на с++»

textual
Листинг программы
org 100h
jmp start
 
mess0   db  13,10,'Type string..: $'
mess1   db  13,10,'Search signs.: $'
mess2   db  13,10,'------------------------------------------'
        db  13,10,'Result string: $'
okey    db        'Found!',13
        db  10,10,'Start Delete-duble proc..$'
nSign   db        'No sign!',13
        db  10,10,'Start Change-symbol proc..$'
 
buff    db  80
len     db  0
string  db  80 dup(0)
 
separ   db  '.,:;"/?[]{}`~!@#$%^&*()-+=\|',39
sLen     =  $ - separ
 
start:
; Сохраняем строку юзверя ===================================//
     mov   dx,mess0          ;
     call  message           ;
     mov   ah,0Ah            ; fn.(0Ah)
     mov   dx,buff           ;
     int   21h               ;
 
; Ищем в ней знаки препинания ===============================//
     mov   dx,mess1          ;
     call  message           ;
 
     mov   si,separ          ; таблица символов для поиска
     mov   dx,sLen           ; её длина
     xor   cx,cx             ;
find:                        ;
     mov   di,string         ; адрес строки юзера
     mov   cl,[len]          ; её длина
     inc   cl                ;
     lodsb                   ; AL = символ из таблицы
     repne scasb             ; поиск указанного символа в DI
     or    cx,cx             ; если поиск дал результаты,
     jnz   ok                ;      ..то всё ОК!
     dec   dx                ; иначе: уменьшаем длину таблицы
     jnz   find              ; и на повтор, пока DX > 0
 
; Выводим результат поиска на экран =========================//
     mov   dx,nSign          ; здесь мы окажемся,
     call  message           ;    ..если поиск не дал резутата
     call  changeText        ; зовём функцию!
     jmp   print             ;
ok:                          ;
     mov   dx,okey           ; поиск дал результат!
     call  message           ;
     call  deleteDuble       ;
 
; Выводим на экран результат работы функций =================//
print:
     mov   dx,mess2          ; выводим изменённую строку юзера
     call  message           ;
     mov   si,string         ;
@@:  lodsb                   ;
     or    al,al             ;     ..пока не встретится нуль
     jz    exit              ;
     int   29h               ;           ..по-символьно.
     loop  @b                ;
 
exit:
     xor   ax,ax             ;
     int   16h               ;
     int   20h               ; выход!
 
;eeeeeeeeeeeee{ П Р О Ц Е Д У Р Ы }eeeeeeeeeeeeeeeeeeeeeeeeeee
message:                     ;
     mov   ah,9              ;
     int   21h               ;
ret                          ;
;-------------------------------------------------------------
deleteDuble:                 ; Удаляем повторные вхождения ===
     mov   si,string         ; источник
     mov   di,si             ; он-же приёмник
     inc   si                ; первый элемент возьмёт DI
     mov   cl,[len]          ; длина цикла
@@:  lodsb                   ; AL = сл.элемент..
     cmp   al,[di]           ;
     jz    fuck              ; пропускаем если равны
     inc   di                ;
     xchg  al,[di]           ; иначе: ставим его предыдущим
fuck:                        ;
     loop  @b                ; на повтор..
     xor   al,al             ; вставляем маркер конца строки
     stosb                   ;
ret                          ;
;-------------------------------------------------------------
changeText:                  ; Меняем A->Z, B->Y, Z->A (гармошка)
     mov   si,string         ;
     mov   di,si             ;
     mov   cl,[len]          ;
@@:  lodsb                   ;
     cmp   al,41h            ; фильтр заглавных
     jb    mis               ;   ...
     cmp   al,5Ah            ;     ...
     ja    mis               ;        ...
     shl   ax,8              ; отправляем символ в AH
     sub   ah,41h            ; AH = его позиция от начала
     mov   al,5Ah            ; AL = asc хвоста
     sub   al,ah             ; вычисляем позицию от хвоста
mis: stosb                   ; сохраняем изменения..
     loop  @b                ;
     xor   al,al             ; вставляем маркер конца строки.
     stosb                   ;
ret                          ;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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