Получить ассемблерный листинг из кода на с++ - Assembler
Формулировка задачи:
Здравствуйте!
Требуется написать программу на ассемблере, которая бы занималась неким преобразованием текста. По условию не возбраняется получить ассемблерный код с помощью кода, написанного на любом высокоуровневом языке. Код должен запускаться каким-то образом. Также необходимо объяснить, что и почему сделал компилятор среды, в которой программа писалась. Помогите, пожалуйста. Пробовал получать ассемблерный листинг в visual studio 2010 и затем в этой же среде запускать, но ничего не вышло.
Под сишный код visual studio выдаёт такой вот ассемблерный листинг. Оптимизация вроде отключена (я старался её отключить, но не уверен что она всё-таки отключилась).
Подскажите, пожалуйста, что нужно редактировать в ассемблерном коде, чтобы он потом запускался? Может, использовать не visual studio?
Листинг программы
- #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
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 ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д