1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

DIV

Тема в разделе "WASM.ENGLISH", создана пользователем dcskm4200, 19 июн 2005.

  1. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    hello,all



    ;========

    mov edx, 41

    mov eax,41

    mov ebx,16

    div ebx ; Integer overflow exception.

    ;=====



    what's wrong?



    regards
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    EDX:EAX divided by 16 is longer than 32 bits.
     
  3. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    hey,AsmGuru62



    Thanks you for help.

    ;==========

    ;41/16=?

    mov edx, 41

    xor eax,eax

    mov ebx,16

    div ebx

    ;==========

    is it right?



    regards
     
  4. tasman

    tasman New Member

    Публикаций:
    0
    Регистрация:
    25 май 2004
    Сообщения:
    44
    Адрес:
    Ukraine
    No.


    Код (Text):
    1. ;==========
    2. ;41/16=?
    3. mov eax, 41
    4. xor edx,edx
    5. mov ebx,16
    6. div ebx
    7. ;==========
     
  5. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    Hey,tasman.

    Thanks you.

    it's ok.



    regards.
     
  6. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    if ebx=16 constant, next code is faster
    Код (Text):
    1.  
    2. ;eax=eax/16
    3. mov eax, 41
    4. shr eax, 4
    5.  
     
  7. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    hey,yureckor



    Thanks you for help.

    ;==========

    ;Local buffer1[128]:byte

    ;Local buffer2[128]:byte



    mov esi, offset buffer1

    mov edi, offset buffer2

    invoke lstrlen, esi

    shr eax,2

    mov ecx,eax

    .while ecx

    lodsd

    stosd

    dec ecx

    add esi,4

    add edi,4

    .endw

    ;==========



    is it right?



    regards
     
  8. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Код (Text):
    1. ;Local buffer1[128]:byte
    2. ;Local buffer2[128]:byte
    3.     invoke lstrlen, addr buffer1
    4.     lea esi, buffer1
    5.     lea edi, buffer2
    6.     mov edx, eax
    7.     mov ecx, eax
    8.     shr ecx,2
    9.     rep movsd
    10.     mov ecx, edx
    11.     and ecx, 3
    12.     rep movsb
    13.  


    Or use lstrcpy
    Код (Text):
    1. ;Local buffer1[128]:byte
    2. ;Local buffer2[128]:byte
    3.     invoke lstrcpy, addr buffer2, addr buffer1
    4.  
     
  9. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    Hey,SteelRat



    Thanks you for help

    This is the best method which I really need.



    best wish to you.
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    dcskm4200

    Your code is correct, but he slow, since 1) call Windows API, 2) The line can be copied during calculation of its length.
    Код (Text):
    1.  
    2. ;return eax=lenght
    3. copy_str proc src:DWORD, dst:DWORD
    4. push esi
    5. push edi
    6. mov esi, [src]
    7. mov edi, [dst]
    8. xor eax, eax
    9. @@1: mov al, [esi]
    10.  mov [edi], al
    11.  inc esi
    12.  inc edi
    13.  test eax, eax
    14. jnz @@1
    15. mov eax, esi
    16. sub eax, [src]
    17. pop edi
    18. pop esi
    19. ret
    20. copy_str endp
    21.  




    Faster:
    Код (Text):
    1.  
    2. ;return eax=lenght
    3. copy_str_fast proc src:DWORD, dst:DWORD
    4. push esi
    5. push edi
    6. mov esi, [src]
    7. mov edi, [dst]
    8. @@1: mov eax, [esi]
    9.  mov [edi], eax
    10.  test eax, 0000000FFh
    11.  jz @@a1
    12.  test eax, 00000FF00h
    13.  jz @@a2
    14.  test eax, 000FF0000h
    15.  jz @@a3
    16.  test eax, 0FF000000h
    17.  jz @@a4
    18.  add esi, 4
    19.  add edi, 4
    20. jmp @@1
    21. @@a4: inc esi
    22. @@a3: inc esi
    23. @@a2: inc esi
    24. @@a1:
    25.  
    26. mov eax, esi
    27. sub eax, [src]
    28.  
    29. pop edi
    30. pop esi
    31. ret
    32. copy_str_fast endp
    33.  




    You also can change function strlen.asm from MASM32\m32lib, but she works only with 7 bit letters that does not approach for Russian.
     
  11. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    hey,yureckor



    Thanks you for gave me more information.



    we often need to encrypt or decrypt a buffer with a byte or word or dword. since you guided me, now I can manipulate it with a byte and dword. but i can't do it with a word.



    regards