Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];

Вниз

ASM   Найти похожие ветки 

 
Denis__ ©   (2009-02-27 18:51) [0]

Хай всем) Знаю, что не в тему, но тут есть знатоки асма, знаю тоже.
Задача : Выяснить, является ли 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:10) [1]


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


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


 
Denis__ ©   (2009-02-27 20:18) [2]

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


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

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

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

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


 
Sha ©   (2009-02-27 20:30) [4]

Есть еще четвертый вариант: глянуть в 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) [5]

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

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

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


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


> глянуть в CPU window


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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.057 c
15-1235058988
Turok
2009-02-19 18:56
2009.04.19
Компонент для графика функции sin(x)


2-1235398445
madmech
2009-02-23 17:14
2009.04.19
Как изменить TComboBoxEx


11-1172928776
Dmitry___
2007-03-03 16:32
2009.04.19
Сохранение контролов в файл


2-1235726156
Dennis I. Komarov
2009-02-27 12:15
2009.04.19
TField.Value to string


2-1236178765
Artem
2009-03-04 17:59
2009.04.19
EhLib, OnKeyDown





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский