Помогите с ассемблером пожалуйста

Тема в разделе "WASM.BEGINNERS", создана пользователем Zid11, 25 апр 2010.

  1. Zid11

    Zid11 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2010
    Сообщения:
    1
    Разработать программу вычисления
    y=(a1-a2)x+(a2-a3)*2x+...+(a9-a10)*9x при x=2
    A={15;1;3;7;-2;6;12;10;9;3}
    предел вводить с клавиатуры

    Интересует как вводить с клавиатуры предел,т.е. x=2?Поясните пожалуйста,как это делается
     
  2. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Использую API-шную функцию ReadConsole. http://msdn.microsoft.com/en-us/library/ms684958(VS.85).aspx
     
  3. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Zid11,

    Можно также импортировать scanf() из MSVCRT.DLL, если не стоит задача изобретать atoi().
     
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.585
    Чтобы не плодить новые темы, спрошу здесь. Не могу разобраться, почему не работает программа. Программа консольная, должна принимать имя диска (через read\write console), проверять его функцией GetDriveType и, в зависимости от того, что ввели, выводить инфу. Но - не работает, почему-то функция постоянно возвращает одно и тоже значение (вне зависимости от того, какое имя диска и как ввел, хоть С:\, хоть СССС, хоть что), а именно DRIVE_NO_ROOT_DIR. (т.е. 1 в еах, как видно в отладчике). В стандартном Масме в инклудах нет DRIVE_NO_ROOT_DIR, поэтому надо прописывать DRIVE_NO_ROOT_DIR equ 1 (как в МСДН).

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\windows.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .const
    12. sConsoleTitle db "Disk verifier",0
    13.  
    14. .data
    15. lpFilename db 256 dup (0)
    16.  
    17. bootdisk db "ZHESTKIY DISK",0
    18. invitex db "VVEDITE DISK!",0
    19. cdrom db "CD ROM",0
    20. hz4to db "UNCNOWN DEVICE",0
    21.  
    22.  
    23.  
    24. .data?
    25. hStdout dd ?
    26. hStdin dd ?
    27. bReaded dd ?
    28. bWritten dd ?
    29. diske db ?
    30.  
    31. .code
    32. Start:
    33. Invoke SetConsoleTitle,addr sConsoleTitle
    34. Invoke GetStdHandle,STD_OUTPUT_HANDLE
    35. mov hStdout,eax
    36. mov esi,sizeof invitex
    37. Invoke WriteConsole,hStdout,addr invitex,esi,addr bWritten,NULL ;выводим приглашение ввести диск
    38. Invoke GetStdHandle,STD_INPUT_HANDLE
    39. mov hStdin,eax
    40. ;or - Invoke ReadConsole,hStdin,addr diske,sizeof diske,addr bReaded,NULL
    41. Invoke ReadConsole,hStdin,addr lpFilename,sizeof lpFilename,addr bReaded,NULL ;считываем диск
    42. Invoke GetDriveType,addr lpFilename ;проверяем
    43. cmp eax,DRIVE_FIXED
    44. je Zhest
    45. cmp eax,DRIVE_CDROM
    46. je CD
    47. cmp eax,DRIVE_NO_ROOT_DIR
    48. je Unk
    49.  
    50. Exit:
    51. Invoke ExitProcess,0
    52. Zhest:
    53. Invoke WriteConsole,hStdout,addr bootdisk,sizeof bootdisk,NULL,NULL
    54. CD:
    55. Invoke WriteConsole,hStdout,addr cdrom,sizeof cdrom,NULL,NULL
    56. Unk:
    57. Invoke WriteConsole,hStdout,addr hz4to,sizeof hz4to,NULL,NULL
    58. end Start
     
  5. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    Код (Text):
    1. ;--------
    2. Invoke ReadConsole,hStdin,addr lpFilename,3,addr bReaded,NULL ;считываем диск
    3. Invoke GetDriveType,addr lpFilename  ;проверяем
    4. cmp eax,DRIVE_FIXED
    5. je Zhest
    6. cmp eax,DRIVE_CDROM
    7. je CD
    8. cmp eax,DRIVE_NO_ROOT_DIR
    9. je Unk
    10.  
    11. Zhest:
    12. Invoke WriteConsole,hStdout,addr bootdisk,sizeof bootdisk,NULL,NULL
    13. CD:
    14. Invoke WriteConsole,hStdout,addr cdrom,sizeof cdrom,NULL,NULL
    15. Unk:
    16. Invoke WriteConsole,hStdout,addr hz4to,sizeof hz4to,NULL,NULL
    17. Exit:
    18. invoke Sleep,2000
    19. Invoke ExitProcess,0
    20. end Start
    1) перенёс ExitProcess в конец программы, т.к. нет джампов на "Exit:" - из-за этого вылетала ошибка
    2) добавил "invoke Sleep,2000" - чтобы посмотреть, что получилось
    3) уменьшил размер lpFilename до трёх символов(больше не требуется), т.к. лишние нули в "lpFilename db 256 dup (0)" приводили к постоянному возврату "UNCNOWN DEVICE"

    вводить: С:\
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.585
    bizdon, спасибо, так все работает. Единственное, я добавил в каждую метку код jmp Exit, иначе у меня (скажем при вводе жесткого диска) выводились все три текста подряд.