2014 dxdy logo

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

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




 
 помогите перевести код задачи из Delphi в ассемблер
Сообщение29.04.2009, 20:19 
Вообщем условие такое: задан массив, необходимо проверить повторяется ли максимальные элемент массива. с ассемблером туговато скачал книжки но не могу никак решить задачу. на 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 
Какой компилятор для асма планируется? ОС?

 
 
 
 
Сообщение30.04.2009, 14:45 
А не получится скомпилировать, а затем дизассемблировать и доработать ручками?

 
 
 
 
Сообщение30.04.2009, 14:58 
Ed_Em писал(а):
А не получится скомпилировать, а затем дизассемблировать и доработать ручками?

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

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

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

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

 
 
 
 
Сообщение30.04.2009, 20:25 
Очень просто - перед и после важного кода процедуры делаем ассемблерные вставки с текстовым маркером, например, при помощи db (кажется). Компилируем программу, затем дизассемблируем, и смотрим на код, который оказался межу маркерами. Дизассемблировать во времена DOS было можно Sourcer, теперь, видимо, IDA Pro или PVDasm.

 
 
 
 
Сообщение01.05.2009, 14:36 
выложу образец программы на ассемблере, если сможете по данному образцу чем-то помочь по моей задаче, буду благодарен
Код:
; Двоичный поиск в массиве 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 
ключ \s и получается ассемблерный код

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group