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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2011, 21:47   #1
ahz4et
 
Регистрация: 15.01.2011
Сообщений: 5
По умолчанию запись данных в массив + цикл ассемблерной вставкой

Добрый день!

есть программа на паскале:
Код:
      Program test005;
      Var i,d:integer;
         A:array [5..11] of integer;
      Begin
         d:=1;
         i:=5;
       while i<=11 do    
          begin
             A[i]:=i or d;
             d:=d + A[i];
             if d>10 then A[i]:=127-i;
             inc(i);    
      end;
      for i:=5 to 11 do
            write(A[i]:4);writeln;
       End.
и интерпретация цикла ассемблером:

Код:
      Program test005;
      Var i,d:byte;
         A:array [5..11] of integer;
      Begin
         d:=1;
         i:=5;
      { while i<=11 do }
      asm
      @10:
      CMP   byte ptr i,000Bh
      JG     @30
      {begin}
      {       A[i]:=i or d; }
       
      MOV    AX,word ptr i
      OR     AX,word ptr d
      MOV    BX, word ptr i
      SHL    BX,1
      MOV    word ptr A[BX],AX
       
       {      d:=d + A[i]; }
      MOV    AX,word ptr d
      MOV    BX,word ptr i
      SHL    BX,1
      ADD    AX, word ptr A[BX]
      MOV    word ptr d,AX
       
      {       if d>10 then A[i]:=127-i;}
      CMP    byte ptr d,000Ah
      JNG    @20
      MOV    AX,007Fh
      SUB    AX,word ptr i
      MOV    BX,word ptr i
      SHL    BX,1
      MOV    word ptr A[BX],AX
      @20:
      {       inc(i);    }
      INC    byte ptr i
      JMP    @10
      @30:
      end;
      for i:=5 to 11 do
            write(A[i]:4);writeln;
       
       readln;
       End.
вроде работает, но какая то лажа с передачей данных в массив. подскажи где я мог натупить?

мне кажется что вся загвоздка тут:
Код:
MOV BX,word ptr i
SHL BX,1
MOV word ptr A[BX],AX
и ещё не могу разобраться зачем делать смещение влево на 1 бит.

Буду весьма признателен за какие-угодно объяснения!!

Последний раз редактировалось Stilet; 16.01.2011 в 11:02.
ahz4et вне форума Ответить с цитированием
Старый 16.01.2011, 00:31   #2
ahz4et
 
Регистрация: 15.01.2011
Сообщений: 5
По умолчанию

а так заработало... ничего не понимаю

Код:
Program test005;
Var i,d:integer;
   A:array [5..11] of integer;
Begin
   d:=1;
   i:=5;
{ while i<=11 do }
asm
@10:
CMP  i,000Bh
JG     @30
{begin}
{       A[i]:=i or d; }

MOV    AX,i
OR     AX,d
MOV    BX,i
SHL    BX,1
MOV    word ptr A[BX-10],AX

 {      d:=d + A[i]; }
MOV    AX,d
MOV    BX,i
SHL    BX,1
ADD    AX, word ptr A[BX-10]
MOV    d,AX

{       if d>10 then A[i]:=127-i;}
CMP    d,000Ah
JNG    @20
MOV    AX,007Fh
SUB    AX,i
MOV    BX,i
SHL    BX,1
MOV    word ptr A[BX-10],AX
@20:
{       inc(i);    }
INC    i
JMP    @10
@30:
end;
for i:=5 to 11 do
      write(A[i]:4);writeln;

 readln;
 End.
ahz4et вне форума Ответить с цитированием
Старый 16.01.2011, 11:10   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы так писал:
Код:
       Var i,d:integer;
         A:array [5..11] of integer;
label exx,els,whil;
begin
 asm
  mov dword ptr [i],5;
  mov dword ptr [d],1;
  mov esi,offset a;
  whil:
  cmp i,11
  jg exx
   mov eax,i
   or eax,[d]
   mov [esi],eax
   add [d],eax
   cmp [d],10
   jl els
    mov eax,127
    sub eax,i
    mov [esi],eax
   els:
   inc [i]
   add esi,4
   jmp whil
  exx:
 end;
       for i:=5 to 11 do
            write(A[i]:4);writeln;
readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Эт не совсем паскаль но схема такая.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.01.2011, 11:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы так писал:
Код:
       Var i,d:integer;
         A:array [5..11] of integer;
label exx,els,whil;
begin
 asm
  mov dword ptr [i],5;
  mov dword ptr [d],1;
  mov esi,offset a;
  whil:
  cmp i,11
  jg exx
   mov eax,i
   or eax,[d]
   mov [esi],eax
   add [d],eax
   cmp [d],10
   jl els
    mov eax,127
    sub eax,i
    mov [esi],eax
   els:
   inc [i]
   add esi,4
   jmp whil
  exx:
 end;
       for i:=5 to 11 do
            write(A[i]:4);writeln;
readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Эт не совсем паскаль но схема такая.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл, запись результат в ячейки bruce_lee Microsoft Office Excel 4 06.10.2010 16:08
Как вызвать функцию в ассемблерной вставке, зная адрес iceman2112 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 04.05.2010 13:38
Запись в массив данных бинарного дерева m9yt Общие вопросы C/C++ 2 14.03.2010 12:49
Помогите с вставкой данных TextBox dark_bars Microsoft Office Excel 9 02.12.2009 20:40
Задачка на ассемблере или любой распостраненный язык программирования с ассемблерной вставкой. Gremlin Помощь студентам 1 21.01.2009 21:22