Добро пожаловать на форумы Боевого Народа (бывший форум Live.CNews.ru)!

ВАЖНЫЕ ТЕМЫ: FAQ по переезду и восстановлению учеток | Ошибки и глюки форума.
О проблемах с учетными записями писать СЮДА.
Assembler, sqrt - Форумы Боевого Народа
IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
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





Гости






насчет корня - то, что я искал smile.gif
Насчет 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
   A dw 3 dup(?)
...
CODESEG
   mov A[1], al
пишет " **Error** 3.asm(55) Operand types do not match "

Также присутствует ошибка
Код
        mov ecx, 3
**Error** 3.asm(87) Undefined symbol: ECX
        mov ecx, 3
*Warning* 3.asm(87) Argument needs type override
с разными e-регистрами.
Кстати, код был скопирован из ассемблерной вставки в с++, там все работало.

Буду благодарен за толковое объяснение. yes.gif
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 15.9.2006, 9:59
Сообщение #9





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Цитата(.BrAT @ Вторник, 12 Сентября 2006, 20:24:50) *
Гм... Вопрос о вводе-выводе чисел остается открытым...

И еще: написал прогу но при попытке
Код
DATASEG
   A dw 3 dup(?)
...
CODESEG
   mov A[1], al
пишет " **Error** 3.asm(55) Operand types do not match "

Также присутствует ошибка
Код
        mov ecx, 3
**Error** 3.asm(87) Undefined symbol: ECX
        mov ecx, 3
*Warning* 3.asm(87) Argument needs type override
с разными e-регистрами.
Кстати, код был скопирован из ассемблерной вставки в с++, там все работало.

Буду благодарен за толковое объяснение. yes.gif

На счет ввода-вывода вещ. чисел - можешь попробывать написать простую программу, например на языке С++, только 16 разрядном!!!, которая всего что делает так это вводит/выводит числа, дизассемблировать ее, ну и найти нужный код, а по сути он будет весь, так как больше никаких действий в проге нет!

Первая ошибка очевидна, даже ребенок ее заметит :D !!!!!
А если серьезно, то A - это массив двойных слов - dw.
Двойное слово (dw) - это 4 байта (B).
Поэтому когда делаешь mov A[1], al, тебе и мне очевидно что мы имеем ввиду (преподов которые дают эти долбанные задания и ассемблер) , а вот ассемблер тупит devil.gif - ему нужно строгое соответсвие типов.
Тут есть два решения этой проблемы:
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
Регистрация: --
Пользователь №:



Цитата(SIMBA @ Пятница, 15 Сентября 2006, 09:59:13) *
Двойное слово (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 степени. Пожалуйста помогите. Зарание благодарна
Перейти в начало страницы
Вставить ник
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 22.9.2024, 0:27
Консультации адвоката по уголовным делам. Бесплатно. По всей России