Туплю...

Тема в разделе "WASM.BEGINNERS", создана пользователем GNTB, 13 июл 2007.

  1. GNTB

    GNTB New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2006
    Сообщения:
    38
    Написал такую ерунду:

    Код (Text):
    1. #include <iostream.h>
    2.  
    3. main()
    4. {
    5. short unsigned int suiPeremennaya = 0;
    6. cout << "suiPeremennaya = " << suiPeremennaya << endl;
    7.  
    8. _asm {
    9. mov ax, 300
    10. mov ah, 0
    11. shr ax, 1
    12. mov suiPeremennaya, ax
    13. }
    14.  
    15. cout << "suiPeremennaya = " << suiPeremennaya << endl;
    16.  
    17. return 0;
    18. }
    Думал, получу 128. Пишет: 22... Я считал, что AH - верхняя восьмибитная часть 16-разрядного регистра AX. Что обнуляю я верхние 44, и оставляю 256. Затем совершаю сдвиг вправо. Память в x86 адресуется вроде от большего к меньшему, но это вроде здесь нипричём?

    Всё. Я "завис". Жму reset для перезагрузки головного мозга. :)

    Sorry, я "чайник".

    используем тег [ code ]!
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Код (Text):
    1. _asm {
    2. mov ax, 300
    3. 00401031  mov         ax,12Ch
    4. mov ah, 0
    5. 00401035  mov         ah,0
    6. shr ax, 1
    7. 00401037  shr         ax,1
    8. mov suiPeremennaya, ax
    9. 0040103A  mov         word ptr [esp],ax
    10. }
    короче в ax 300 (0x12c) затем обрезается единичка так как она попадает в ah, получается 0x2с, затем делится на 2, в итоге 0х16 = 22
     
  3. GNTB

    GNTB New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2006
    Сообщения:
    38
    Действительно туплю...

    00000001 00101100
    00000000 00101100
    00000000 00010110

    ...спасибо за помощь. Всё правильно...
     
  4. GNTB

    GNTB New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2006
    Сообщения:
    38
    Опять туплю...
    Такая заморочка:
    Код (Text):
    1. #include <iostream.h>
    2.  
    3. main()
    4. {
    5.     short int matrix = 47;
    6.    
    7.     matrix = matrix | 32768;
    8.     cout << matrix << endl;
    9.  
    10.     return 0;
    11. }
    или так:
    Код (Text):
    1.  
    2. #include <iostream.h>
    3.  
    4. main()
    5. {
    6.     short int matrix = 47;
    7.  
    8.     _asm
    9.     {
    10.         OR matrix, 32768
    11.     }
    12.     cout << matrix << endl;
    13.  
    14.     return 0;
    15. }
    Возвращает:
    -32721. А не -47. В чём проблема? С размещением в памяти многобайтовых данных, так?
     
  5. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    32768 в битах выглядит как 1000000000000000
    47 как 0000000000101111
    1000000000000000 or 0000000000101111 = 1000000000101111
    1000000000101111 = 32815 или -32721
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Unsigned int нужно ставить видимо для matrix
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    GNTB
    Не многобайтовых, а знаковых. Отрицательные числа (любой разрядности) представляются не в прямом коде, а в дополнительном, т.е. char (-1) в хекс-виде записывается как FFh, а не 81h, а твои short int (-47) будут FFD1h, а не 802Fh как ты пытаешься делать.
    Чтобы изменить знак числа нужно не знаковый бит менять, а нужно инвертировать все биты числа операцией NOT (или XOR c 0) и прибавить 1
     
  8. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    leo
    xor c 0 любого числа выдаст тоже самое число :derisive:
    вот ксор с (-1), расширенной до величины машинного слова, - другое дело ж)