Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/41: Рейтинг темы: голосов - 41, средняя оценка - 4.73
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181

Перевод из Ассемблера в C++

20.02.2012, 20:30. Показов 8652. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в интернете нашел программу, которая разрешает или запрещает доступ к USB, написанная на Ассемблере. А я программу пишу на C++. В С++ есть же ассемблерные вставки. Хочу прямиком код по блокам закинуть на С++. Хотелось бы хотя бы разделить код на функции. Весь проект можно скачать тут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
.486
.model  flat, stdcall
option  casemap :none   ; case sensitive
 
include     base.inc
 
SP_CLASSINSTALL_HEADER struct
    cbSize          dd ?
    InstallFunction dd ?
SP_CLASSINSTALL_HEADER EndS
 
SP_PROPCHANGE_PARAMS struct
    ClassInstallHeader  SP_CLASSINSTALL_HEADER <>
    StateChange         dd ?
    Scope           dd ?
    HwProfile           dd ?
SP_PROPCHANGE_PARAMS EndS
 
SP_DEVINFO_DATA struct
cbSize      dd ?
ClassGuid       GUID <>
DevInst     dd ?
Reserved        dd ?
SP_DEVINFO_DATA EndS
 
DICS_ENABLE     equ 1
DICS_DISABLE        equ 2
DIF_PROPERTYCHANGE  equ 12h
DICS_FLAG_GLOBAL    equ 1
DIGCF_PRESENT       equ 2
SPDRP_COMPATIBLEIDS equ 2
 
.data
 
pcp         SP_PROPCHANGE_PARAMS    <>
DevInfoData SP_DEVINFO_DATA     <>
 
DISK_GUID       dd 4D36E967h
            dw 0E325h
            dw 11CEh
            dw 0C1BFh
            db 08h, 0, 2Bh, 0E1h, 03, 18h
            
aUSBSTOR        db 'USBSTOR\Disk',0
aUSB            db 'USB Enable/Disable',0
aUSBDisable db 'Device disable',0
aUSBEnable  db 'Device enable',0
 
.code
start:
    invoke  GetModuleHandle, NULL
    mov     hInstance, eax
    invoke  DialogBoxParam, hInstance, 101, 0, ADDR DlgProc, 0
    invoke  ExitProcess, eax
; -----------------------------------------------------------------------
ChangeStateUSBDevice proc fState:DWORD
LOCAL   hDevInfoSet :DWORD
LOCAL   dwTmp       :DWORD
LOCAL   BufStr[255] :BYTE
LOCAL   Result      :DWORD
 
mov     Result,FALSE
 
mov     pcp.ClassInstallHeader.cbSize,sizeof SP_CLASSINSTALL_HEADER
mov     pcp.ClassInstallHeader.InstallFunction,DIF_PROPERTYCHANGE
mov     eax,fState
mov     pcp.StateChange,eax
mov     pcp.Scope,DICS_FLAG_GLOBAL
invoke  SetupDiGetClassDevs,addr DISK_GUID,NULL,NULL,DIGCF_PRESENT
mov     hDevInfoSet,eax
 
mov     DevInfoData.cbSize,sizeof SP_DEVINFO_DATA
xor     ecx,ecx
loop1:
    push        ecx
    invoke  SetupDiEnumDeviceInfo,hDevInfoSet, ecx, addr DevInfoData
    .if eax==0
        jmp @
    .endif
    invoke  SetupDiGetDeviceRegistryProperty,hDevInfoSet,addr DevInfoData,SPDRP_COMPATIBLEIDS,\
                                        addr dwTmp,addr BufStr,sizeof BufStr,NULL
    invoke  lstrcmp,addr BufStr,offset aUSBSTOR
    .if eax==0
        invoke  SetupDiSetClassInstallParams,hDevInfoSet,addr DevInfoData,addr pcp,sizeof SP_PROPCHANGE_PARAMS
        .if eax==0
            jmp @
        .endif
        invoke  SetupDiCallClassInstaller,DIF_PROPERTYCHANGE,hDevInfoSet, addr DevInfoData
        .if eax==0
            jmp @
        .endif
        mov     Result,TRUE
    .endif
    pop ecx
    inc ecx
jmp loop1
invoke  SetupDiDestroyDeviceInfoList,hDevInfoSet
@:
mov eax,Result
Ret
ChangeStateUSBDevice EndP
; -----------------------------------------------------------------------
DlgProc proc    hWin    :DWORD,
        uMsg    :DWORD,
        wParam  :DWORD,
        lParam  :DWORD
 
    .if uMsg == WM_COMMAND
        .if wParam == IDC_Disable
; -----------------------------------------------------------------------
            invoke  ChangeDeviceState,DICS_DISABLE
            .if eax==TRUE
                invoke  MessageBeep,0
            .endif
; -----------------------------------------------------------------------
        .elseif wParam == IDC_Enable
; -----------------------------------------------------------------------
            invoke  ChangeDeviceState,DICS_ENABLE
            .if eax==TRUE
                invoke  MessageBeep,0
            .endif
; -----------------------------------------------------------------------
        .elseif wParam == IDC_IDCANCEL
            invoke EndDialog,hWin,0
        .endif
    .elseif uMsg == WM_CLOSE
        invoke  EndDialog,hWin,0
    .endif
 
    xor eax,eax
    ret
DlgProc endp
 
end start
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2012, 20:30
Ответы с готовыми решениями:

Перевод фрагмента кода с ассемблера
Имеется фрагмент кода, мне необходимо перевести ассемблерную часть в c++. Кто может помочь? static INLINE LONG interlockedexchange(LONG...

Перевод команд ассемблера в машинный код
Доброго времени суток. Не так давно начал изучать ассемблер. И возник следующий вопрос... Дан участок кода: m1: mov es:,dl ...

Перевод кода с ассемблера на Си
Уважаемые форумчане, подскажите, правильно ли я перевел ассемблерный код на Си? Если нет, поправьте пожалуйста. Слева все переменные -...

4
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
20.02.2012, 23:12
Примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "windows.h"
#include "setupapi.h"
 
//#pragma comment(lib, "setupapi.lib")
 
const GUID DISK_GUID = { 0x4D36E967, 0xE325, 0x11CE, {0xC1, 0xBF, 0x08, 0x00, 0x2B, 0xE1, 0x03,0x18} };
//const char aUSBSTOR[] = "USBSTOR\\Disk";
SP_PROPCHANGE_PARAMS pcp;
 
bool ChangeStateUSBDevice(DWORD fState)
{
    SP_DEVINFO_DATA DevInfoData;
    HDEVINFO hDevInfoSet;
    DWORD dwTmp;
    BYTE BufStr[255];
    
    pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    pcp.StateChange = fState;
    pcp.Scope = DICS_FLAG_GLOBAL;
    hDevInfoSet = SetupDiGetClassDevs(&DISK_GUID, 0, 0, DIGCF_PRESENT);
    if (hDevInfoSet == INVALID_HANDLE_VALUE)
        return false;
    DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
 
    for(int i = 0; SetupDiEnumDeviceInfo(hDevInfoSet, i, &DevInfoData); ++i)
    {
        SetupDiGetDeviceRegistryProperty(hDevInfoSet, &DevInfoData, SPDRP_COMPATIBLEIDS,
            &dwTmp, BufStr, sizeof(BufStr), 0);
        if(!strcmp((char*)BufStr, "USBSTOR\\Disk"))
        {
            if(!SetupDiSetClassInstallParams(hDevInfoSet, &DevInfoData, (SP_CLASSINSTALL_HEADER*)&pcp,
                sizeof(SP_PROPCHANGE_PARAMS)))
                return false;
            if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfoSet, &DevInfoData))
                return false;
        }
    }
    SetupDiDestroyDeviceInfoList(hDevInfoSet);
    return true;
}
 
int main()
{
    if(ChangeStateUSBDevice(DICS_DISABLE))
        MessageBeep(0);
    return 0;
}
Вроде все точно перевел. Хотя у меня есть некоторые сомнения в правильности приведения типов
Code
1
(SP_CLASSINSTALL_HEADER*)&pcp
Сам не тестировал, guid взял из твоего примера

Цитата Сообщение от Dondok Посмотреть сообщение
В С++ есть же ассемблерные вставки.
Конечно, но зачем они здесь?
1
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
21.02.2012, 08:26  [ТС]
Цитата Сообщение от vital792 Посмотреть сообщение
В С++ есть же ассемблерные вставки.
я пробовал через ассемблерные вставки. компилятор не понимает много слов, которые на ассемблере были написаны

Добавлено через 29 секунд
спасибо щас попробую реализовать
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
21.02.2012, 08:28
Цитата Сообщение от Dondok Посмотреть сообщение
компилятор не понимает много слов, которые на ассемблере были написаны
какой компилятор? От этого много зависит
0
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
21.02.2012, 13:23  [ТС]
C++ builder 2006
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2012, 13:23
Помогаю со студенческими работами здесь

Перевод с ассемблера на делфи
Ребят! очень срочно! можете перевести этот код с ассемблера на делфи вот ссылка на код: https://www.cyberforum.ru/post4770651.html ...

Небольшой кусок кода, перевод из ассемблера в СИ
Поскольку в ассемблере я полный ноль, хочу перевести следующие инструкции в СИ. Stack_Size EQU 0x00000400 ;Размер стека...

Версия ассемблера
Добрый вечер всем, столкунлся со следующей проблемой: Не могу понять, какая в точности версия ассемблера мне нужна. Вот несколько...

Команды ассемблера
Для чего нужны функции ADC (и SBB), которые учитывают флаг &lt;CF&gt; ? то есть например ADC ax, ex - эквивалентно...

Транслятор с ассемблера
Интересует такая вот тема : компиляторы с языков высокого уровня могут быть написаны на самих же языках высокого уровня. Интересно на чём...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru