Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Лаба по строкам


Автор: Artiom 16.5.2004, 16:32
Делаю лабу по ASM, пока настолько безграмотен, что всё идет с трудом.
Задача такая: Определить количество слов в строке, у которых совпадают первый и последний символы
Может быть кто набросает немного кода?
Честное слово это не от лени, просто вправду совсем нет времени - уже сдаю сессию.

Автор: Chingachguk 16.5.2004, 18:16
Цитата

const
  StrWithWords: string = 'First Second Third Lake Foot Sand Tread Fake Dust Solid';
  NumWords: word = 0;
begin
  asm
  mov  si,offset StrWithWords
  { bx = string len }
  mov  dl,[si]
  mov  dh,0
  { dx = point to last symbol }
  add  dx,si
  { si = point to first symbol }
  inc  si
  { cx = number of founded words }
  xor  cx,cx
  { bx = point to founded first and last symbols }
  mov  bx,si
  { Store bx }
  push bx
@@FindWords:
  cmp  si,dx
  jae  @@SearchDone
  { Get first symbol of current word in al }
  mov  al,[si]
  { Find last symbol in word }
  mov  di,si
@@ScanForFiller:
  inc  di
  cmp  di,dx
  ja  @@ScanForFillerDone
  cmp  byte ptr [di],' '
  jnz  @@ScanForFiller
@@ScanForFillerDone:
  { Get last symbol in ah }
  mov  ah,[di-1]
  { Store first and last symbol in string }
  mov  word ptr [bx],ax
  { bx point to next pair }
  add  bx,2
  { si = point to next word }
  lea  si,[di+1]
  { Increment number of words }
  inc  cx
  jmp  @@FindWords
@@SearchDone:
  { bx = point to begin of pairs }
  pop  bx
  cmp  cx,1
  jbe  @@NoMoreWords
  dec  cx
@@ComapreWords:
  { Get first and last symbols in ax }
  mov  ax,[bx]
  add  bx,2
  mov  si,bx
  push cx
@@ScanForCurrentPair:
  cmp  word ptr [si],ax
  jnz  @@NoEqualPair
  inc  word ptr NumWords
@@NoEqualPair:
  { si = point to next pair }
  add  si,2
  loop @@ScanForCurrentPair
  pop  cx
  loop @@ComapreWords
@@NoMoreWords:
  end;
  writeln('Number words = ',NumWords);
end.

Добавлено @ 18:18
Да, и уточни - что делать, если в строке есть три слова типа Ted Tod Tread.

Автор: Artiom 16.5.2004, 18:47
Спасибо. буду разбираться.
Цитата
Да, и уточни - что делать, если в строке есть три слова типа Ted Tod Tread.

Честно говоря не понял. мне подходят слова типа Tot, dfffsd, anna и т.д.
А что такое @@? Я так понял что это переход на соответствующую метку, но в моих методичках такого нет. И в ближнем учебнике тоже.

Автор: Serzh 17.5.2004, 00:15
Цитата(Artiom @ 16.5.2004, 18:47)
А что такое @@? Я так понял что это переход на соответствующую метку, но в моих методичках такого нет. И в ближнем учебнике тоже.

это просто название метки...
можешь их убрать, если они тебе так не нравяться... smile.gif

Автор: Guest 17.5.2004, 08:16
Цитата
это просто название метки...
можешь их убрать, если они тебе так не нравяться... 


Это не совсем так... Изначально символ "@" означал именно "адрес, адресный операнд". Если кто заметил, то я написал этот код не на чистом ассемблере, но на ассемблерных вставках в языке tp7. А если кто писал на паскале (или делфи), тот знает, что такое:

Цитата

var
MyIntVariable: integer;
MyPointToVar: pointer;
begin
MyPointToVar:=@MyIntVariable; { Адрес переменной MyIntVariable}


В ассемблерных вставках в этом языке соответственно нельзя называть метки иначе как с "@".

Автор: p0s0l 17.5.2004, 19:34
Цитата
В ассемблерных вставках в этом языке соответственно нельзя называть метки иначе как с "@".

Вернее можно, но дополнительно надо их объявлять в Label, поэтому так почти не делают - лишний геморрой:
Код
label l1;
begin
 asm
   jmp l1
   l1:
   ret
 end;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)