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

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    angrylion
    для получения SUB можно оттолкнутся от готовой ADD при этом нужно учесть, что
    -B=~B+1 и тогда A-B=A+(~B)+1 или A-B=~((~A)+B)
    первый раз слышу -- До сих пор считалось, что установка или сброс флага это результ какой-либо логической или арифметической операции.
    Получение ADD
    Вариант 1 можно побитно посчитать чему равен s(i) от a(i) и b(i). Например для сложения двухразрядных чисел |a(1)a(0)| и |b(1)b(0)| мы должны получить такие s(2), s(1), s(0), что |s(2)s(1)s(0)|=|a(1)a(0)|+|b(1)b(0)|
    s(0) = a(0) ^ b(0)
    s(1) = ((a(0) & b(0)) ^ a(1)) ^ b(1)
    s(2) = ((a(0) & b(0))&(a(1) | b(1))) | (a(1) & b(1))
    Вариант 2 Суммирова­ние многоразрядных чисел производится путем сложения одноразрядных двоичных чисел
    a(i), b(i) и переноса из младшего разряда c(i) образуя на выхо­де значения суммы s(i) и переноса в старший разряд c(i+1). Функции s(i) и c(i+1) имеют вид
    s(i)=a(i)^b(i)^c(i) и c(i+1)=a(i)&b(i) | (a(i) | b(i))&c(i).
    Используя формулу c(i) можно посчитать значение переноса для каждого i-ого разряда суммы:
    для первого разряда с(1)= a(0) & b(0)
    для второго разряда c(2)=a(1)&b(1) | (a(1) | b(1))&c(1)=a(1)& b(1) | (a(1) | b(1)) &a(0)&b(0)
    для третьего разряда c(3)=a(2)&b(2) | (a(2) | b(2))&c(2)=
    =a(2)&b(2) | (a(2) | b(2))&(a(1)&b(1) | (a(1) | b(1))&a(0)&b(0))
    для четвертого разряда c(4)=a(3)&b(3) | (a(3) | b(3)) & c(3)=. . . и так далее
    Вариант 3 Также можно результат сложения чисел A и B получить за несколько шагов: получение ча­стичной суммы A^B и разрядов переноса (A & B)>>1, из частичной суммы и разрядов переноса будет сформирована новая частичная сумма и новые разряды переноса и т.д. Пусть мы складываем A=1011b и B=1110b
    +1011 = A A + B = (A ^ B) + 2(A & B) на каждом шаге будем получать частичную сумму
    1110 = B и переносы из предыдущих разрядов, до тех пор пока либо частичная сумма,
    0101 = A ^ B частичная сумма либо переносы не станут равными нулю, причем если
    10100 = 2(A&B) переносы слагаемые равны, получаем сдвиг влево на первом шаге
    10001
    001000
    11001
    0000000
    0011001 или на псевдоязыке
    Код (Text):
    1. a1:   C:= A xor B // частичная сумма
    2.        B:=(A and B)>>1 // разряды переноса
    3.        A:=C
    4.        if A and B <> 0 then goto a1
    5.        SUM:=A or B // результат
     
  2. angrylion

    angrylion New Member

    Публикаций:
    0
    Регистрация:
    1 май 2007
    Сообщения:
    10
    Спасибо, вот этой формулы мне и не хватало.
     
  3. Max_Cohen

    Max_Cohen New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    19
    Адрес:
    Где-то здесь
    Добрый день. Скажите, как на TASM32 сделать скриншот и сохранить в формате *.bmp, *.jpg и т.д. Если можно, с подсказками. Заранее благодарю.
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Max_Cohen
    Если под DOS -- читай буфер экрана (с адреса 0A0000h по 0AFFFFh), системную палитру и номер видеорежима (чтобы узнать разрешение экрана, сколько битов приходится на пиксель, цветной или черно-белый режим) и сохраняй содержимое в файл *.bmp или *.dib -- эти форматы самые простые. Предварительно придется разобраться с форматом bmp... В качестве промежуточного этапа придется написать программу, которая выводит содержимое bmp-файла на экран. Последний этап -- разобраться с компрессией картинок и копировать экран в *.jpg, *.png, *.gif и т.д.
     
  5. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Под Windows на FASM`е можно так
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'windows.inc'
    5.  
    6. section '' code readable writeable
    7.   start:
    8.   xor    esi,esi
    9.   invoke GetDC,esi
    10.   mov    [DC],eax
    11.   invoke GetDeviceCaps,eax,DESKTOPHORZRES
    12.   mov    [width],eax
    13.   invoke GetDeviceCaps,[DC],DESKTOPVERTRES
    14.   mov    [height],eax
    15.   mov    ebx,eax
    16.   mul    [width]
    17.   shl    eax,2
    18.   mov    [rastersize],eax
    19.   add    eax,54
    20.   mov    [filesize],eax
    21.  
    22.   invoke VirtualAlloc,esi,[rastersize],MEM_COMMIT,PAGE_READWRITE
    23.   mov    [Buffer],eax
    24.  
    25.   mov    edi,[Buffer]
    26.   @@:xor esi,esi
    27.      @a: invoke GetPixel,[DC],esi,ebx
    28.          bswap  eax
    29.          shr    eax,8
    30.          stosd
    31.          inc    si
    32.          cmp    esi,[width]
    33.      jne @a
    34.      dec bx
    35.   jne @b
    36.  
    37.   invoke GetCurrentDirectory,1024,filename
    38.   mov    dword[filename+eax],'\1.b'
    39.   mov    word[filename+eax+4],'mp'
    40.   invoke CreateFile,filename,GENERIC_WRITE,ebx,ebx,CREATE_ALWAYS,ebx,ebx
    41.   mov    [hfile],eax
    42.   invoke WriteFile,eax,BMP,54,DC,ebx
    43.   invoke WriteFile,[hfile],[Buffer],[rastersize],DC,ebx
    44.   invoke CloseHandle,[hfile]
    45.   invoke VirtualFree,[Buffer],[rastersize],MEM_DECOMMIT
    46.   invoke ExitProcess,ebx
    47.  
    48. DC       rd 1
    49. hfile    rd 1
    50. Buffer   rd 1
    51. filename rb 1024
    52.  
    53. BMP:
    54.    signature    db 'BM'
    55.    filesize     dd 0
    56.    reserved     dd 0
    57.    rasteroffset dd 54
    58.    headersize   dd 40
    59.    width        dd 0
    60.    height       dd 0
    61.    planes       dw 1
    62.    depth        dw 32
    63.    compression  dd 0
    64.    rastersize   dd 0
    65.    horres       dd 0
    66.    verres       dd 0
    67.    colors       dd 0
    68.    basecolors   dd 0
    69.  
    70. section '' import data readable writeable
    71.  
    72.   library kernel,'KERNEL32.DLL',\
    73.           user,'USER32.DLL',\
    74.           gdi,'gdi32.dll'
    75.  
    76.   import kernel,\
    77.          VirtualAlloc,'VirtualAlloc',\
    78.          VirtualFree,'VirtualFree',\
    79.          CreateFile,'CreateFileA',\
    80.          WriteFile,'WriteFile',\
    81.          CloseHandle,'CloseHandle',\
    82.          GetCurrentDirectory,'GetCurrentDirectoryA',\
    83.          ExitProcess,'ExitProcess'
    84.  
    85.   import user,\
    86.          GetDC,'GetDC'
    87.  
    88.    import gdi,\
    89.          GetDeviceCaps,'GetDeviceCaps',\
    90.          GetPixel,'GetPixel'
    Но вызывать GetPixel width*height раз не дзенно.
     
  6. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
  7. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    А ещё можно эмулировать нажатие PrintScreen
    Код (Text):
    1.   xor    esi,esi
    2.   invoke GetSystemMetrics,SM_CXFULLSCREEN
    3.   mov    [width],eax
    4.   invoke GetSystemMetrics,SM_CYFULLSCREEN
    5.   mov    [height],eax
    6.   mov    ebx,eax
    7.   mul    [width]
    8.   shl    eax,2
    9.   mov    [rastersize],eax
    10.   add    eax,54
    11.   mov    [filesize],eax
    12.   invoke VirtualAlloc,esi,[rastersize],MEM_COMMIT,PAGE_READWRITE
    13.   mov    [Buffer],eax
    14.   invoke keybd_event,VK_SNAPSHOT,45h,KEYEVENTF_EXTENDEDKEY,esi
    15.   invoke keybd_event,VK_SNAPSHOT,45h,KEYEVENTF_EXTENDEDKEY+KEYEVENTF_KEYUP,esi
    16.   invoke OpenClipboard,esi
    17.   invoke GetClipboardData,CF_BITMAP
    18.   invoke GetBitmapBits,eax,[rastersize],[Buffer]
    19.   call   [CloseClipboard]
    20.   invoke GetCurrentDirectory,1024,filename
    21.   mov    dword[filename+eax],'\1.b'
    22.   mov    word[filename+eax+4],'mp'
    23.   invoke CreateFile,filename,GENERIC_WRITE,esi,esi,CREATE_ALWAYS,esi,esi
    24.   mov    [hfile],eax
    25.   invoke WriteFile,eax,BMP,54,reserved,esi
    26.   invoke WriteFile,[hfile],[Buffer],[rastersize],rastersize,esi
    27.   invoke CloseHandle,[hfile]
    28.   invoke VirtualFree,[Buffer],[rastersize],MEM_DECOMMIT
    29. ret
     
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    murder
    Красиво, конечно, особенно эмуляция PrintScr, но боюсь не оценят :)
     
  9. alfer

    alfer New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    2
    Люди помогите плиз, короче тема следущая:
    Существует прога (неважный аспект), она защищена прогой регистрашкой, нужно сделать так, чтоб она могла бы работать без неё, побольше об этом расписать и рассказать мне, сам занимаюсь усердно данным вопросом, очень нужно для диплома! всё сделано на дельфях, исходник естественно препод не дал, иначе нет смысла ломать! Мне нужно описать как взломать и чем ему накасячить можно, принимаю любые более менее разумные решения) Заранее огромное спасибо!!!
    Правда очень сильно нужно!!!
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    alfer
    Код (Text):
    1. Executable modules, item 0
    2.  Base=00400000
    3.  Size=0007F000 (520192.)
    4.  Entry=0046571C key_gene.<ModuleEntryPoint>
    5.  Name=key_gene
    6.  Path=I:\F1\key_generator.exe
    7.  
    8. 00463130 <GenerateRegistrationID>
    9. 00463E8C <GenerateAuthorizationId>
     
  11. alfer

    alfer New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    2
     
  12. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Здравствуйте,

    Есть массив из 32 байт(значения любые), я беру поочередно 2 байта и складываю между собой. Если значение, которое я получаю - отрицательное, мне необходимо перевести его в беззнаковое. Т.е. не просто изменить знак числа.

    Не тупо же складывать с 65535, помойму там в особых случаях надо прибавлять битик ?

    Выразился конечно коряво, буду рад любым ссылкам.
     
  13. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Noga
    То есть нужно взять модуль числа
     
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Noga
    То есть вы складываете два беззнаковых числа и если получается 1 в 7 бите то от результа нужно взять модуль? Тогда как-то так
    Код (Text):
    1. add al,bl
    2. test al,al
    3. jns a1
    4. neg al
    5. a1: ...
     
  15. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Mikl___

    murder

    Сорри запутал всех, я имел ввиду если получаю значение из массива (2байта) и оно отрицательное, то мне надо привести его к беззнаковому.
     
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Noga
    Код (Text):
    1. mov ecx,16
    2. mov esi,offset Исходный_массив
    3. mov edi,offset Массив_результат
    4. a1: lodsw
    5.      test ax,ax
    6.      jns a2
    7.      neg ax
    8. a2: stosw
    9.      loop a1
     
  17. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Код (Text):
    1. mov edi,arr
    2. mov ecx,16
    3. @@:movsx eax,word[edi]
    4.    cdq
    5.    xor   ax,dx
    6.    sub   ax,dx
    7.    stosw
    8. loop @b
     
  18. wreck3d

    wreck3d New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    2
    Есть простая задача:
    Написать программу для вычитания между собой двух переменных (Х и У). Если результат меньше либо равно 50, то необходимо умножить его на 10, если же больше то разделить на 5. (Используя команды условного и безусловного перехода).
    Помогите с решением.
     
  19. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    (z = x - y) <= 50 ? z *= 10 : z /= 5;
     
  20. wreck3d

    wreck3d New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    2
    Теперь то же самое, только на ассемблере plz!