Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. FFF0

    FFF0 New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2011
    Сообщения:
    18
    Устанавливаю обработчик исключений и взвожу TF.
    Код (Text):
    1. .code
    2.    start:
    3.         push seh_handler
    4.         push dword [fs:0]
    5.         mov [fs:0],esp
    6.  
    7.         pushf
    8.         pop eax
    9.         or ah,1
    10.         push eax
    11.         popf
    12.         nop
    13.         invoke ExitProcess,0
    14.  
    15.  
    16.  
    17.         seh_handler:
    18.         invoke Sleep,2000
    19.         invoke ExitProcess,0
    20.    .end start
    По идее после выполнения команды nop управление должен получить обработчик исключений и после двух секунд ожидания завершить работу процесса, но вместо этого система наглухо виснет, причем виснет так, что помогает только отключение питания. Что я делаю не так?
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    подозреваю, что после нопа ваша программа успешно завершается и выгружается (а с какого перепуга вызывать исключение при вызове АПИ-функции?). Установленный хандлер показывает в никуда (вы же его при завершении процесса не убрали). При первом же исключении туда честно передается управление, выполняется непойми чего, вызывается новое исключение - и все виснет. Это так, предположение от неспециалиста по SEH. выведенное исключительно из логики.

    апд.: ах вы же TF взвели... мда. Значит вызывается, и именно после нопа. Сначала. А потом делает все равно тот же самый ExitProcess, и один шут все ложится. Наверно, TF надо как-то по другому обрабатывать?
     
  3. FFF0

    FFF0 New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2011
    Сообщения:
    18
    Вроде так. Смотрел в статье Касперски "Старые антиотладочные приемы на новый лад"
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    FFF0
    У себя попробовал. Всё срабатывает, как и ожидается: после установки TF возникает исключение, и обработчик нормально завершает процесс (Win7 SP1 32bit).
     
  5. FFF0

    FFF0 New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2011
    Сообщения:
    18
    Чудеса какие-то -_- Win7 виснет. Запускал на виртуалке WinXP SP3, гостевая ОС тоже виснет.
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    FFF0
    l_inc точно не бздит, разбирайтесь со своими чудесами :))
     
  7. FFF0

    FFF0 New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2011
    Сообщения:
    18
    Да я и не подозревал его в этом :)
     
  8. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    добрый всем вечер!дали задание на лабораторной вывести dump памяти, с помощью интернета смог как бы реализовать...но преподователь сказал что надо чтобы данные считывались с файла и результат записывался в другой файл...подскажите пожалуйста как это сделать а то немогу понять этот момент, и если что то неправильно написанно то тоже дайте об этом знать=(...вот код самой программы
    Код (Text):
    1. .model small
    2. .data
    3. buf     db 8,10 dup(0)  ;принимает строку, введенную с клавиатуры
    4. segm    db 13,10,'Segment(hex): $'
    5. off     db 13,10,'Disp(hex): $'
    6. block   db 256 dup(0)           ;копия данных из памяти по введенному сегменту и смещению
    7. sh      db 'C:Temp.txt'
    8. strokac db '│    :                                                     │',13,10,'$'  ;копия форматированной строки, выводимой в файл
    9. strlen  equ $-strokac           ;длина строки, выводимой в файл
    10. dno     db 'C:Temp.txt'
    11. msg1    db 'Again? (Y/N)',13,10,'$'
    12. stroka  db strlen dup(0)        ;формируемая строка, которую записываем в файл
    13. s       dw 0                    ;сегмент
    14. o       dw 0                    ;смещение
    15. .stack 256
    16. .code
    17. start:
    18.         mov ax,@data    ;Настраиваем сегментные регистры
    19.         mov ds,ax
    20.         mov es,ax
    21. mlp:    lea dx,segm     ;Segment(hex):
    22.         call inputhex   ;вводим сегмент
    23.         mov s,ax        ;созраняем его в переменной
    24.         push ax         ;сохраняем его в стеке
    25.         lea dx,off      ;Disp(hex):
    26.         call inputhex   ;вводим смещение
    27.         mov o,ax        ;сохраняем его в переменной
    28.         mov si,ax       ;заносим смещение в si
    29.         pop ds          ;восстанавливаем в ds из стека  сегмент
    30.         lea di,block    ;адрес куда копировать область памяти
    31.         mov cx,128      ;размер копируемого участка 128 слов=256 байт
    32.         rep movsw       ;копируем в область памяти в сегмент данных программы
    33.         push es         ;
    34.         pop ds          ;ds=es
    35.         mov ah,9                ;функция вывода сообщения на экран
    36.         lea dx,sh               ;шапка блока
    37.         int 21h                 ;выводим на экран
    38.         lea si,block    ;арес дампируемого учаска памяти
    39.         mov bp,16       ;количество выводимых строк
    40. lp:     push si         ;сохраняем si
    41.         lea di,stroka   ;начало строки, которую формиреум для вывода на экран
    42.         push di         ;сохраняем начало
    43.         lea si,strokac  ;начало копии форматируемой строки
    44.         mov cx,strlen   ;длина строки
    45.         rep movsb       ;очищаем строку
    46.         pop di          ;восстанавливаем начало
    47.         pop si          ;восстанавливаем si
    48.         inc di          ;пропускаем рамку
    49.         mov ax,s        ;сегмент
    50.         call printhex16 ;преобразовываем в текст, в выводимую строку
    51.         inc di          ;пропускаем 1 символ(двоеточие)
    52.         mov ax,o        ;смещение
    53.         call printhex16 ;преобразовываем в текст, в выводимую строку
    54.         add di,2        ;пропускае 2 символа(пробелы)
    55.         mov cx,16       ;количество выводимых в строку байт
    56. lp1:    lodsb           ;берем байт из памяти
    57.         call printhex   ;преобразовываем в текст, в выводимую строку
    58.         inc di          ;пропускаем 1 символ (пробел)
    59.         loop lp1        ;преобразовываем все 16 байт строки
    60.         mov ah,9        ;функция вывода сообщения на экран
    61.         lea dx,stroka   ;адрес выводимой строки
    62.         int 21h         ;выводим на экран
    63.         add o,16        ;увеличиваем смещение на 16 дампированных байт
    64.         dec bp          ;уменьшаем количество оставшихся строк
    65.         jnz lp          ;продолжаем пока не ноль
    66.         mov ah,9                ;функция вывода сообщения на экран
    67.         lea dx,dno              ;выводимое сообщение
    68.         int 21h                 ;выводим на экран
    69. ag:     mov ah,0        ;Ожидаем нажатия любой клавиши
    70.         int 16h
    71.         cmp ah,49       ;нажата N
    72.         jz ex           ;если да - выход
    73.         cmp ah,21       ;нажата Y
    74.         jz mlp          ;тогда повторяем дамп
    75.         jmp ag          ;иначе опять ждем нажатия
    76. ex:     mov ax,4c00h    ;закончить программу
    77.         int 21h
    78. ;Ввод шестнадцатеричного числа с проверкой
    79. ;ds:dx - адрес выводимого сообщения
    80. ;На выходе: ax - число
    81. inputhex        proc
    82.         mov di,dx               ;сохраняем адрес сообщения
    83. inputhex1:
    84.         mov dx,di               ;адрес сообщения
    85.         mov ah,9                ;функция вывода сообщения на экран
    86.         int 21h                 ;выводим на экран
    87.         mov ah,0ah              ;функция ввода строки с клавиатуры
    88.         mov dx,offset buf       ;буфер куда вводить
    89.         int 21h                 ;пользователь вводит в текстовом виде в buf значение элемента массива
    90.         mov ch,0
    91.         mov cl,buf[1]   ;сх - длина введенной строки
    92.         lea si,buf[2]   ;начало введенной строки
    93.         push si         ;сохраняем начало строки
    94.         push cx         ;и ее длину
    95. ;проверяем, что это 16-ричная строка
    96. ihlp:   mov al,[si]     ;берем символ
    97.         cmp al,'0'      ;если он меньше символа 0
    98.         jc inputhex1    ;выводим сообщение об ошибке
    99.         cmp al,'9'      ;если между 0 и 9
    100.         jbe ihm1        ;то идем к следующему
    101.         cmp al,'A'      ;Если символ между 9 и А
    102.         jc inputhex1    ;выводим сообщение об ошибке
    103.         cmp al,'F'      ;если между A и F
    104.         jbe ihm1        ;то идем к следующему
    105.         cmp al,'a'      ;Если символ между F и а
    106.         jc inputhex1    ;выводим сообщение об ошибке
    107.         cmp al,'f'      ;если между a и f
    108.         jbe ihconvert   ;то преобразовываем его в прописной
    109.         jmp inputhex1   ;иначе выводим сообщение об ошибке
    110. ihm1:   inc si          ;следующий символ строки
    111.         loop ihlp       ;обработать все
    112.         pop cx          ;восстанавливаем размер
    113.         pop si          ;и адрес строки
    114. ;преобразовываем строку в ;16-ричное число
    115.         xor dx,dx       ;16-ричное число
    116. ihlp2:  mov al,[si]     ;берем символ
    117.         cmp al,'9'      ;если это цифра
    118.         jbe ihm5        ;то вычитаем из него только '0'
    119.         sub al,7        ;а если буква, вычитаем 7
    120. ihm5:   sub al,'0'      ;и вычитаем '0'
    121.         shl dx,4        ;сдвинуть резльтат на одну тетраду влево
    122.         or dl,al        ;добавить получившееся число
    123.         inc si          ;следующий символ
    124.         loop ihlp2      ;преобразовываем всю строку в число
    125.         mov ax,dx       ;помещаем результат в ax
    126.         ret             ;выход из подпрограммы
    127. ihconvert:
    128.         and [si], byte ptr 11011111b    ;преобразование строчной буквы в прописную
    129.         jmp ihm1                        ;возвращаемся в цикл
    130. inputhex endp
    131. printhex  proc
    132. ;преобразование байта в текстовый вид в строку
    133. ;al - байт;
    134. ;es:di - адрес куда записывать строку
    135.         push dx ;сохраняем регистры
    136.         push ax
    137.         push ax ;сохраняем значение
    138.         shr al,4        ;сдвигаем выводимый код на 4 бита вправо
    139.         add al,'0'      ;преобразуем старшую(левую)тетраду в символ
    140.         cmp al,'9'      ;если не это буква A-F
    141.         jbe @m1         ;то пропускаем
    142.         add al,7        ;а если буква,то корректируем символ
    143. @m1:    stosb           ;записываем старшую тетраду в строку
    144.         pop ax          ;восстанавливаем значение
    145.         and al,0fh      ;выделяем младшую тетраду
    146.         add al,'0'      ;преобразуем старшую(левую)тетраду в символ
    147.         cmp al,'9'      ;если не это буква A-F
    148.         jbe @m2         ;то пропускаем
    149.         add al,7        ;а если буква,то корректируем символ
    150. @m2:    stosb           ;записываем младшую тетраду в строку
    151.         pop ax          ;восстанавливаем регистры
    152.         pop dx
    153.         ret             ;выход из подпрограммы
    154. printhex endp
    155. ;Печать 16-разрядного 16-ричного числа
    156. ;На входе: AX - число
    157. printhex16 proc
    158.         push ax         ;сохранить параметр
    159.         mov al,ah
    160.         call printhex   ;вывести старшую часть
    161.         pop ax          ;восстановить параметр
    162.         call printhex   ;вывести младшую часть
    163.         ret             ;выход из подпрограммы
    164. printhex16 endp
    165.  
    166. end start
     
  9. zachet

    zachet New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    3
    Здрасте!
    есть вопрос по ассемблеру(
    лабораторка на английском...
    write a program that calculates √x , where integer x is the argument given by the user, with adjusted accuracy.
    как я понял - юзер вводит два числа - первое это сам х, а второе - количество цифр после коммы.
    мы "работаем" с asm
    спасибо.
     
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    zachet
    И? вам алгоритм нужен? Их может быть несколько.

    1) табличная функция с аппроксимацией промежуточных значений
    2) хитрый фокус с вычитанием нечетных чисел - где-то на форуме пробегало.
    3) через ряды
    4) с использованием сопроцессора

    Очевидно, что любой из алгоритмов реализуем на ассемблере. Определитесь как именно вы будете вычислять квадратный корень, напишите каркас - и запросто поможем с устранением ошибок. А если вам и алгоритм выбрать, и программу написать - это либо в коммерс, либо на "РусФАК", там много альтруистов с кучей свободного времени.
     
  11. zachet

    zachet New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    3
    вопрос в том,что если использовать fsqrt, то вычисление будет float и закруглено до 5 или 6 знака,а мне нужно больше.
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    работайте с qword'ами. 16 значащих цифр хватит за глаза. Если надо до _любого_ количества знаков, вообще до любого, хоть 10000 (смысл?) - используйте ряды. Хотя "adjusted accuracy" вовсе не обязательно кол-во знаков после запятой. Это может быть абсолютная погрешность (например 0.00001), или относительная погрешность (не более 0.01%), или количество знаков. Уточните у задавшего.
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Сопроцессор работает с 80-ти битными числами(64 бита в мантиссе). Но по смыслу задачи подразумевается, что вы должны сами вычислять. Т.е. ряды и еще можно поискать(для оригинальности) итерационный алгоритм.
     
  14. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    вот универский боян написанный мною несколько лет назад,когда учился программировать на асме,по этому не пинать.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
  16. zachet

    zachet New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    3
    а как насчет варианта про ряды?
     
  17. Ysama00

    Ysama00 New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    6
    Доброго времени суток!
    Собственно, надо написать такую прогу (на ассемблере): инициализация мыши и установка курсора во вторую строку, посредине. Про мышь в сети нашел не много, прерывания в основном, а цельной картины не понял, т.к. в ассемблере не силен, вообще. Кто разумеет - напишите, пожалуйста и закомментируйте, чтобы можно было разобраться. Можно конечно и без комментариев, главное, чтобы прога работала.
     
  18. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Под дос чтоль?
     
  19. Ysama00

    Ysama00 New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    6
    yashechka, типа да.
     
  20. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Фууууу)))))