Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ASM


Denis__ ©   (2009-02-27 18:51:00) 

Хай всем) Знаю, что не в тему, но тут есть знатоки асма, знаю тоже.
Задача : Выяснить, является ли N (cлово) степенью тройки. Если да, то в К записать эту степень, если нет К = -1. Сделал тремя способами, вопрос - как лучше?
Вариант 1
DW N ?            ; слово-N
...
DB K 0            ;    байт-К = 0
CMP N, 1       ;   сравниваем  N и  3^0
JE L_END      ;   если N == 3^0, то  выход,  К == 0
MOV K, -1
MOV AX, 1    
MOV BX, 1
XOR CL, CL  ;    Счетчик
L:
INC CL        
ADD BX, BX ;    BX == 2BX
JO L_END    ;    Если возникло переполнение, то выход, К == -1
ADD BX, AX ;    BX == 3^CL
JO L_END    ;   Если возникло переполнение, то выход, К == -1
MOV AX, BX;   AX == 3^CL
CMP N, AX  ;   Сравниваем N и 3^CL
JB L              ;  “<”  ==>  идем в L  
JA L_END    ;  “>”  ==>  выход, K == -1
MOV K, CL  ;   N == 3^CL ==> K == CL
L_END:

Вариант 2
-----------------------------------------------------
DW N ?            ; слово-N
...
DB K 0            ;    байт-К = 0
CMP N, 1       ;   сравниваем  N и  3^0
JE L_END      ;   если N == 3^0, то  выход,  К == 0
MOV K, -1
MOV AX, 1    
MOV BX, 3
XOR CL, CL  ;    Счетчик
L:
INC CL  
MUL BX        ; AX == 3^CL
JO L_END    ; Переполнение – выход, К == -1
CMP N, AX  ;   Сравниваем N и 3^CL
JA L              ;  “>”  ==>  идем в L  
JB L_END    ;  “<” ==>  выход, K == -1
MOV K, CL  ;   N == 3^CL ==> K == CL
L_END:

-----------------------------------------------------
Вариант 3
DW N ?            ; слово-N
...
DB K 0            ;    байт-К = 0
CMP N, 1       ;   сравниваем  N и  3^0
JE L_END      ;   если N == 3^0, то  выход,  К == 0
MOV K, -1
MOV AX, N  
MOV BX, 3
XOR DX, DX
XOR CL, CL  ;    Счетчик
L:
INC CL  
DIV BX        ; AX == AX/3
CMP DX, 0
JE L_END    ;  Остаток не ноль – выход, К == -1  
CMP AX, 1
JNE L           ; AX > 1 - продолжаем
MOV K, CL  ;   N == 3^CL ==> K == CL
L_END:


Сергей М.   (2009-02-27 20:38:00) [1]


> глянуть в CPU window


Угу.
Выкинуть оттуда лишнее, если оно очевидно для учебной задачи - вот и будет "как лучше")


Sha   (2009-02-27 20:30:00) [2]

Есть еще четвертый вариант: глянуть в CPU window для

function log3(n: integer): integer;
var
 i: integer;
begin;
 Result:=0;
 i:=1;
 while i<n do begin;
   inc(Result);
   i:=3*i;
   end;
 if i<>n then Result:=-1;
 end;


Denis__   (2009-02-27 20:30:00) [3]

Да, это учебная задача. К сожалению, критерии оценки не были озвучены, да я думаю, что "5" будет у тех кто написал что-то "похожее на правду"=) Сюда пришел просто поучиться у тех, кто реально пишет, а не просто знает теорию. Delphi действительно не пахнет, что я сразу и честно сказал :

> Знаю, что не в тему, но

Кроме того, пока мы пишем "под дос" то есть никаких 32 разрядов=) Возможно будем писать под Unix, но еще ничего не известно.


Сергей М.   (2009-02-27 20:25:00) [4]

Я просто подумал, что это учебная задача)

Тем более что в ней не пахнет Delphi вообще и BASM конкретно и в частности.

Не лучше ли будет для начала переложить все эти три произведения для ВASM-скрипки 32-разрядного оркестра ?


Denis__   (2009-02-27 20:18:00) [5]

эээ.... Я полагаюсь на ваши соображения по этому поводу=). Кроме того, вопрос "как лучше" предполагал не только оценку, но и возможное предложение альтернативного варианта.(Ассемблер только начал изучать и практически уверен, что все можно сделать гораздо оптимальнее по всем параметрам) Учиться готов всегда. Кроме того, возможно, Вы можете что-нибудь посоветовать по оформлению кода?


Сергей М.   (2009-02-27 20:10:00) [6]


> вопрос - как лучше?


Контрвопрос - каковы критерии оценки на "хуже-лучше" ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо