Общая цель моего проекта — прочитать ввод с клавиатуры через MASM с использованием библиотеки Ирвина, передать этот ввод в файл C ++, а затем отобразить макет моей клавиатуры, показывающий, какая клавиша нажата. Я использую карту в C ++ для хранения кодов виртуальных клавиш, которые читает Ирвин, а также строковых представлений связанного ключа. Я не уверен, в чем проблема. Мой профессор попытался запустить подобный код, используя сборку GAS, и это сработало. Вот мои два файла:
C ++:
#include <iostream>
#include <map>
#include <inttypes.h>
#include <iterator>
#include <string>
using namespace std;
extern "C" void _asmMain();
void clearScreen();
extern "C" void populateKeyboardKeysMap();
extern "C" void startingBoard();
map<_Uint32t, string> keyboardKeys = map<_Uint32t, string>();
// Key is virtual key code (stored in dx), value is string representing key
void populateKeyboardKeysMap() {
keyboardKeys.insert(pair <_Uint32t, string>(0x001B, "| ESC |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0070, " F1 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0071, " F2 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0072, " F3 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0073, " F4 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0074, " F5 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0075, " F6 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0076, " F7 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0077, " F8 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0078, " F9 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0079, " F10 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x007A, " F11 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x007B, " F12 |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x002C, " PRTSC |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x002D, " INSERT "));
keyboardKeys.insert(pair <_Uint32t, string>(0x002E, " DELETE |\n")); // Newline for end of row
keyboardKeys.insert(pair <_Uint32t, string>(0x00C0, "| `~ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0031, " 1! |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0032, " 2@ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0033, " 3# |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0034, " 4$ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0035, " 5% |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0036, " 6^ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0037, " 7& |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0038, " 8* |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0039, " 9( |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0030, " 0) |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00BD, " -_ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00BB, " =+ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0008, " BACKSPACE |\n")); // Newline for end of row
keyboardKeys.insert(pair <_Uint32t, string>(0x0009, "| TAB |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0051, " Qq |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0057, " Ww |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0045, " Ee |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0052, " Rr |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0054, " Tt |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0059, " Yy |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0055, " Uu |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0049, " Ii |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x004F, " Oo |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0050, " Pp |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00DB, " {[ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00DD, " }] |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00DC, " |\\ \n")); // Newline for end of row
keyboardKeys.insert(pair <_Uint32t, string>(0x0014, "| CAPSLK |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x0041, " Aa |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0053, " Ss |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0044, " Dd |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0046, " Ff |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0047, " Gg |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0048, " Hh |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x004A, " Jj |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x004B, " Kk |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x004C, " Ll |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00BA, " :; |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00DE, " \"' |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x000D, " ENTER |\n")); // Newline for end of row
keyboardKeys.insert(pair <_Uint32t, string>(0x00A0, "| SHIFT |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x005A, " Zz |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0058, " Xx |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0043, " Cc |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0056, " Vv |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0042, " Bb |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x004E, " Nn |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x004D, " Mm |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00BC, " <, |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00BE, " >. |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00BF, " ?/ |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00A1, " SHIFT |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x0026, " UP |\n")); // Newline for end of row
keyboardKeys.insert(pair <_Uint32t, string>(0x00A2, "| CTRL |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(NULL, " FN |")); // Irvine won't recognize solo key press, no MSDN entry found
keyboardKeys.insert(pair <_Uint32t, string>(0x005B, " WIN |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0012, " ALT |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x0020, " SPACE |"));
//keyboardKeys.insert(pair <_Uint32t, string>(0x0012, " ALT |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x005D, " OPT |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x00A3, " CTRL |")); // Irvine won't recognize solo key press, found on MSDN
keyboardKeys.insert(pair <_Uint32t, string>(0x0025, " LEFT |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0028, " DOWN |"));
keyboardKeys.insert(pair <_Uint32t, string>(0x0027, " RIGHT |\n"));
}
int main() {
_asmMain();
}
void startingBoard() {
cout << "| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PRTSC | INSERT | DELETE |" << endl;
cout << "| `~ | 1! | 2@ | 3# | 4$ | 5% | 6^ | 7& | 8* | 9( | 0) | -_ | =+ | BACKSPACE |" << endl;
cout << "| TAB | Qq | Ww | Ee | Rr | Tt | Yy | Uu | Ii | Oo | Pp | [{ | ]} | \\| |" << endl;
cout << "| CAPSLK | Aa | Ss | Dd | Ff | Gg | Hh | Jj | Kk | Ll | ;: | '\" | ENTER |" << endl;
cout << "| SHIFT | Zz | Xx | Cc | Vv | Bb | Nn | Mm | ,< | .> | /? | SHIFT | UP |" << endl;
cout << "| CTRL | FN | WIN | ALT | SPACE | ALT | OPT | CTRL | LEFT | DOWN | RIGHT |" << endl;
}
MASM:
include Irvine32.inc
include Macros.inc
populateKeyboardKeysMap PROTO C
startingBoard PROTO C
.DATA
.CODE
_asmMain PROC
push ebp
mov ebp, esp
mWriteLn "Escape to exit"call startingBoard
call populateKeyboardKeysMap
KeyPress:
mov eax, 50
call Delay
xor eax, eax
call ReadKey
; This code will be used once populating the map works
;push ebx
;push dx
;call displayKeyboard
cmp dx, VK_ESCAPE
jne KeyPress
pop ebp
exit
_asmMain ENDP
END
Конкретная ошибка, которую я получаю:
Unhandled exception at 0x010C70B7 in finalTwo.exe: 0xC0000005: Access violation reading location 0x00000004.
Я действительно просто не знаю, что делать. Мой профессор считает, что это проблема стека. Я думаю, что это может иметь какое-то отношение к использованию глобальных переменных, потому что, когда я определяю карту внутри populateKeyboardKeysMap () вместо глобально, программа, кажется, выполняется. Я не включил функцию отображения клавиатуры с помощью карты для ясности, поэтому код, который я показываю, является неполным в том, что касается предполагаемой цели.
Задача ещё не решена.
Других решений пока нет …