Получить ассемблерный листинг из кода на с++ - 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 ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д