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

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

  1. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    voland95
    Хорошо. Что дано, а что ты сам придумал? Если аська есть, постучи четырешестьшесть5329девятьноль
     
  2. tibibo

    tibibo New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2008
    Сообщения:
    7
    Доброе время суток.
    Глупый вопрос:
    есть два числа с фиксированной запятой, причем число А имеет формат 16:16, а число В - 8:8. Нужно разделить число А на число В.
    Если числа в одинаковом формате, то я делаю так
    Код (Text):
    1.            mov  eax,00120040h   ; делимое равно 18,25
    2.     mov ebx,00100000h   ; делитель равен 16,0
    3.     xor edx,edx
    4.     ror eax,16
    5.            xchg         ax,dx       ;  EDX:ЕАХ = ЕАХ * 2 в 16-й степени
    6.     div             ebx     ;  ЕАХ = результат деления
    7.                                                         ; он равен 1.140625 или 00012004h
    Это приер из учебника,по которому я пытаюсь разобраться. Я переписываю его по аналогии вот так:
    Код (Text):
    1. mov ax,word ptr divident[1]
    2.     xor dx,dx
    3.     ror ax,8
    4.     xchg    al,dl
    5.     div divisor
    6.     mov word ptr quotent[1],ax
    7.     mov ax,word ptr divident
    8.     xor dx,dx
    9.     ror ax,8
    10.     xchg    al,dl
    11.     div divisor
    12.     mov word ptr quotent,ax
    13.     xor dx,dx
    14.            ........
    15.            divident    dw   0012h,0040h
    16.            divisor      dw   1000h     
    17.            quotent     dw   0h,0h
    Но результат получается совсем другой. Вобщем, кажется я совсем запутался.
    И еще, по представлению чисел:
    объясните плиз, каким образом из числа 18,25 в hex получается 1240h? Если переводить на бумажке, то у меня получается
    Код (Text):
    1. 0001 0010 . 0001 b
    2.   1      2    .   1   h
    3. т.е. 00120001h
    4. так откуда берется 00120040?
    Заранее благодарен
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Код (Text):
    1.     mov eax,00120040h   ; делимое равно 18,25   ; ошибка, смотри ниже
    2.     mov ebx,00100000h   ; делитель равен 16,0
    3.     xor edx,edx
    4.     ror eax,16
    5.     xchg    ax,dx       ;  EDX:ЕАХ = ЕАХ * 2 в 16-й степени
    6.     div ebx     ;  ЕАХ = результат деления
    ^ Т.е. просто умножили и делитель, и делимое на 2^16, затем выполнили деление... В таком случае по аналогии:
    Код (Text):
    1.     mov ax, 4000
    2.     mov dx, 0012        ; dx:ax - делимое (12.4000 (hex) == 18.25 (dec))
    3.     mov cx, 1000        ; ch:cl - делитель (10.00 (hex) == 16.00 (dec))
    4.     div cx          ; ah:al - результат
    18.25 (dec) == 1 * 10^1 + 8 * 10^0 + 2 * 10^-1 + 5 * 10^-2 == 10 + 8 + 2/10 + 5/100
    12.40 (hex) == 1 * 16^1 + 2 * 16^0 + 4 * 16^-1 + 0 * 16^-2 == 16 + 2 + 4/16

    Edit:
    А, вот в чём дело:
    mov eax, 00120040h - это не 12.40 (18.25) - это 12.0040 (18.0009765625)
     
  4. tibibo

    tibibo New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2008
    Сообщения:
    7
    Sol_Ksacap
    Большое спасибо,немножко разобрался.
    Вот только еще такой вопросец: если делимое и делитель имеют разный формат (например,как в моем случае 16:16 и 8:8) то мы ожидаем результат такого же формата,как делимое или такого же как делитель? Т.е.,если,например, делить число вида 64:64 на 16:16, то обязательно получается результат 16:16 или возможны варианты?
     
  5. CocoJombo

    CocoJombo New Member

    Публикаций:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    10
    Очень прошу помогите пожалуйста. Наверняка уже у вас есть готовые коды программы для 16 битного ассемблера.. 1)Разложить целое число на простые множители 2)Подсчитать количество различных элементов в последова­тельности. Заранее спасибо!...
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Это зависит от того, как делить. Если особо не задумываться, а делать простым и естественным способом - (варианты выше) - то делимое имеет формат в два раза "шире" чем делитель, результат - такой же формат, что и делитель.
    Т.е.
    X:X / X = X
    XX:XX / X:X = X:X
    XXXX:XXXX / XXXX = XXXX

    Смотри, ведь в самом первом варианте, когда было сказано, что "числа в одинаковом формате", делимое перед выполнением деления на самом деле приводилось к "более широкому" формату:
    было 0012:4000
    стало 00000012:40000000

    А при делении 64:64 на 16:16 проще всего перед выполнением деления привести делитель к формату 32:32. Результат, соответственно - 32:32.
     
  7. CocoJombo

    CocoJombo New Member

    Публикаций:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    10
    Это две разные программы, by the way :o
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    хм. а не 00000000:00124000?
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    хм. XX:XX / 1:0 = XX:XX
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Когда ставишь задачу, старайся указывать следующее: ассемблер (FASM, MASM, TASM, NASM, GoAsm, WASM, AS, GAS и т.д.) ОС под которую дается задача (DOS, Win16, Win95/98, WinNT, Xnix и т.д.) легче будет ответить и старайся наиболее полно приводить условия задачи. чтобы небыло разночтений. Обычно при выходе из процедуры целочисленный результат вычислений передают в регистре EAX/AX, вещественный результат в ST0 или в ячейке памяти. Судя по твоим топикам программирование в DOS скорее всего TASM или MASM. Лично я передал из процедуры значения в массив так (при условии, что принемающая сторона знает. что ss:sp указывает на начало массива и его размер заранее известен)
    Код (Text):
    1. proc voland95
    2. ; сформированный массив находится в сегменте данных
    3. ; на него указывает регистр si
    4. mov ax,ss
    5. mov oldstack_ss,ax; на всякий случай сохраняем значение ss и sp в памяти
    6. mov oldstack_sp,sp;
    7. push ds
    8. pop ss
    9. mov sp,si
    10. ret; теперь стек указывает на массив
    11. endp voland95
     
  11. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    Mikl__
    Работаю в TD 3.2
    ОС - XP
    Задача:сохранить массив рзультата в стеке путем изменения кода программы A1.asm
    код программы А1:
    Код (Text):
    1.  
    2.         title lab1
    3.      page ,132
    4.  
    5. sta segment para stack 'stack'
    6.   db 64 dup('stack')  
    7. sta ends
    8. dseg segment
    9. source db 01h,0afh,0fh,08h
    10. dest db 4 dup(?)
    11. dseg ends
    12.  
    13. subttl lab1
    14. page
    15. cseg segment
    16.    assume cs:cseg,ds:dseg,ss:sta
    17.  
    18.   entry proc far  
    19.     push ds        
    20.     sub ax,ax
    21.     push ax        
    22.     mov ax,dseg  
    23.     mov ds,ax
    24.  
    25.           mov cx,4      
    26.           mov bx,offset source
    27.           mov di,offset dest  
    28.    again: mov al,[bx]
    29.           cmp al,0fh
    30.           je e      
    31.           jb a      
    32.           sub al,0fh  
    33.           jmp e      
    34.        a: add al,0fh
    35.        e: mov [di],al
    36.           inc bx      
    37.           inc di
    38.    loop again        
    39.    ret              
    40.  entry endp        
    41. cseg ends            
    42. end entry
    То есть здесь надо оптимизировать код то есть убрать ненужные команды, и добавить сохранение в стек командой mov ss:? но у меня всё не как не получается при трассировке постоянно ошибки.Уже запарился.помогите кто разбирается и если не сложно какие строчки добавите подпишите комментарий плз.Жду ответа!
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    voland95
    Код (Text):
    1. .286
    2. .model small
    3. .data
    4. source db 01h,0afh,0fh,08h
    5. dest db 4 dup(?)
    6. .code
    7. start: mov ax,data
    8. mov ds,ax
    9. ...
    10. proc voland
    11. push ds
    12. pop es
    13.         mov cx,4      
    14.         mov si,offset source
    15.         mov di,offset dest  
    16. again: lodsb;mov al,ds:[si] si:=si+1
    17.          cmp al,0fh
    18.           je e      
    19.           jb a      
    20.           sub al,0fh  
    21.           jmp e      
    22.      a: add al,0fh
    23.      e: stosb;mov [di],al di:=di+1
    24.          loop again
    25. mov oldstack_ss,ax; на всякий случай сохраняем значение ss и sp в памяти
    26. mov oldstack_sp,sp;
    27. push ds
    28. pop ss
    29. mov sp,offset dest; при выходе из процедуры  
    30. ret; стек указывает на преобразованный массив dest
    31. endp voland
    32. end start
     
  13. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    Mikl__
    Код (Text):
    1. .286
    2. .model small
    3. .data
    Код (Text):
    1. again: lodsb;mov al,ds:[si] si:=si+1
    Код (Text):
    1.   e: stosb;mov [di],al di:=di+1
    Не могу понять смысл этих строк?
     
  14. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    И если не сложно можешь объяснить на словах алгоритм сохранения в стек массива!
     
  15. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    А как здесь можно использовать mov ss:[di],ah? а то препод мне сказал что типа эту команду надо использовать?
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    voland95
    Пиши в личку иначе флуд, иначе бан :dntknw:
     
  17. CocoJombo

    CocoJombo New Member

    Публикаций:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    10
    Ребята помогите завтра нужно сдавать =((
     
  18. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    CocoJombo
    Завтра воскресенье, между прочим, как пиво пить так один, а как задачи решать:dntknw:
     
  19. CocoJombo

    CocoJombo New Member

    Публикаций:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    10
    Я В Белоруссии живу, мы завтра учимся , в связи с тем что след. неделю всю праздники.. Ну помогите срочно... =(
     
  20. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    CocoJombo
    по разложению на составные смотри учебники по математике, в частности Кнут "Искусство программирования на ЭВМ", а по втрому пункту смотри вот это