我正在尝试移植以下C ++代码:
BOOL SyskeyGetClassBytes(HKEY hKeyReg,LPSTR keyName,LPSTR valueName,LPBYTE classBytes) {
HKEY hKey,hSubKey;
DWORD dwDisposition=0,classSize;
BYTE classStr[16];
LONG ret;
BOOL isSuccess = FALSE;
ret = RegCreateKeyEx(hKeyReg,keyName,0,NULL,REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE,NULL,&hKey,&dwDisposition);
if(ret!=ERROR_SUCCESS)
return FALSE;
else if(dwDisposition!=REG_OPENED_EXISTING_KEY) {
RegCloseKey(hKey);
return FALSE;
}
else {
if(RegOpenKeyEx(hKey,valueName,0,KEY_READ,&hSubKey)==ERROR_SUCCESS) {
classSize = 8+1;
ret = RegQueryInfoKey(hSubKey,(LPTSTR)classStr,&classSize,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
if((ret==ERROR_SUCCESS)&&(classSize==8)) {
classBytes[0]= (HexDigitToByte(classStr[0]) << 4) | HexDigitToByte(classStr[1]);
classBytes[1]= (HexDigitToByte(classStr[2]) << 4) | HexDigitToByte(classStr[3]);
classBytes[2]= (HexDigitToByte(classStr[4]) << 4) | HexDigitToByte(classStr[5]);
classBytes[3]= (HexDigitToByte(classStr[6]) << 4) | HexDigitToByte(classStr[7]);
isSuccess = TRUE;
}
RegCloseKey(hSubKey);
}
RegCloseKey(hKey);
}
return isSuccess; …Run Code Online (Sandbox Code Playgroud) 在x86上以保护模式触发中断时,是否可以找出触发的中断号?例如,假设我调用了int 0xFF.在处理程序中我可以找到int 0xFF被调用?
基本上我需要知道从C函数返回时寄存器void*指针的位置.我有这个代码:
void* kmalloc(unsigned int size)
{
asm("mov %[size], %%esi"
: /* no outputs */
: [size] "m" (size)
: "esi");
asm("movl $9, %eax");
asm("int $0x80");
}
Run Code Online (Sandbox Code Playgroud)
应该将地址放入EAX.我认为C中的返回值存储在EAX中,但显然不是,(哦,我正在使用GCC BTW).我需要一些如何返回EAX,寄存器int将无法工作,因为编译器设置.是否有用于返回指针的寄存器?或者它是否像被推入堆栈或什么?
我正在编写一个程序,其中一个数字(一个10位数字)存储在一个16位数字的第一部分,然后一个6位数字存储在最后.
如何利用位移来实现我的目标?
如何从32位保护模式(显然是x86)中查看PIT IRQ处理程序的返回值?我想我可以这样做,我不完全确定.
pop eax ; pop last thing from stack
mov dword return_address,eax
push eax
iret
Run Code Online (Sandbox Code Playgroud) 好吧,我正在为我正在开发的操作系统编写一个汇编程序。它进展顺利,我已经掌握了所有 mov 指令,现在我想实现 call 和 jmp 等指令。我确实没有好的文档,所以我正在查看 NASM 生成的机器代码来查找操作码等。我想看看调用的操作码是什么,所以我编译了一些以标签开头的代码。我预计调用操作码后的地址是 00 00 00 00,但它是 FB FF FF FF。我认为这与符号有关,因此我使用 call 0x000000 编译代码以查看发生了什么,并且地址完全相同(0xFBFFFFFF)。有人可以向我解释一下吗,我很困惑。
我正在为它制作一个虚拟机和一个C编译器.我没有得到的是大多数指令集有IMUL和IDIV但不是ISUB和IADD.由于sub通常是unsigned sub,我怎么能像x86那样做
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
Run Code Online (Sandbox Code Playgroud)
得到-2?
我正在为我编写的聊天服务器程序编写客户端,该程序使用richTextBox控件来显示用户文本.一切都有效,除了我用于服务器motd的一些ASCII艺术.运行它时,我的文本显示如下.如您所见,间距似乎有问题.

现在,如果我使用完全相同的字体在记事本中输入它,我就会得到这个.为什么richTextBox不显示相同的结果?我真的很困惑.....

编辑:问题是由服务器发送的RTF引起的.如何在RTF中添加额外空间?