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

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

  1. un

    un New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2009
    Сообщения:
    6
    censored
    Спасибо большое, все работает.
     
  2. h0rr0rr_drag0n

    h0rr0rr_drag0n New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    2
    MASM'у не нравится команда вида mov dx, array[si]

    В программе мы помещаем в регистр dx элемент из массива, командой указанной выше.
    Листинг:
    Код (Text):
    1. .model small ;модель памяти - small. 1 D.S. и 1 C.S.
    2.  
    3. .stack 128 ;сегмент стека.
    4.  
    5. .data ;сегмент данных
    6. ; объявляем здесь строки, для вывода на экран.
    7. mesn db 'не = 0!$', 0ah, 0dh
    8. mese db ' = 0!$', 0ah, 0dh
    9. mes1 db 'Элемент #$'
    10. mes2 db ' равный $'
    11. ; наш проинициализированный массив.
    12. array db 4,3,66,-3,0,2,43,-99
    13. .code
    14. main:
    15. ; Заносим реальный адрес сегмента данных
    16. ; в регистр ds
    17.     mov ax, @data
    18.     mov ds, ax
    19.     xor ax, ax
    20. ; Счетчик цикла в cx = 8
    21.     mov cx, 8
    22. ; Индекс элемента массива = 0
    23.     mov si, 0
    24. compare_cycle:
    25.     mov dx, array[si]
    26.     cmp dx, 0h ; Сравниваем с нулем
    27.     je equal ; переход если равно
    28. ; не равно
    29. not_equal:
    30.     lea dx, mes1
    31.     mov ah, 9h
    32.     int 21h
    33. ; равно
    34. equal:
    35.     int 21h
    36. ; стандартный код завершения программы
    37.     mov ax, 4c00h
    38.     int 21h
    39.     end main
    При попытке ассемблирования этого файла командой BIN\ml.exe laba2.s получаем ошибку вида:
    laba2.s(25): error A2070: invalid instruction operands.

    "Ошибочная" часть программы скопирована из книги Юрова "Ассемблер".

    Непонятно, что ассемблеру здесь не нравится - мы всего лишь перемещаем байт из памяти по адресу array+si в регистр dx.

    Использовал MASM версии 6.11
     
  3. h0rr0rr_drag0n

    h0rr0rr_drag0n New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    2
    Поскольку каждый элемент массива занимает 1 байт, я использовал mov dl, array[si]. Все заработало.
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    h0rr0rr_drag0n
    array объявлен как массив байтов "array db 4,3,66,-3,0,2,43,-99", но при желании можно пересылать в регистр DX сразу по два элемента из массива array командой
    mov dx, word ptr array[si]
     
  5. Ukito

    Ukito New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    14
    Учусь!
    есть такое:
    Код (Text):
    1. _t db "welcome",0
    2. _m db "OMGWTFBBQ?",0
    3. _am db 0
    как зделсть что б значение в переменной _am было _t и _m тоесть "welcomeOMGWTFBBQ?" ?

    и еще как создать 2 переменные типа инт и потом присвоить их сумму 3й переменной?
     
  6. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Объединить строки можно так
    Код (Text):
    1. mov   edi,_t
    2. xor   eax,eax
    3. mov   ecx,-1
    4. repne scasb
    5. dec   edi
    6. mov   esi,_m
    7. @@:movsb
    8.    cmp [esi],al
    9. jne @b
     
  7. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    murder
    Маленький нюанс Ukito создал переменную "_am db 0" -- при копировании туда содержимого переменных _t и _m будет потерто то, что находится по адресу ниже переменной _am -- хорошо ли это?
     
  8. Ukito

    Ukito New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    14
    несовсем работает, у меня FASM
    Код (Text):
    1. include 'win32ax.inc'
    2.  
    3. .code
    4. _t db "welcome",0
    5. _m db "OMGWTFBBQ?",0
    6. _am db 0
    7. _a dw 9
    8. _b dw 4
    9. _s dw 0
    10.   start:
    11.  
    12. mov   edi,_t
    13. xor   eax,eax
    14. mov   ecx,-1
    15. repne scasb
    16. dec   edi
    17. mov   esi,_m
    18. @@:movsb
    19.    cmp [esi],al
    20. jne @b
    21.  
    22. ;add _a
    23. ;add _am, _t
    24.         invoke  MessageBox,HWND_DESKTOP,_am,_t,MB_OK
    25. ;        invoke  MessageBox,HWND_DESKTOP,_am,_t,MB_OK
    26.  
    27.         invoke  ExitProcess,0
    28. .end start
    компилирует, но после запуска вылетает с ошибкой память неможет быть read
     
  9. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Ukito, сделай VirtualProtect PAGE_READWRITE
     
  10. Ukito

    Ukito New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    14
    еммм... как зделать? я только учусь, сам ставлю себе задачу и пытаюсь ее решить
     
  11. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Ты еще не дорос до фасма. Возьми какой-нибудь дебаггер типа олли и отдебажь свою программу. И посмотри на какой комманде вылетает.
     
  12. Ukito

    Ukito New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    14
    Спасибо за помощь, будузнать
     
  13. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    можешь скачать фасм и посмотреть как там кнопочки стоят. но только посмотреть. Не вздумай тыкать!
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    а ты дорос(тил) до фасма? и как ты, интересно, определяешь, кто дорос, а кто нет?
    не в фасме тут дело. и нефег везде на него ссылатся. одержимость - плохо.
    ты именно так и начинал?
     
  15. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Ukito
    Не слушай их, тебе необходимо сделать следующее либо
    Код (Text):
    1. .data
    2. _t db "welcome",0
    3. _m db "OMGWTFBBQ?",0
    4. _am db 0
    5. _a dw 9
    6. _b dw 4
    7. _s dw 0
    8. .code
    9.   start:
    Либо
    Код (Text):
    1. section '.code' code readable writable executable
    2. _t db "welcome",0
    3. _m db "OMGWTFBBQ?",0
    4. _am db 0
    5. _a dw 9
    6. _b dw 4
    7. _s dw 0
    8.   start:
     
  16. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Ukito
    Да кстати напиши так
    Код (Text):
    1. t db "welcome",0
    2. rb 256
    3. _m db "OMGWTFBBQ?",0
    Иначе в результате выполнения того кода, который я написал в переменной t будет содержаться "welcomeOMGWTFBBQ??" вместо "welcomeOMGWTFBBQ?".
     
  17. Ukito

    Ukito New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    14
    murder
    можешь пожалуйста обыстить какая строка что делает...
    а как зделсть что б значение в переменной _am было _t и _m тоесть "welcomeOMGWTFBBQ?" ?
    а переменные _m и _t остались неименными
     
  18. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Все элементарно. почитай Юрова или посмотри статьи на этом сайте. все уже писалось миллион раз.
    А чтобы переменные не изменялись сделай так
    Код (Text):
    1. mov edi, _t;где ищем
    2. _t db "QWERTY", 0
    3. _m db "ASDFG", 0
    4. _am db 256 dup 0
    5. xor eax, eax;конец строки 0. a xor a = 0. что ищем
    6. lea ecx, [eax-1];так короче (0x8D 0x48 0xFF вместо 0xB9 0xFFFFFFFF). 0-1=-1. сколько ищем
    7. repne scasb;ищем заверщающий 0
    8. lea ecx, [edi-_t-1];в ecx вычисляем количество байт для копирования (-1 т.к. мы искали 0, а его копировать не надо)
    9. mov esi, _t;откуда копируем
    10. mov edi, _am;куда копируем
    11. rep movsb;копируем
    12. mov esi, edi;сохраняем указатель из edi для продолжения копирования
    13. mov edi, _m;где ищем
    14. lea ecx, [eax-1];так короче (0x8D 0x48 0xFF вместо 0xB9 0xFFFFFFFF). 0-1=-1. сколько ищем
    15. repne scasb;ищем
    16. lea ecx, [edi-_m];в ecx вычисляем количество байт для копирования (но теперь надо скопировать и 0 чтобы завершить строку)
    17. mov edi, esi;восстанавливаем указатель в edi. куда копируем
    18. mov esi, _m;откуда копируем
    19. rep movsb;копируем
     
  19. Morte

    Morte New Member

    Публикаций:
    0
    Регистрация:
    13 мар 2009
    Сообщения:
    14
    Как можно написать задержку на определённый промежуток времени (главное чтобы можно было увидеть перемещающуюся точку на экране)?

    Попытки делать большое количество NOP'ов для задержки времени не увенчались успехом. Процессор очень сильно грузится.
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну смотря где.
    Windows
    GetTickCount/Sleep/...
    DOS
    не контролируемая
    Код (Text):
    1. mov cx, N
    2. l0:
    3. mov dx, -1
    4. l1:
    5. dec dx
    6. jnz l1
    7. loop l0
    контролируемая
    Код (Text):
    1. cli
    2. xor ax, ax
    3. mov ds, ax
    4. mov bx,
    5. les dx, [bx]
    6. mov cx, titer_proc
    7. mov ax, cs
    8. mov [bx+0], cx
    9. mov [bx+2], ax
    10. mov [o], dx
    11. mov [s], es
    12. sti
    13. xor ax, ax
    14. l0:
    15. test ax, ax
    16. jnz l1
    17. hlt
    18. jmp l0
    19. l1:
    20. ...
    21. o           dw       0
    22. s           dw       0
    23. timer_proc:
    24. pushf
    25. call dword [o]
    26. ;какие-либо действия выполняемые с периодичностью ~18,2 раза в секунду
    27. continue:
    28. xor ax, ax
    29. iret
    30. end:
    31. mov ax, 1
    32. iret
    можно более тонко. к примеру если известна частота процессора в тактах, то можно сверяться с tsc (rdtsc)