Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
ВнизASM Найти похожие ветки
← →
Denis__ © (2009-02-27 18:51) [0]Хай всем) Знаю, что не в тему, но тут есть знатоки асма, знаю тоже.
Задача : Выяснить, является ли N (cлово) степенью тройки. Если да, то в К записать эту степень, если нет К = -1. Сделал тремя способами, вопрос - как лучше?
Вариант 1DW 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:
-----------------------------------------------------
Вариант 3DW 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