2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 помогите перевести код задачи из Delphi в ассемблер
Сообщение29.04.2009, 20:19 


09/09/08
30
Россия
Вообщем условие такое: задан массив, необходимо проверить повторяется ли максимальные элемент массива. с ассемблером туговато скачал книжки но не могу никак решить задачу. на delphi за 2 мин написал. Если не трудно помогите пожалуйста, оч прошу :oops:
Код:
program Project;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
a:array [1..5] of integer;
max,i,count:integer;
ok:boolean;
begin
   for i:=1 to 5 do
    readln(a[i]);
   
   max:=a[1];
  for i:=2 to 5 do
      if a[i]>max then max:=a[i];
     
   i:=1;
   ok:=false;
   count:=0;
   while not ok and (i<=5) do
    begin
      if a[i]=max then
      begin
      inc(count);
      inc(i);
      if (count>=2) then ok:=true
      end
      else inc(i)
    end;

   writeln;
   writeln('max = ',max);
   writeln(ok);
   readln;
end.

написал только скелет на ассемблере
Код:
           .model tiny        
           .code           
            org 100h       
start:

;..................
;..................

Arr         dw 1,12,33,41,55 ;заданный массив
n           dw 5 ;кол-во элементов
Res_yes     db 'Yes'
            db 0Dh,0Ah,'$'
Res_no      db 'No'
            db 0Dh,0Ah,'$'

           end start

 Профиль  
                  
 
 
Сообщение29.04.2009, 21:33 


06/04/09
156
Воронеж
Какой компилятор для асма планируется? ОС?

 Профиль  
                  
 
 
Сообщение30.04.2009, 14:45 


04/02/08
325
Буково
А не получится скомпилировать, а затем дизассемблировать и доработать ручками?

 Профиль  
                  
 
 
Сообщение30.04.2009, 14:58 


09/09/08
30
Россия
Ed_Em писал(а):
А не получится скомпилировать, а затем дизассемблировать и доработать ручками?

я не знаю как это делается.

Добавлено спустя 43 секунды:

p51x писал(а):
Какой компилятор для асма планируется? ОС?

компилятор TASM 5.0

 Профиль  
                  
 
 
Сообщение30.04.2009, 20:25 


26/02/06
78
Russia, Nizhny Novgorod
Очень просто - перед и после важного кода процедуры делаем ассемблерные вставки с текстовым маркером, например, при помощи db (кажется). Компилируем программу, затем дизассемблируем, и смотрим на код, который оказался межу маркерами. Дизассемблировать во времена DOS было можно Sourcer, теперь, видимо, IDA Pro или PVDasm.

 Профиль  
                  
 
 
Сообщение01.05.2009, 14:36 


09/09/08
30
Россия
выложу образец программы на ассемблере, если сможете по данному образцу чем-то помочь по моей задаче, буду благодарен
Код:
; Двоичный поиск в массиве Arr значения Y
           .model tiny      ; модель памяти, используемая для COM        
   
           .code                ; начало сегмента кода

            org 100h          ; начальное значение счетчика - 100h
start:
            lea di,Arr          ; в di адрес начала массива
            Mov Bx, Y         ; в Bx искомое значение
            Xor Cx,Cx         ;  Cx=0 -- не нашли
            Cmp Bx,[di]      ; Y <=Arr[1] ?
            Ja  Chk_last     ; нет, сравнить с последним
            Je Eq_1            ; равно первому?       
            jmp Output       ; нет в массиве -- вывод результата
Eq_1:     
            inc Cx                ; Cx=1 --нашли
            jmp Output        ;         

Chk_last:
            Mov Si,n          ; в Si количество элементов массива
            dec Si             
            Shl Si,1           ; в Si длина массива в байтах
            Add Si,di         ; в Si адрес последнего элемента 
            Cmp bx,[si]     ; Arr[n]>=Y?
            Jb search       ; нет, искать в середине
            Je Eq_n          ;  равно последнему   
           
            jmp Output     ; нет в массиве, больше последнего

Eq_n:     
             inc Cx            ; нашли = последнему   
            jmp Output;

        ;поиск внутри массива
search:
           Mov Si, n          ; в si смещение на половину массива
Iven_inx:
           Test Si,1          ; проверка на четность
           Jz Add_inx       ;
           Inc Si               ; сделать четным

Add_inx:
           Add di,si          ; в di адрес очередного элемента
Compare:
           Cmp Bx,[di]        ; Arr[i] = Y?
           Je All_done        ; нашли
           Ja Higer           ; выбрать отрезок для продолжения поиска
       ; искать в левой части
           Cmp Si,2           ; не закончились элементы?         
           Jne inx_ok         ;         
           
no_match:     
           jmp Output         ;не нашли

inx_ok:
           Shr Si,1           ; разделить индекс на 2
           Test Si,1         ; проверить на четность Si
           Jz Sub_inx           
           Inc Si               ; сделать четным
Sub_inx:
           Sub di,si          ; в di  адрес очередного элемента
           Jmp Compare       
       
       ; искать в правой части
           
Higer:
          Cmp Si,2          ; не закончились элементы?         
          je no_match     ; да - выход         
          Shr Si,1            ; разделить индекс на 2
          Jmp  Iven_inx     
     
         
All_done :
           inc Cx             ;   нашли

      ; вывод результата         
Output:
            mov ah,9           ;
           Test Cx,1          ;
           Jz Send_no         ;
Send_yes:
           mov dx,offset Res_yes  ;
           Jmp Print
Send_no:
           mov dx,offset Res_no  ;
Print:
           int 21h            ;
           ret                ;

Arr         dw 1,12,33,41,55
Y           dw 33
n           dw 5
Res_yes     db 'Value exist'
            db 0Dh,0Ah,'$'
Res_no      db 'Value not found'
            db 0Dh,0Ah,'$'

           end start

 Профиль  
                  
 
 
Сообщение06.05.2009, 14:29 


23/12/08
36
ключ \s и получается ассемблерный код

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group