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

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    rozz
    Отрицательные числа в ассемблере представляются в дополнительном коде
    чтобы понять его прелесть придется десятичное число сперва перевести в двоичное
    1887=011101011111 Преобразовать положительное число в отрицательное можно тремя способами.
    Способ первый – классический: взять число в прямом коде, преобразовать его в инверсный код. Для этого все нули этого числа необходимо заменить на единицы, а единицы на нули. К числу в инверсном коде добавить 1
    0000011101011111->1111100010100000+1=1111100010100001=-1887
    Способ второй – практический: возьмем максимальное число (для байта 28=256, для слова 216=65536, для двойного слова 232=4294967296) и отнимем от него наше число, получившееся число преобразуем в двоичный или hex-код: 65536 - 1915=63621=F885=1111100010000101
    Способ третий – студенческий: щелкаем по клавише «Пуск», открываем стандартные приложения, запускаем калькулятор в режиме инженерный, теперь щелкаем по клавишам 1976 и «+/–» на экранчике калькулятора появится –1976 А теперь жмем на клавишу F8 или мышкой по переключателю с надписью «Bin» на экране 1111100001001000
     
  2. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Я решила сделать по первому способу второе число 1887:
    1887/16=117 - В
    117/16 = 7 -7
    7/16 = 0 - 7

    Получается, как и с 1915, а не 1887=75F :dntknw:
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    rozz
    1887/16=117 остаток 15=F
    117/16=7 остаток 5
    7/16 =0 остаток 7
    1887=75F
    столбиком делите
    проверяем: 7*256=1792 5*16=80 1792+80+15=?
     
  4. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Поняла, столбиком. Спасибо еще раз :)
    Ответ: 1887 :)
     
  5. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Ребят, делаю вторую часть задания сего, верно ли?
    Получилось: 1915 - 77В
    1887 - 75F
    -1887 - F8A1
    -1915 - F885
    2004 - 7D4
    1976 - 7B8
    -1976 - F848
    -2004 - F82C

    Код: 00000000: EB 00 jmp start
    start:
    00000002 C3 ret

    00000003: B 77 var1 dw 1915
    00000005: F 75 var2 dw 1887
    00000007: A1 F8 var3 dw -1887
    00000009: 85 F8 var4 dw -1915
    0000000B: 7 D4 var5 dw 2004
    0000000D: 8 7B var6 dw 1976
    0000000F: 48 F8 var7 dw -1976
    00000011: 2C F8 var8 dw -2004

    В коде правильно ли поставила с 16й в 10ную..А именно - то, что выделила.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rozz
    На счёт правильности:
    1) Mikl___ не зря советовал дружить со штатным вин калькулятором
    2) старшая цифра отрицательного числа в hex (16 ричном) виде всегда больше или равна 8
    3) можешь написать проверочную программу так:
    .data
    db 'begin' ; текстовая метка начала
    dw 1915
    dw 1887
    ; и т. д.
    потом открыть скомпиленный файл в hex редакторе и увидеть после своей текствой метки правильную последовательность hex чисел.

    По поводу кода - насколько я понял тебе нужно не вписать в программу числа переведённые вручную, а наоброт сделать так чтобы программа сама выводила их hex и bin представления на экран (я про это выше писал - см. команды shr, shrd, rcr) Кстати из задания не ясно как их вводить - в тексте программы или по запросу с клавиатуры.
     
  7. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Так, я даже неправильно перевела? Оо

    Дело в том, что вариант использования калькулятора отпадает напрочь, т.к. переводы надо расписывать, а не просто результат.

    О хоспади, я в унынии..Дело в том, что и в задании ведь не написано вводить или же уже дано. Проще было бы вводить.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rozz
    Калькулятор как раз позволит сразу проверить ручной результат на правильность.
    Вписать исходные числа в программу через dw конечно проще, но и ввести по запросу не сложно.
    На чём хоть задание-то DOS + tasm или win + masm?
    и dw (16 битные слова) это по условию задачи? или могут оказаться 32х битными (dd)?
     
  9. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Посредством fasm + отладчик ollydbg =)
    Могут и 32х. В условии только написано: написать программу описания этих чисел на языке Ассемблера и получить листинг :) Я фасм под винду качала, с Сего сайтика.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Кучеряво неужели где-то fasm включли в учебную программу? A ollydbg это хорошо в нём как раз все шаги преобразования и увидишь.
    Впрочем формулировка условия какая-то мутная - это дословно или вольный пересказ?
     
  11. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Да, это все так уныло :dntknw:
    Дословный. А вольный - Что требуется: перевести числа с 10й в 2 и 16 + потом сие показать через асм.
    Как я поняла, то сделать надо что-то типа того, что я делала выше, т.е. я просто подставила, а сие надо реализовать через великий и могучий..
    Так, числа на калькуляторе проверила, вроде верно, а разве не верно?
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    не сразу обратил внимание, что у тебя там уже попытка разбить на байты и разместить их в порядке младший вначале, поэтому и подумал что 2C F8 = -2004 не верно т.к. с 2 начинается :)

    Но в числе 1976 = 7B8 правильная разбивка на байты B8 7, а не 8 7B.
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    ну если точнее то B8 07
    :) А то не поймет же человек.
     
  14. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Человеку лучше бы не асм, а что-то более гуманное =/
    Так, вы мне не подскажите как сделать вторую часть задания? Более содержательней.
     
  15. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    rozz
    Что значит описание чисел на асме? В памяти и в ехе десятичные числа и так представлены, как шестнадцатеричные (двоичные). Может быть написать программу на ассемблере переводящую число введенное с клавиатуры в шестнадцатеричный или двоичный вид? то есть сделать некое подобие вин-калькулятора?
     
  16. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Mikl___,т.е. как я поняла, конечный результат программы должен быть такой (+-):

    Код (Text):
    1. 00000000: EB 00 jmp start
    2. start:
    3. 00000002 C3 ret
    4.  
    5. 00000003: B 77    var1 dw 1915
    6. 00000005: F 75    var2 dw 1887
    7. 00000007: F8 A1   var3 dw -1887
    8. 00000009: F8 85   var4 dw -1915
    9. 0000000B: D4 07    var5 dw 2004
    10. 0000000D: B8 07   var6 dw 1976
    11. 0000000F: F8  48  var7 dw -1976
    12. 00000011: F8 2C   var8 dw -2004
    Очевидно, что некое подобие калькулятора для определенных чисел, хотя - их можно и с клавиатуры вводить, после чего он будет переводить в 16ю, и выводить конечный результат, как показано в коде выше.
     
  17. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    rozz
    это не программа, от тебя требовалась таблица
    десятичное шестнадцатеричное двоичное
    1915 077В 0000011101111011
    1887 075F
    -1887 F8A1
    -1915 F885
    2004 07D4
    1976 - 07B8
    -1976 F848
    -2004 F82C
    а программа это
    >> введите число чтобы получить шестнадцатеричный и двоичный эквивалент
    >> или нажмите Esc для выхода из программы

    >1915
    >> Hex=077В Bin=0000011101111011
    >> введите число чтобы получить шестнадцатеричный и двоичный эквивалент
    >> или нажмите Esc для выхода из программы

    >1887
    ...
     
  18. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    Здравствуйте. Надо перевести числа, только уже немного иначе, а именно: Выполнить перевод чисел из десятичной в двоичную и 16-ричную систему счисления. Для каждого числа дать их внутреннее (машинное) представление в соответствии с диапазоном представления вещественных чисел в формате IEEE-754.

    Расчетные числа (4 числа): 1915.2004, 1887.1976, -1887.1976, -1915.2004

    Изначально должно быть Число: Двоичное представление, потом Порядок.
    После - каждое число надо расписать в трех форматах: Float, Double, Long double.
    При расписывании числа в каждом формате должны быть след. пункты: Характеристика, Мантисса, Двоичное число, Шестнадцатеричное число.

    Подскажите, пожалуйста, как это все сделать, т.к. снова же надо описание каждого действия, не сразу конечный результат, а сам процесс перевода.
     
  19. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    fasm
    Код (Text):
    1. ;/*
    2. ;  Здравствуйте. Надо перевести числа, только уже немного иначе, а именно: Выполнить перевод чисел из десятичной в двоичную и 16-ричную систему счисления. Для каждого числа дать их внутреннее (машинное) представление  в соответствии с диапазоном представления вещественных чисел в формате IEEE-754.
    3. ;
    4. ;  Расчетные числа (4 числа): 1915.2004, 1887.1976, -1887.1976, -1915.2004
    5. ;
    6. ;  Изначально должно быть Число: Двоичное представление, потом Порядок.
    7. ;  После - каждое число надо расписать в трех форматах: Float, Double, Long double.
    8. ;  При расписывании числа в каждом формате должны быть след. пункты: Характеристика, Мантисса, Двоичное число, Шестнадцатеричное число.
    9. ;
    10. ;  Подскажите, пожалуйста, как это все сделать, т.к. снова же надо описание каждого действия, не сразу конечный результат, а сам процесс перевода.
    11. ;  Следи за собой, будь осторожен. (с)
    12. ;*/
    13.  
    14.  
    15.  
    16.  
    17. ;/*
    18. ;  1915.2004 = 1915. + .2004
    19. ;    Получить двоичную форму целого
    20. ;    1915. = 1915./2 -> 1.b
    21. ;            0957./2 -> 1
    22. ;            0478./2 -> 0
    23. ;            0239./2 -> 1
    24. ;            0119./2 -> 1
    25. ;            0059./2 -> 1
    26. ;            0029./2 -> 1
    27. ;            0014./2 -> 0
    28. ;            0007./2 -> 1
    29. ;            0003./2 -> 1
    30. ;            0001./2 -> 1
    31. ;          = 11101111011.b
    32. ;
    33. ;
    34. ;    Получить двоичную форму дроби; остатки перед запятой; собраны в группы для удобства
    35. ;    .2004 = .2004 * 2
    36. ;           0.4008
    37. ;           0.8016
    38. ;           ------                                       .00
    39. ;           1.6032
    40. ;           1.2064
    41. ;           0.4128
    42. ;           0.8256
    43. ;           ------                                        1100
    44. ;           1.6512
    45. ;           1.3024
    46. ;           0.6048
    47. ;           1.2096
    48. ;           ------                                        1101
    49. ;           0.4192
    50. ;           0.8384
    51. ;           1.6768
    52. ;           1.3536
    53. ;           ------                                        0011
    54. ;           0.7072
    55. ;           1.4144
    56. ;           0.8288
    57. ;           1.6576
    58. ;           ------                                        0101
    59. ;           1.3152
    60. ;           0.6304
    61. ;           1.2608
    62. ;           0.5216
    63. ;           ------                                        1010
    64. ;           1.0432
    65. ;           0.0864
    66. ;           0.1728
    67. ;           0.3456
    68. ;           ------                                        1000
    69. ;           0.6912
    70. ;           1.3824
    71. ;           0.7648
    72. ;           1.5296
    73. ;           ------                                        0101
    74. ;           1.0592
    75. ;           0.1184
    76. ;           0.2368
    77. ;           0.4736
    78. ;           ------                                        1000
    79. ;           ------
    80. ;           0.9472
    81. ;           1.8944
    82. ;           1.7888
    83. ;           1.5776
    84. ;           ------                                        0111
    85. ;           1.1552
    86. ;           0.3104
    87. ;           0.6208
    88. ;           1.2416
    89. ;           ------                                        1001
    90. ;           0.4832
    91. ;           0.9664
    92. ;           1.9328
    93. ;           1.8656
    94. ;           ------                                        0011
    95. ;           1.7312
    96. ;           1.4624
    97. ;           0.9248
    98. ;           1.8496
    99. ;           ------                                        1101
    100. ;           1.6992
    101. ;           1.3984
    102. ;           0.7968
    103. ;           1.5936
    104. ;           ------                                        1101
    105. ;           1.1872
    106. ;           0.3744
    107. ;           0.7488
    108. ;           1.4976
    109. ;           ------                                        1001
    110. ;           0.9952
    111. ;           1.9904
    112. ;           1.9808
    113. ;           1.9616
    114. ;           ------                                        0111
    115. ;           1.9232
    116. ;           1.8464
    117. ;           1.6928
    118. ;           1.3856
    119. ;           ------                                        1111b
    120. ;          =.00'1100'1101'0011'0101'1010'1000'0101'1000'0111'1001'0011'1101'1101'1001'0111'1111b
    121. ;
    122. ;
    123. ;    Имеем двоичное число
    124. ;    11101111011.00'1100'1101'0011'0101'1010'1000'0101'1000'0111'1001'0011'1101'1101'1001'0111'1111b
    125. ;
    126. ;
    127. ;    Нормализируем
    128. ;    1.1101111011_ссунули10раз_00'1100'1101'0011'0101'1010'1000'0101'1000'0111'1001'0011'1101'1101'1001'0111'1111b
    129. ;                _тоесь поделили на 2^число_ссувов, поле экспоненты служит своего рода баластом/компенсатором
    130. ;
    131. ;
    132. ;    Формируем TBYTE FLOAT
    133. ;    $3fff + 10 = $4009 ; экспонента, если хотим положительную мантису - НЕ экспоненту
    134. ;    $bfff + 10 = $с009 ; экспонента, если хотим отрицательную мантису - НЕ экспоненту
    135. ;                       ; если же экспонента отрицательная, то делали бы $3fff-10=$3ff5 или $bfff-10=$bff5
    136. ;    $4009 = 0100'0000'0000'1001b
    137. ;    $c009 = 1100'0000'0000'1001b
    138. ;                       ; экспонента есть, прилепим первые 64 бит дроби 1110111101100110011010011010110101000010110000111100100111101110b
    139. ;    -1915.2004 = 1100'0000'0000'1001''1110'1111'0110'0110'0110'1001'1010'1101''0100'0010'1100'0011'1100'1001'1110'1110 bin
    140. ;                 ---- ---- ---- ----  ---- ---- ---- ---- ---- ---- ---- ----  ---- ---- ---- ---- ---- ---- ---- ----
    141. ;                    c    0    0    9     e    f    6    6    6    9    a    d     4    2    c    3    c    9    e    e hex
    142. ;    +1915.2004 = 0100'0000'0000'1001''1110'1111'0110'0110'0110'1001'1010'1101''0100'0010'1100'0011'1100'1001'1110'1110 bin
    143. ;                 ---- ---- ---- ----  ---- ---- ---- ---- ---- ---- ---- ----  ---- ---- ---- ---- ---- ---- ---- ----
    144. ;                    4    0    0    9     e    f    6    6    6    9    a    d     4    2    c    3    c    9    e    e hex
    145. ;
    146. ;
    147. ;    Формируем QWORD FLOAT
    148. ;    Знак числа и экспонента занимают 12 бит, фракция - 52(бит 53 подразумевается равным 1).
    149. ;    $3ff + 10 = $409 = 0100'0000'1001b ; ну, вспоминаем, что это
    150. ;    $bff + 10 = $c09 = 1100'0000'1001b ; так записуем положительную экспоненту отрицательного числа
    151. ;                                       ; пропустив 1ый бит дроби, прибавим остальные 52 1101111011001100110100110101101010000101100001111001b
    152. ;    -1915.2004 = 1100'0000'1001''1101'1110'1100'1100'1101'0011'0101'1010'1000'0101'1000'0111'1001 bin
    153. ;                 ---- ---- ----  ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
    154. ;                    c    0    9     d    e    c    c    d    3    5    a    8    5    8    7    9 hex
    155. ;
    156. ;    +1915.2004 = 0100'0000'1001''1101'1110'1100'1100'1101'0011'0101'1010'1000'0101'1000'0111'1001 bin
    157. ;                 ---- ---- ----  ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
    158. ;                    4    0    9     d    e    c    c    d    3    5    a    8    5    8    7    9 hex
    159. ;
    160. ;
    161. ;    Формируем DWORD FLOAT
    162. ;    Знак числа и экспонента занимают 9 бит, фракция - 23(бит 24 подразумевается равным 1).
    163. ;    ; положительная степень положительного числа
    164. ;      0'0111'1111b
    165. ;    +        1010b
    166. ;    = 0'1000'1001b
    167. ;
    168. ;    ; положительная степень отрицательного числа
    169. ;      1'0111'1111b
    170. ;    +        1010b
    171. ;    = 1'1000'1001b
    172. ;
    173. ;    ; пропустив 1ый бит дроби, прибавим остальные 23 11011110110011001101001b
    174. ;    -1915.2004 = 1'1000'1001''11011110110011001101001 bin
    175. ;               = -----+++++------++++----++++----++++
    176. ;                     c    4     e   f   6   6   6   9 hex
    177. ;
    178. ;    +1915.2004 = 0'1000'1001''11011110110011001101001 bin
    179. ;               = -----+++++------++++----++++----++++
    180. ;                     4    4     e   f   6   6   6   9 hex
    181. ;*/
    182.  
    183.  
    184.  
    185.  
    186. ; val   = 0..2^64-1
    187. ; merge = 0<bytes<9 of value to show ;байт на вывод
    188. ; example: repeat 8
    189. ;            display 13,10
    190. ;            ShowHex $FEDCBA9876543210,%
    191. ;          end repeat
    192. macro ShowHex val*, merge*{
    193.   if merge > 0 & merge < 9
    194.     local .a, .merge
    195.     .merge = (merge) shl 1
    196.     while .merge <> 0
    197.       .a = (val) shr ((.merge - 1) * 4) and 1111b or 11'0000b
    198.       if .a > 11'1001b
    199.     .a = .a + 111b
    200.       end if
    201.       display .a
    202.       .merge = .merge - 1
    203.     end while
    204.   end if
    205. }
    206.  
    207.  
    208. ;display 13,10,'dd 0.1: '
    209. ;ShowFloat dd 0.1
    210. ;
    211. ;display 13,10,'dq 0.1: '
    212. ;ShowFloat dq 0.1
    213. ;
    214. ;display 13,10,'dt 0.1: '
    215. ;ShowFloat dt 0.1
    216. ;
    217. ;display 13,10,'3.1416: '
    218. ;ShowFloat dt 3.14159265358979323
    219. macro ShowFloat command*{
    220.   local .a
    221.   virtual at 0
    222.     command
    223.     if $=4
    224.       load .a dword from 0
    225.       ShowHex .a,4
    226.     else if $=8
    227.       load .a qword from 0
    228.       ShowHex .a,8
    229.     else if $=10
    230.       load .a word from 8
    231.       ShowHex .a,2
    232.       display "'"
    233.       load .a qword from 0
    234.       ShowHex .a,8
    235.     end if
    236.   end virtual
    237. }
    238.  
    239.  
    240.  
    241.  
    242. display 13,10,'+1915.2004 как TBYTE FLOAT = '
    243. ShowFloat dt +1915.2004
    244. display 13,10,'-1915.2004 как TBYTE FLOAT = '
    245. ShowFloat dt -1915.2004
    246.  
    247. display 13,10,'+1915.2004 как QWORD FLOAT = '
    248. ShowFloat dq +1915.2004
    249. display 13,10,'-1915.2004 как QWORD FLOAT = '
    250. ShowFloat dq -1915.2004
    251.  
    252. display 13,10,'+1915.2004 как DWORD FLOAT = '
    253. ShowFloat dd +1915.2004
    254. display 13,10,'-1915.2004 как DWORD FLOAT = '
    255. ShowFloat dd -1915.2004
    256.  
    257. display 13,10,'fasm me!'
    258.  
    259. display 13,10,'+1887.1976 как TBYTE FLOAT = '
    260. ShowFloat dt +1887.1976
    261. display 13,10,'-1887.1976 как TBYTE FLOAT = '
    262. ShowFloat dt -1887.1976
    263.  
    264. display 13,10,'+1887.1976 как QWORD FLOAT = '
    265. ShowFloat dq +1887.1976
    266. display 13,10,'-1887.1976 как QWORD FLOAT = '
    267. ShowFloat dq -1887.1976
    268.  
    269. display 13,10,'+1887.1976 как DWORD FLOAT = '
    270. ShowFloat dd +1887.1976
    271. display 13,10,'-1887.1976 как DWORD FLOAT = '
    272. ShowFloat dd -1887.1976
    273.  
    274. display 13,10,'fasm me!'
    275.  
    276. display 13,10,'0.1 = '
    277. ShowFloat dt 0.1
    278. display 13,10,'3.1415926535897932380 = '
    279. ShowFloat dt 3.1415926535897932380
     
  20. rozz

    rozz New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2010
    Сообщения:
    21
    Адрес:
    Украина
    edemko, Ого!!! Спасибо большое! Сейчас буду разбираться :)

    Я извиняюсь, а программа на каком написана?