Assembler, sqrt |
|
Здравствуйте, гость ( Вход | Регистрация )
Assembler, sqrt |
Гость_.BrAT_* |
13.6.2006, 3:19
Сообщение
#1
|
Гости |
Нашел кусок кода для нахождения кв. корня, но не могу проверить, рабочий или нет. Мож кто скомпилирует? Заодно посмотрит, каких багов я словил...
------- В общем, код совершенно неправильный... :roll: Наводящий вопрос: как реализовать ввод-вывод вещественных чисел? И извлечение корня.. |
|
|
13.6.2006, 14:21
Сообщение
#2
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
А почему бы тебе не использовать команды MMX? Будет и проще и намного точнее.
Не проверю, у меня АСМ не пашет... |
|
|
16.6.2006, 14:37
Сообщение
#3
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
На счет извлечения корня - проще не придумать:
Код fld d; загоняем в сопроцессор переменную - вещ.число
fsqrt; извлечение корня fst d; загоняем результат в переменную - вещ.число Просто и со вкусом :P - выполняется одной командой сопроцессора :!: С вводом - выводом вещественных чисел, посморю дома, только там у меня ассемблер есть :wink: Кстати а ввод вывод обязятелен? Понимаю что вопрос немного глупый, но я имел ввиду если ты хочешь сделать что-то типа ассемблерной вставки, то загнать в переменную можно как я делал например Код var
d: Double; begin d := 16.0; asm fld d fsqrt fst d end; Caption := Format('%f',[d]) |
|
|
Гость_.BrAT_* |
16.6.2006, 20:06
Сообщение
#4
|
Гости |
насчет корня - то, что я искал
Насчет i/o - нет, нужно на чистом asm. Вывести преведствие, ссчитать число, [...], вывести число. |
|
|
18.6.2006, 11:10
Сообщение
#5
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
На счет ввода-вывода, это полноя Ж :oops:
Считать/вывести числа в асме нельзя, придеться считывать только строку и там уже разбирать что записано. Ввод/вывод строки показываю ниже Код .model small
.data stroka db 9,0,9 dup (?) ; строка для ввода с клавы str1 db 'Enter value: $'; приглашение ввести число str2 db 13,10,'$' ; перевод на новую строку str3 db 'Result: $' ; результат .code .startup ; вывод строки приглашения mov ah,9 lea dx, str1 int 21h ; считывание строки, содержащей число mov ah,0Ah lea dx,stroka int 21h ; перевод на новую строку mov ah,9 lea dx,str2 int 21h ; Вывод результат равен... lea dx,str3 int 21h ; модная процедурка для превращения из строки вещ. числа call stroka_V_chslo ; не менее модная процедука превращения числа в строку call chislo_V_stroku ;вывод аналогичный выводу приглашения .exit 0 end А вот на счет модных процедур stroka_V_chslo, chislo_V_stroku можно конечно сделать, но желания особого нету :twisted: Тут без бутылки-второй не обойтись 8) Если что могу алгоримт подсказать :!: |
|
|
Гость_.BrAT_* |
18.6.2006, 23:48
Сообщение
#6
|
Гости |
|
|
|
19.6.2006, 10:25
Сообщение
#7
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
На счет написанного там! И там! - речь идет о посимвольном вводе(шаг 24) и выводе(шаг 36).
Если ты считаешь что ввести строку легче в цикле посимвольно, чем сразу всю, то указанный подход как раз подойдет :wink: . Я конечно понимаю, что это намного веселее - вводить строку посимвольно, нажимая после каждого символа Enter, но я придерживаюсь более консервативных подходов :lol: Так или иначе вести число, тем более вещественное одной командой и даже циклом не получиться :twisted: Кстати там! написана com программа, а у меня - exe Я уже реализовал ввод вещ. числа, правда с некоторыми ограничениями. Ограничение 1: мантисса должна влазить в 2 байта (размер AX) Ограничений 2: число только положительное, но в твоей задаче это не проблема! На счет вывода - скажу честно - идееи по выводу отсутствуют :( |
|
|
12.9.2006, 20:24
Сообщение
#8
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Гм... Вопрос о вводе-выводе чисел остается открытым...
И еще: написал прогу но при попытке Код DATASEG пишет " **Error** 3.asm(55) Operand types do not match "A dw 3 dup(?) ... CODESEG mov A[1], al Также присутствует ошибка Код mov ecx, 3 с разными e-регистрами.**Error** 3.asm(87) Undefined symbol: ECX mov ecx, 3 *Warning* 3.asm(87) Argument needs type override Кстати, код был скопирован из ассемблерной вставки в с++, там все работало. Буду благодарен за толковое объяснение. |
|
|
15.9.2006, 9:59
Сообщение
#9
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Гм... Вопрос о вводе-выводе чисел остается открытым... И еще: написал прогу но при попытке Код DATASEG пишет " **Error** 3.asm(55) Operand types do not match "A dw 3 dup(?) ... CODESEG mov A[1], al Также присутствует ошибка Код mov ecx, 3 с разными e-регистрами.**Error** 3.asm(87) Undefined symbol: ECX mov ecx, 3 *Warning* 3.asm(87) Argument needs type override Кстати, код был скопирован из ассемблерной вставки в с++, там все работало. Буду благодарен за толковое объяснение. На счет ввода-вывода вещ. чисел - можешь попробывать написать простую программу, например на языке С++, только 16 разрядном!!!, которая всего что делает так это вводит/выводит числа, дизассемблировать ее, ну и найти нужный код, а по сути он будет весь, так как больше никаких действий в проге нет! Первая ошибка очевидна, даже ребенок ее заметит :D !!!!! А если серьезно, то A - это массив двойных слов - dw. Двойное слово (dw) - это 4 байта (B). Поэтому когда делаешь mov A[1], al, тебе и мне очевидно что мы имеем ввиду (преподов которые дают эти долбанные задания и ассемблер) , а вот ассемблер тупит - ему нужно строгое соответсвие типов. Тут есть два решения этой проблемы: 1) Сделать А - массивом байт, если это конечно не заденет логики программы 2) Использовать приведение типов Код mov A[1], dword ptr al На счет второй ошибки, то вначале проги надо поставить директиву, которая разрешает работать с 32-х разрядными регистрами Код .model small .486 .data A dw 3 dup(?) .code .startup mov A[1], dword ptr al ;... mov ecx, 3 ;... .exit 0 end Как сделать это при полном описание сегментов, т.е. как ты делаешь через Код CODESEG я честно говоря не помню, но от себя рекомендую перейти на описание сегментов как я показал выше.
|
|
|
4.10.2006, 20:40
Сообщение
#10
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
SIMBA Спасибо за советы!
Еще пара глупых вопросов: 1) dq - это float? Как их складывать и умножать? Как сделать "mov A, ax" если A - dq ? 2) Вот нашел работающий(проверено!) код для ввода. Может кто-нибудь объяснить, как это работает? Код strA DB 10,13,'Input A $'
A dw ? ;... WriteInteger proc near push ax push cx push bx push dx xor cx, cx mov bx, 10 cmp ax,0 jl ddd jmp divl ddd: push ax mov dl, '-' mov ah, 2 int 21h pop ax neg ax divl: xor dx, dx idiv bx push dx inc cx cmp ax,0 jg divl popl: pop ax add al, '0' call WriteChar loop popl pop dx pop bx pop cx pop ax ret WriteInteger endp WriteChar proc push ax push dx mov dl, al mov ah, 2 int 21h pop dx pop ax ret WriteChar endp ReadInteger proc push cx push bx push dx mov fl,0 xor cx, cx mov bx, 10 call ReadChar cmp al,'-' je nnn jmp nn nnn: mov fl,1 read: call ReadChar nn: cmp al, 13 je done sub al, '0' xor ah, ah xor dx, dx xchg cx, ax mul bx add ax, cx xchg ax, cx jmp read done: xchg ax, cx cmp fl,1 je eee jmp ee eee: neg ax ee: pop dx pop bx pop cx ret ReadInteger endp ReadChar proc mov ah,1 int 21h ret ReadChar endp start: mov ax, @data mov ds, ax mov ax, 0003h int 10h ;***** in A ********** mov ah,09h lea dx,strA int 21h call ReadInteger mov A,ax ;********************* ;... |
|
|
30.10.2006, 20:04
Сообщение
#11
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Двойное слово (dw) - это 4 байта (B). ... Тут есть два решения этой проблемы: 1) Сделать А - массивом байт, если это конечно не заденет логики программы 2) Использовать приведение типов Код mov A[1], dword ptr al .. ваще-то можно привести типы и по-другому: не регистр приводить к типу данных, а подтвердить обращение хоть к байту по адресу данного слова Код mov byte ptr A[1], al .но вообще меня заинтересовал другой твой ответ Код fld d; загоняем в сопроцессор переменную - вещ.число fsqrt; извлечение корня fst d; загоняем результат в переменную - вещ.число 1. не проверялось ли пиковое быстродействие при таком обращении к сопроцессору и если да, то скока вышло (и на какой конфигурации машины) 2. как я себе представляю, сопроцессор живёт своей жизнью и получить результат от него можно по прерыванию, котор.он вырабатывает по готовности. Но в то же время сопроцессор - штука конвеерная и может загружаться до выполнения предыдущей операции. Так вот сильно интересно есть ли опыт в этом (или хоть кто делал чонить подобное), как это проделать (обычным набором ком. или какойнить ассемблер с ММХ нужен), и апять же какая выходит пиковая производительность (ну и кониг. соотв. какая). (Особенно интересно пиковое значение, когда в идеале цикл и данные умещаются в кеше . но если нет то хоть что.) Я к сожалению этого сам сделать не могу сейчас по разным причинам, по этому скажи если было. Специально не делай канешно... ;) |
|
|
22.9.2008, 12:46
Сообщение
#12
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: |
Привет! Мне очень нужна помощь. Мне нужно на асемблере с омошью команд сопроцессора найти корень 5 степени. Пожалуйста помогите. Зарание благодарна
|
|
|
Текстовая версия | Сейчас: 22.9.2024, 0:27 |