SaYfeR, попробовал я запустить компилирующуюся прогу - она закрылась с ошибкой. Запустил её в отладчике OllyDbg, нашёл, что ты неправильно вызываешь printf при выводе результатов обмена (забыл ADDR). Заодно, я подправил свой вариант цикла обмена. Т.к. для меня это вторая программа на ассемблере для Windows, то я не разобрался: 1) с выводом строки в printf - выводится весь массив в одну строку без перевода строки; 2) переключением кодовой страницы - вместо русских букв - кракозябры.
| Код | .586 .model flat, stdcall option casemap :none
; include files ; ~~~~~~~~~~~~~ include \MASM32\INCLUDE\windows.inc include \MASM32\INCLUDE\masm32.inc include \MASM32\INCLUDE\gdi32.inc include \MASM32\INCLUDE\user32.inc include \MASM32\INCLUDE\kernel32.inc include \MASM32\INCLUDE\Comctl32.inc include \MASM32\INCLUDE\comdlg32.inc include \MASM32\INCLUDE\shell32.inc
include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm
; libraries ; ~~~~~~~~~ includelib \MASM32\LIB\masm32.lib
includelib \MASM32\LIB\gdi32.lib includelib \MASM32\LIB\user32.lib includelib \MASM32\LIB\kernel32.lib includelib \MASM32\LIB\Comctl32.lib includelib \MASM32\LIB\comdlg32.lib includelib \MASM32\LIB\shell32.lib
includelib \masm32\lib\msvcrt.lib includelib \masm32\lib\masm32.lib
.data req db 'Введите количество элементов:',0 tpt db '%d',0 mtpt db 'mas[%d]= ',0 dtpt db 'mas[%d]= %d\n\r',0 @cls db 'cls',0 .data? n dd ? mas dd ? res dd ? .code start: ;system ("chcp 1251"); invoke SetConsoleCP, 1251 invoke SetConsoleOutputCP, 1251 ;system ("cls"); invoke crt_system, ADDR @cls ;printf ("Введите количество элементов:"); invoke crt_puts, ADDR req ;scanf ("%d",&n); invoke crt_scanf, ADDR tpt, ADDR n ;mas=(int*) malloc(n*sizeof(int)); mov eax,[n] shl eax,2 ; n*sizeof(int) invoke crt_malloc, eax mov [mas], eax ;for(i=0;i<n;i++) ;{printf("mas[%d]= ",i); ;scanf("%d",&mas[i]); ;} xor edx, edx mov ecx, [n] mov esi, [mas] @@: push ecx ; ecx, edx загадятся push edx ; invoke crt_printf, ADDR mtpt, edx ; mtpt db 'mas[%d]= ',0 invoke crt_scanf, ADDR tpt, esi pop edx pop ecx add esi,4 inc edx loop @B ;for(i=0;i<n/2;i++) mov ecx, [n] shr ecx, 1 ; n/2
mov esi, [mas]
mov eax, [n] dec eax mov ebx, 4; <---- sizeof int mul ebx mov edi, [mas] add edi, eax; <---- теперь edi указывает на mas[n-1]
@@: ;{temp = mas[i]; push [esi] ;mas[i] = mas[n-i-1]; mov eax, [edi] mov [esi], eax ;mas[n-i-1] = temp;} pop [edi] add esi, 4 sub edi, 4 loop @B
;for(i=0;i<n;i++) ;printf("%d ",mas[i]); mov ecx, [n] xor edx, edx mov esi, [mas] @@: mov eax, [esi] add esi, 4 push ecx push edx invoke crt_printf, ADDR dtpt, edx, eax pop edx pop ecx inc edx loop @B invoke crt__getch exit: invoke crt_free,[mas] invoke crt_exit,0 end start
|
|