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

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

  1. maloi

    maloi New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    7
    вторая
     
  2. maloi

    maloi New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    7
    третья
     
  3. maloi

    maloi New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    7
    Что кто нибудь поможет мне? Если да то отпишитесь чтобы я не ждал в пустую.
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    maloi
    Отписываюсь. Знания и умения тоже товар.
    Заинтересуйте нас.
     
  5. Shmadko_89

    Shmadko_89 New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    10
    Ребята, помогите пожалуйста с куском проги, нихочет нормально компилироваться, хоть ты тресни.
    Прога по выводу вещественного числа.Сколько не пытался разобраться в чем проблема, так и не понял.
    Ошибки выводит в помеченных (ж*ж*ж*ж*ж) строках:

    Код (Text):
    1. ;----------------------------------------------------------
    2. ;программа вывода вещественного числа короткого формата (32 бита).
    3. ;Вход: выводимое значение - в поле float32.
    4. ;Выход: вывод вещественного числа короткого формата на экран
    5. ;----------------------------------------------------------
    6. .500
    7. masm
    8. model small  ;.use16 small
    9. .stack  256h
    10. .data
    11. dec_bin_mant32  dt  0   ;мантисса в двоично-десятичном предсвавлении
    12. dec_bin_har32   dt  0   ;характеристика в двоично-десятичном представлении
    13. cwr dw  0   ;переменная для сохранения сосвопнип рег. cwr
    14. ten dw  10  ;константа равная 10
    15. float32 dd  1.2345678e12    ;значение вещ. числа размером в 32 бита для вывода
    16. mant32  dd  0   ;мантисса в двоичном предсвавлении
    17. har32   dd  0   ;характеристика - вещ. формат в двоичном предсвавлении
    18. int_har32   dd  0   ;характеристика - целое в двоичном предсвавлении
    19. number  db  0
    20. char    db  0
    21. cursor_column   db  0
    22. cursor_line db  0
    23. number_of_digits    db  9
    24. flag    db  0
    25. .code
    26. next_cursor_column  proc    ;процедура сдвига курсора на одну позицио вправо
    27. ;обязательно наличие в программе процедур: read_cursor_position, set_cursor_position
    28.         next_cursor_column proc
    29.                 push    ax
    30.  
    31.                 call        read_cursor_position
    32.                 inc     cursor_column
    33.                 call        set_cursor_position
    34.  
    35.                 pop         ax
    36.                 ret
    37. next_cursor_column  endp
    38. set_cursor_position proc    ;процедура позиционирования курсора
    39. ;входные параметры
    40. ;db cursor_line - строка
    41. ;db cursor_column - колонка
    42.         push    ax
    43.         push    dx
    44.        
    45.                 mov     ah,02h
    46.                 mov     dh,cursor_line
    47.                 mov     dl,cursor_column
    48.                 int     10h
    49.  
    50.                 pop     dx
    51.                 pop         ax
    52.                 ret
    53. set_cursor_position endp
    54. read_cursor_position    proc    ;процедура определения текущей позиции курсора
    55. ;выходные данные
    56. ;db cursor_line - сврока
    57. ;db cursor_column - колонка
    58.             push    ax
    59.             push        bx
    60.         push        dx
    61.        
    62.         mov     ah,03h
    63.         mov     bh,00h
    64.         int     10h
    65.        
    66.         mov     cursor_line,dh
    67.         mov     cursor_column,dl
    68.        
    69.         pop     dx
    70.         pop     bx
    71.         pop         ax
    72.         ret
    73. read_cursor_position    endp
    74. print_char  proc    ;процедура вывода символа с учетом цвета
    75. ;входные параметры
    76. ;char - выводимый символ
    77.                 push    ax
    78.                 push    dx
    79.  
    80.                 mov     al,char     ;заносим в al цифру
    81.                 mov     ah,09h          ;номер процедуры BIOS
    82.                 mov     bl,0Fh          ;выбор цвета
    83.                 mov     cx,01h          ;количество повторений
    84.                 int     10h             ;вызов процедуры BIOS
    85.  
    86.                 pop     dx
    87.                 pop     ax
    88.                 ret
    89. print_char  endp
    90. positive_har    proc
    91. ;выделение мантиссы из короткого формата (32бита) и ее преобразование в двоично-десятичный формат (для положительной характеристики
    92. ;результав в st(0))
    93.     fimul   ten
    94.     sub int_har32,6          ;ж*ж*ж*ж*ж*ж*ж*ж
    95. lab_p_h:
    96. fidiv   ten
    97.     cmp int_har32,0          ;ж*ж*ж*ж*ж*ж*ж*ж
    98.     dec int_har32             ;ж*ж*ж*ж*ж*ж*ж*ж
    99.     jg  lab_p_h
    100.     ret
    101. positive_har    endp
    102. ;------------------------------------------------------------------------
    103. negative_har    proc
    104. ;выделение мантиссы из короткого формата (32бита) и ее преобразование в двоично-десятичный формат (для отрицательной характеристики результат в st(0))
    105.     fidiv   ten
    106.     sub int_har32,7            ;ж*ж*ж*ж*ж*ж*ж*ж
    107. lab_n_h:
    108.     fimul   ten
    109.     cmp int_har32,0             ;ж*ж*ж*ж*ж*ж*ж*ж
    110.     inc int_har32               ;ж*ж*ж*ж*ж*ж*ж*ж
    111.     jl  lab_n_h
    112.     ret
    113. negative_har    endp
    114. ;-----------------------------------------------------------------------
    115. ;вывод вещественного числа (32бита) в десятичном виде
    116. fprint32    proc
    117.     pusha                               ;ж*ж*ж*ж*ж*ж*ж*ж
    118. ;установка размера мантиссы в 24 бита
    119.     fstcw   cwr
    120.     and cwr,1111000011111111b
    121.     or  cwr,1111000011111111b
    122.     fldcw   cwr
    123.     fld float32 ;загрузка 32-bit числа в стек сопроцессора
    124.     fxtract ;выделение мантиссы(st0) и характеристики(st1)
    125.     fstp    mant32  ;запоминаем мантиссу
    126.     fist    har32   ;запоминаем характеристику
    127. ;перевод двоичн. характеристики в дес. характеристику
    128.     fldlg2  ;загрузка десят. лог. двух
    129.     fimul   har32   ;умножение двоичной хар-ки на log10(2)
    130.     frndint ;округление
    131.     fistp   int_har32   ;сохранение десетич характеристики
    132.     fild    int_har32
    133.     fbstp   dec_bin_har32   ;сохранение двоично-десятичного значения ;характеристики
    134. ;выбор процедуры по выделению мантиссы
    135.     fld float32
    136.     cmp har32,0                   ;ж*ж*ж*ж*ж*ж*ж*ж
    137.     jge case1
    138.     call    negative_har    ;вызвать процедуру преобразования мантиссы, если хар-ка отрицательная
    139.     jmp end_case
    140. case1:
    141.     call    positive_har    ;вызвать процедуру преобразования мантиссы, если хар-ка положительная
    142. end_case:
    143.     fbstp   dec_bin_mant32  ;сохранение двоично-десятичного представления мантиссы
    144. ;вывод на экран вещественного числа
    145.     lea si,dec_bin_mant32
    146.     add si,9
    147.     mov al,[si]
    148. ;вывод знака числа
    149.     cmp al,0
    150.     je  zero
    151.     mov char,"-"
    152.     call    print_char
    153.     call    next_cursor_column
    154. ;данный фрагмент пропускает байты с нулевым содержимым до первого байта со ;значащей цифрой
    155. zero:
    156.     dec si
    157.     dec number_of_digits
    158.     mov al,[si]
    159.     cmp al,0
    160.     jne first_zero  ;найден первый байт со значением, отличным от нуля
    161.     jmp zero    ;байт имеет нулевое значение - продолжаем поиск
    162. ;просмотр полубайтов первого найденного байта с ненулевым значением
    163. first_zero:
    164.     and al,11110000b
    165.     cmp al,0
    166.     je  second_digit    ;если старший полубайт байта равен нулю, начинаем ;вывод со второго байта
    167.     jmp first_digit ;если старший полубайт байта не равен нулю, начинаем
    168. ;вывод с первого байта
    169. ;начало цикла вывода мантиссы
    170. print_digits:
    171.     dec si
    172.     dec number_of_digits    ;индекс выводимого байта
    173.     mov al,[si]
    174. ;вывод первого полубайта, содержащего цифру
    175. first_digit:
    176.     and al,11110000b
    177.     shr al,4                   ;ж*ж*ж*ж*ж*ж*ж*ж
    178.     add al,30h
    179.     mov char,al
    180.     call    print_char
    181.     call    next_cursor_column
    182. ;если выводимая цифра первая, то выводим после нее точку
    183.     cmp flag,0
    184.     jne second_digit
    185.     mov char,"."
    186.     call    print_char
    187.     call    next_cursor_column
    188.     inc flag
    189. ;вывод второго полубайта, содержащего цифру
    190. second_digit:
    191.     mov al,[si]
    192.     and al,00001111b
    193.     add al,30h
    194.     mov char,al
    195.     call    print_char
    196.     call    next_cursor_column
    197. ;если выводимая цифра первая, то выводим после нее точку
    198.     cmp flag,0
    199.     jne nonfirst_digit
    200.     mov char,"."
    201.     call    print_char
    202.     call    next_cursor_column
    203.     inc flag
    204. nonfirst_digit:
    205.     cmp number_of_digits,0
    206.     jne print_digits
    207.     mov flag,0
    208. ;вывод характиристики числа
    209.     mov char,"E"
    210.     call    print_char
    211.     call    next_cursor_column
    212.     lea si,dec_bin_har32
    213. ;вывод знака числа
    214.     add si,9
    215.     mov al,[si]
    216.     cmp al,0
    217.     je  print_har
    218.     mov char,"-"
    219.     call    print_char
    220.     call    next_cursor_column
    221. ;значения характеристики
    222. print_har:
    223.     sub si,9
    224.     mov al,[si]
    225. ;вывод первой цифры характеристики
    226.     and al,11110000b
    227.     shr al,4                            ;ж*ж*ж*ж*ж*ж*ж
    228.     add al,30h
    229.     mov char,al
    230.     call    print_char
    231.     call    next_cursor_column
    232. ;вывод второй цифры характеристики
    233.     mov al,[si]
    234.     and al,00001111b
    235.     add al,30h
    236.     mov char,al
    237.     call    print_char
    238.     call    next_cursor_column
    239.     mov flag,0
    240.     popa                                 ;ж*ж*ж*ж*ж*ж*ж
    241.     ret
    242. fprint32    endp
    243.  
    244. main    proc
    245.     mov ax,@data
    246.     mov ds,ax
    247.     call    fprint32
    248. exit:
    249.     mov ax,4c00h
    250.     int 21h
    251. main    endp
    252. end main
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Shmadko_89
    Странная у Вас первая строка: .500. Советую над ней подумать.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Shmadko_89
    там не только "ж*ж*ж*ж"
    огласи интерес и жди предложения :)
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    l_inc
    это секретная военная разработка интела ;)
     
  9. Shmadko_89

    Shmadko_89 New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    10
    Поменял .500 на .386 стал делать объектный файл, а .exe файл не хочет делать
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    wsd
    предложение уже было. Чел предпочитает сам.
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    wsd
    Ага. И обновленный, понимающий её TASM тоже интел в военных целях разработали.
    _basmp_
    Эта тема была создана в результате того, что для вопросов по лабораторным создавались отдельные темы в разделе BEGINNERS теми, кто не хотел идти в COMMERCE. А Вы здесь второй COMMERCE разводите.
     
  12. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    l_inc
    Понял. Осознал.

    ЗЫ некоторые вопросы просто сильно выходят за рамки просто вопроса.
     
  13. maloi

    maloi New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    7
    Что надо что бы ты помог мне с лабами? Напиши сам чтобы я не ломал голову.
     
  14. JOHN

    JOHN New Member

    Публикаций:
    0
    Регистрация:
    13 май 2008
    Сообщения:
    8
    Подскажите хотя бы где искать, а то я уже в паинке)...

    Вывести на экран информацию БИОС по адресу 0000:0475h
    Размер-один байт. Назначение-количество дисков в системе.
     
  15. Sharaevskiy_Vitaliy

    Sharaevskiy_Vitaliy Шараевский Виталий Юрьевич

    Публикаций:
    0
    Регистрация:
    16 май 2008
    Сообщения:
    8
    Адрес:
    Украина, г.Киев
    JOHN, просмотри...то, что тебе надо??...(ТАСМ)

    .286

    STK SEGMENT STACK
    DW 128 DUP (?)
    STK ENDS

    DATA SEGMENT PARA PUBLIC "DATA"

    DATA ENDS

    CODE SEGMENT PARA PUBLIC "CODE"

    ASSUME DS:lol: ATA, SS:STK, CS:CODE

    MAIN:

    ; инициализация сегментов
    MOV AX, DATA
    MOV DS, AX

    XOR AX, AX
    MOV ES, AX

    ; чтение байта по адресу 00000:0475
    MOV DI, 0475H
    MOV AL, [ES]:[DI]

    ; вывод прочитанного байта на дисплэй
    ADD AL, 030H
    MOV DL, AL
    MOV AH, 02H
    INT 021H

    ; ожидание нажатия ANY KEY TO CONTINUE :)
    MOV AH, 01H ; ожидание нажития клавиши и чтение символа
    INT 021H

    ; возврат в DOS
    MOV AH, 04CH ; ф-ция завершения программы
    XOR AL, AL ; код возврата "0"
    INT 021H ; вызов прерывания

    CODE ENDS
    END MAIN
     
  16. JOHN

    JOHN New Member

    Публикаций:
    0
    Регистрация:
    13 май 2008
    Сообщения:
    8
    Sharaevskiy_Vitaliy
    Спасибо, очень на то похоже, есть над чем подумать

    Но вот, с ключом /t не линкует, пишет
    Fatal: Cannot generate COM file : stack segment present

    Без ключа результат - 0
     
  17. Sharaevskiy_Vitaliy

    Sharaevskiy_Vitaliy Шараевский Виталий Юрьевич

    Публикаций:
    0
    Регистрация:
    16 май 2008
    Сообщения:
    8
    Адрес:
    Украина, г.Киев
    Аналогично....Я объяснил это тем, что у меня оба диска под NTFS...А DOS по-моему только FAT видит...Проверял через функцию DOS - DEBUG, так по адресу 00000:0475 и правда нулевой байт находится...то есть прога читает правильно, может просто адрес не тот...а COM-файл он и правда не сгенерирует, так как для этого необходима модель памяти типа TINY, а в моей программе явно описаны все три сегмента
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Sharaevskiy_Vitaliy
    Хех. После таких объяснений нетрудно представить, откуда религия взялась.
    1) Логические диски здесь не причем.
    2) DOS здесь тоже не причем, т.к. данные по этим адресам инициализируются BIOS.
    3) Количество физических дисков не зависит от файловых систем логических дисков, на которые винчестер разбит.
    4) NT Вам не даст прочитать реальные данные с таких адресов.
    Вывод: грузитесь с DOS-дискеты и оттуда запускайте либо пользуйтесь виртуальными машинами.
     
  19. Sharaevskiy_Vitaliy

    Sharaevskiy_Vitaliy Шараевский Виталий Юрьевич

    Публикаций:
    0
    Регистрация:
    16 май 2008
    Сообщения:
    8
    Адрес:
    Украина, г.Киев
    Понял...Извините, что ерунду ляпнул:)
     
  20. maloi

    maloi New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    7
    добрые люди помогите мне плиз с лабами.....