Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2013, 21:52   #1
Шпилька
Пользователь
 
Регистрация: 15.05.2012
Сообщений: 10
По умолчанию Преобразование из Паскаля в Ассемблер

Здравствуйте. Проблема следующая. есть программа на Паскале, основную ее часть (процедуру summa) нужно преобразовать по код Ассемблера

Код:
uses crt;
const n=10;
var a,b:array[1..n] of integer;
i,s,j,min:integer;
procedure sozdanie;
begin
for i:=1 to n do
a[i]:=random(30)-10;
writeln; end;
procedure vivod;
begin
writeln('Massiv');
for i:=1 to n do
write (a[i],' '); writeln; end;
procedure summa;
var sum,k:integer;
begin
sum:=0; k:=0; min:=maxint;
for i:=1 to n do
if a[i]<0 then sum:=sum+a[i] else begin inc(k); b[k]:=a[i];
if b[k]<min then min:=b[k]; end;
writeln;
writeln('Summa otr.chisel',' ',sum);
writeln;
for i:=1 to k do write(b[i],' ');
writeln;
writeln;
writeln('Minimum',' ',min); end;
begin
clrscr;
randomize;
sozdanie;
vivod;
summa;
readkey;
end.
Также есть условие задачи: Создать массив А[1..N]. Определить сумму отрицательных чисел. Из положительных чисел массива А создать массив В и определить в нем минимальное число. Вывести сумму, массив В и его минимальное.
Заранее спасибо

Последний раз редактировалось Шпилька; 27.01.2013 в 21:56.
Шпилька вне форума Ответить с цитированием
Старый 27.01.2013, 22:03   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Шпилька. В отладчике код процедуры посмотрите. Проще пареной репы.
vadimych вне форума Ответить с цитированием
Старый 28.01.2013, 13:11   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от vadimych
В отладчике код процедуры посмотрите. Проще пареной репы.
Что это просто как пареная репка, тут я согласен.
Вот только не уверен, что автора темы устроит тот ассемблерный код, который сгенерировал компилятор Паскаля...


в отладчике будет такой код:
Код:
¦PROGRAM.SUMMA: begin
¦  cs:0121 55             push   bp
¦  cs:0122 89E5           mov    bp,sp
¦  cs:0124 B80600         mov    ax,0006
¦  cs:0127 9AC5023E62     call   far SYSTEM.STACKCHECK
¦  cs:012C 83EC06         sub    sp,0006
¦PROGRAM.19: sum:=0; k:=0; min:=maxint;
¦  cs:012F>31C0           xor    ax,ax
¦  cs:0131 8946FE         mov    [bp-02],ax
¦  cs:0134 31C0           xor    ax,ax
¦  cs:0136 8946FC         mov    [bp-04],ax
¦  cs:0139 C7068000FF7F   mov    word ptr [PROGRAM.MIN],7FFF
¦PROGRAM.20: for i:=1 to n do
¦  cs:013F C7067A000100   mov    word ptr [PROGRAM.I],0001
¦  cs:0145 EB04           jmp    PROGRAM.21 (014B)
¦  cs:0147 FF067A00       inc    word ptr [PROGRAM.I]
¦PROGRAM.21: if a[i]<0 then sum:=sum+a[i] else begin inc(k); b[k]:=a[i];
¦  cs:014B A17A00         mov    ax,[PROGRAM.I]
¦  cs:014E 99             cwd
¦  cs:014F BF0001         mov    di,0100
¦  cs:0152 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:0157 8BF8           mov    di,ax
¦  cs:0159 D1E7           shl    di,1
¦  cs:015B 83BD500000     cmp    word ptr [di+0050],0000
¦  cs:0160 7D23           jnl    0185
¦  cs:0162 A17A00         mov    ax,[PROGRAM.I]
¦  cs:0162 A17A00         mov    ax,[PROGRAM.I]
¦  cs:0165 99             cwd
¦  cs:0166 BF0001         mov    di,0100
¦  cs:0169 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:016E 8BF8           mov    di,ax
¦  cs:0170 D1E7           shl    di,1
¦  cs:0172 8B855000       mov    ax,[di+0050]
¦  cs:0176 0346FE         add    ax,[bp-02]
¦  cs:0179 7105           jno    0180
¦  cs:017B 9ABF023E62     call   far SYSTEM.OVERFLOW
¦  cs:0180 8946FE         mov    [bp-02],ax
¦  cs:0183 EB5C           jmp    01E1
¦  cs:0185 FF46FC         inc    word ptr [bp-04]
¦  cs:0188 A17A00         mov    ax,[PROGRAM.I]
¦  cs:018B 99             cwd
¦  cs:018C BF0001         mov    di,0100
¦  cs:018F 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:0194 8BF8           mov    di,ax
¦  cs:0196 D1E7           shl    di,1
¦  cs:0198 8B8D5000       mov    cx,[di+0050]
¦  cs:019C 8B46FC         mov    ax,[bp-04]
¦  cs:019F 99             cwd
¦  cs:01A0 BF0001         mov    di,0100
¦  cs:01A3 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:01A8 8BF8           mov    di,ax
¦  cs:01AA D1E7           shl    di,1
¦  cs:01AC 898D6400       mov    [di+0064],cx
¦PROGRAM.22: if b[k]<min then min:=b[k]; end;
¦  cs:01B0 8B46FC         mov    ax,[bp-04]
¦  cs:01B3 99             cwd
¦  cs:01B4 BF0001         mov    di,0100
¦  cs:01B7 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:01BC 8BF8           mov    di,ax
¦  cs:01BE D1E7           shl    di,1
¦  cs:01C0 8B856400       mov    ax,[di+0064]
¦  cs:01C4 3B068000       cmp    ax,[PROGRAM.MIN]
¦  cs:01C8 7D17           jnl    01E1
¦  cs:01CA 8B46FC         mov    ax,[bp-04]
¦  cs:01CD 99             cwd
¦  cs:01CE BF0001         mov    di,0100
¦  cs:01D1 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:01D6 8BF8           mov    di,ax
¦  cs:01D8 D1E7           shl    di,1
¦  cs:01DA 8B856400       mov    ax,[di+0064]
¦  cs:01DE A38000         mov    [PROGRAM.MIN],ax
¦  cs:01E1 833E7A000A     cmp    word ptr [PROGRAM.I],000A
¦  cs:01E6 7403           je     PROGRAM.23 (01EB)
¦  cs:01E8 E95CFF         jmp    0147
¦PROGRAM.23: writeln;
¦  cs:01EB BF9801         mov    di,0198
¦  cs:01EE 1E             push   ds
¦  cs:01EF 57             push   di
¦  cs:01F0 9AD5053E62     call   far SYSTEM.WRITELINE
¦  cs:01F5 9A89023E62     call   far SYSTEM.INOUTCHECK
¦PROGRAM.24: writeln('Summa otr.chisel',' ',sum);
¦  cs:01FA BF9801         mov    di,0198
¦  cs:01FD 1E             push   ds
¦  cs:01FE 57             push   di
¦  cs:01FF BF0801         mov    di,0108
¦  cs:0202 0E             push   cs
¦  cs:0203 57             push   di
¦  cs:0204 6A00           push   0000
¦  cs:0206 9AF9063E62     call   far SYSTEM.WRITESTR
¦  cs:020B 6A20           push   0020
¦  cs:020D 6A00           push   0000
¦  cs:020F 9A73063E62     call   far SYSTEM.WRITECHAR
¦  cs:0214 8B46FE         mov    ax,[bp-02]
¦  cs:0217 99             cwd
¦  cs:0218 52             push   dx
¦  cs:0219 50             push   ax
¦  cs:021A 6A00           push   0000
¦  cs:021C 9A81073E62     call   far SYSTEM.WRITEINT
¦  cs:0221 9AD5053E62     call   far SYSTEM.WRITELINE
¦  cs:0226 9A89023E62     call   far SYSTEM.INOUTCHECK
продолжение в следующем сообщении

Последний раз редактировалось Serge_Bliznykov; 28.01.2013 в 13:25.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.01.2013, 13:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

продолжение кода процедуры...

Код:
¦PROGRAM.25: writeln;
¦  cs:022B BF9801         mov    di,0198
¦  cs:022E 1E             push   ds
¦  cs:022F 57             push   di
¦  cs:0230 9AD5053E62     call   far SYSTEM.WRITELINE
¦  cs:0235 9A89023E62     call   far SYSTEM.INOUTCHECK
¦PROGRAM.26: for i:=1 to k do write(b[i],' ');
¦  cs:023A 8B46FC         mov    ax,[bp-04]
¦  cs:023A 8B46FC         mov    ax,[bp-04]
¦  cs:023D 8946FA         mov    [bp-06],ax
¦  cs:0240 B80100         mov    ax,0001
¦  cs:0243 3B46FA         cmp    ax,[bp-06]
¦  cs:0246 7F47           jg     PROGRAM.27 (028F)
¦  cs:0248 A37A00         mov    [PROGRAM.I],ax
¦  cs:024B EB04           jmp    0251
¦  cs:024D FF067A00       inc    word ptr [PROGRAM.I]
¦  cs:0251 BF9801         mov    di,0198
¦  cs:0254 1E             push   ds
¦  cs:0255 57             push   di
¦  cs:0256 A17A00         mov    ax,[PROGRAM.I]
¦  cs:0259 99             cwd
¦  cs:025A BF0001         mov    di,0100
¦  cs:025D 9A97023E62     call   far SYSTEM.RANGECHECK
¦  cs:0262 8BF8           mov    di,ax
¦  cs:0264 D1E7           shl    di,1
¦  cs:0266 8B856400       mov    ax,[di+0064]
¦  cs:026A 99             cwd
¦  cs:026B 52             push   dx
¦  cs:026C 50             push   ax
¦  cs:026D 6A00           push   0000
¦  cs:026F 9A81073E62     call   far SYSTEM.WRITEINT
¦  cs:0274 6A20           push   0020
¦  cs:0276 6A00           push   0000
¦  cs:0278 9A73063E62     call   far SYSTEM.WRITECHAR
¦  cs:027D 9AF6053E62     call   far SYSTEM.WRITEEND
¦  cs:0282 9A89023E62     call   far SYSTEM.INOUTCHECK
¦  cs:0287 A17A00         mov    ax,[PROGRAM.I]
¦  cs:028A 3B46FA         cmp    ax,[bp-06]
¦  cs:028D 75BE           jne    024D
¦PROGRAM.27: writeln;
¦  cs:028F BF9801         mov    di,0198
¦  cs:0292 1E             push   ds
¦  cs:0293 57             push   di
¦  cs:0294 9AD5053E62     call   far SYSTEM.WRITELINE
¦  cs:0299 9A89023E62     call   far SYSTEM.INOUTCHECK
¦PROGRAM.28: writeln;
¦  cs:029E BF9801         mov    di,0198
¦  cs:02A1 1E             push   ds
¦  cs:02A2 57             push   di
¦  cs:02A3 9AD5053E62     call   far SYSTEM.WRITELINE
¦  cs:02A8 9A89023E62     call   far SYSTEM.INOUTCHECK
¦PROGRAM.29: writeln('Minimum',' ',min); end;
¦  cs:02AD BF9801         mov    di,0198
¦  cs:02B0 1E             push   ds
¦  cs:02B1 57             push   di
¦  cs:02B2 BF1901         mov    di,0119
¦  cs:02B5 0E             push   cs
¦  cs:02B6 57             push   di
¦  cs:02B7 6A00           push   0000
¦  cs:02B9 9AF9063E62     call   far SYSTEM.WRITESTR
¦  cs:02BE 6A20           push   0020
¦  cs:02C0 6A00           push   0000
¦  cs:02C2 9A73063E62     call   far SYSTEM.WRITECHAR
¦  cs:02C7 A18000         mov    ax,[PROGRAM.MIN]
¦  cs:02CA 99             cwd
¦  cs:02CB 52             push   dx
¦  cs:02CC 50             push   ax
¦  cs:02CD 6A00           push   0000
¦  cs:02CF 9A81073E62     call   far SYSTEM.WRITEINT
¦  cs:02D4 9AD5053E62     call   far SYSTEM.WRITELINE
¦  cs:02D9 9A89023E62     call   far SYSTEM.INOUTCHECK
¦  cs:02DE C9             leave
¦  cs:02DF C3             ret
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.01.2013, 14:55   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

хотелось бы услышать само задание, ибо код на паскале просто жуть...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 28.01.2013, 15:54   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Serge_Bliznykov, зверский код. Буду давать ссылку на эту тему любителям поболтать о превосходстве ЯВУ над ассемблером.
vadimych вне форума Ответить с цитированием
Старый 28.01.2013, 20:33   #7
Шпилька
Пользователь
 
Регистрация: 15.05.2012
Сообщений: 10
По умолчанию

Цитата:
DiemonStar, хотелось бы услышать само задание, ибо код на паскале просто жуть...
Пожалуйста
условие задачи: Создать массив А[1..N]. Определить сумму отрицательных чисел. Из положительных чисел массива А создать массив В и определить в нем минимальное число. Вывести сумму, массив В и его минимальное.
Шпилька вне форума Ответить с цитированием
Старый 28.01.2013, 21:28   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Шпилька
Пожалуйста
условие задачи: Создать массив А[1..N]. Определить сумму отрицательных чисел. Из положительных чисел массива А создать массив В и определить в нем минимальное число. Вывести сумму, массив В и его минимальное.
Это ПОЛНОСТЬЮ условие задачи?
Тогда откуда взялся Ассемблер?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2013, 07:45   #9
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Шпилька, вот Вам код всей программы на ассемблере. Комбинируйте.
Код:
.model small
.stack 100h
.data

msg db 'Massiv',0dh,0ah,'$'
msg_sum db 'Summa otr.chisel ','$'
msg_min db 'Minimum ','$' 
pos_array dw 10 dup (?)
array dw 10 dup (?)

.code
.386
start:

mov ax,@data
mov ds,ax
mov es,ax

mov dx,offset msg
call print_msg

mov ecx,10
xor esi,esi
mov di,offset array
mov bx,offset pos_array
mov ebp,10

@0:
db 0fh,31h              ; rdtsc
and eax,0ffffh
stosw
test ax,ax
jns @3
neg ax
push ax
add esi,eax
mov al,'-'
int 29h
pop ax
jmp @1

@3:
mov [bx],ax
add bx,2

@1:
push cx
call print
pop cx
loop @0

mov al,10
int 29h
int 29h

mov dx,offset msg_sum
call print_msg

mov al,'-'
int 29h

mov eax,esi
call print

mov al,10
int 29h
int 29h

mov si,offset pos_array
mov cx,bx
sub cx,si
shr cx,1
sub cx,2
js exit

lodsw
mov bx,ax

@4:
push cx
call print
lodsw
cmp ax,bx
ja @2
mov bx,ax
@2:
pop cx
loop @4

call print

mov al,10
int 29h
int 29h

mov dx,offset msg_min
call print_msg

and eax,0ffffh
mov ax,bx
call print

exit:
xor ax,ax
int 16h

mov ax,4c00h
int 21h

; -------------------------------------------------------------------------

print_msg proc

mov ah,9
int 21h
ret

print_msg endp

; -------------------------------------------------------------------------

print proc

xor cx,cx

@5:
xor dx,dx
div ebp
push dx
inc cx
test eax,eax
jnz @5

@6:
pop ax
or al,30h
int 29h
loop @6

mov al,' '
int 29h

ret
print endp

end start
vadimych вне форума Ответить с цитированием
Старый 29.01.2013, 09:09   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от vadimych
вот Вам код всей программы на ассемблере. Комбинируйте.
vadimych, и не лень же Вам было?!!!

строго говоря, задача решена не совсем корректно,
не все числа обрабатываются как положительные (см. копию консоли)
:
Цитата:
Код:
C:\TP\ASM>PROG77.EXE
Massiv
24239 30069 -29832 -12731 4769 -1624 3807 -2722 3099 -3319

                                                           Summa otr.chisel -502
28

   24239 30069 4769 3807

                         Minimum 3807
число 3099 программа пропустила..
по моему, всегда последнее положительное число не обрабатывается...
А сумма отрицательных считается отлично!


НО! Труд проделан достаточно большой.
Респект! снимаю шляпу!


и ещё. Не уверен, что хоть мой пост, хоть ваш окажут хотя бы малую помощь автору топика. я не зря пытаю его(её) насчёт ассемблера.... Думаю, что тут речь идёт о встроенном в Паскаль ассемблере (который BASM). Но в задании упоминания об этом я так и не увидел...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транслирование с паскаля на ассемблер. Astar Помощь студентам 0 24.11.2012 00:36
Перевод с паскаля на ассемблер Сильф Помощь студентам 1 16.06.2012 19:25
Перевод проги из паскаля в ассемблер .:DEZ:. Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 26 12.06.2012 15:56
С Паскаля на Си++ Svetlanka_ya Помощь студентам 0 16.05.2010 12:17
Из паскаля в ассемблер Archiserafim Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 03.09.2009 22:02