The overall purpose of my project is to read keyboard input via MASM using Irvine's library, passing that input to a C++ file, and then display a mock-up of my keyboard showing which key is being pressed. I'm using a map in C++ to hold the virtual key codes that Irvine reads, as well as string representations of the associated key. I'm not sure what the issue is. My professor tried running similar code using GAS assembly and that worked. Here are my two files:
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
The specific error I get is:
Unhandled exception at 0x010C70B7 in finalTwo.exe: 0xC0000005: Access violation reading location 0x00000004.
I really just have no idea what to do. My professor believes it's a stack issue. I think it may have something do with using global variables because when I define the map inside populateKeyboardKeysMap() instead of globally, the program seems to execute. I have not included the function to display the keyboard using the map for the sake of clarity, which is why the code I'm showing is incomplete as far as the intended purpose is concerned.
User contributions licensed under CC BY-SA 3.0