Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.018 c
2-1235981744
Dm
2009-03-02 11:15
2009.04.19
TaskBar закрывает мое окно)))


10-1155649556
Степан
2006-08-15 17:45
2009.04.19
Объектная модель Paint


15-1232824237
Unknown user
2009-01-24 22:10
2009.04.19
Работа с потоками в Delphi


2-1235817524
Андрей (начинающий)
2009-02-28 13:38
2009.04.19
Как узнать имя TTF шрифта, если оно не совпадает с названием


2-1235740340
xaero93
2009-02-27 16:12
2009.04.19
Помогите разобраться




   Наверх