Получить ассемблерный листинг из кода на с++ - 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 ;