Articles of x86

如何在NASM中添加两个数字,整数和浮点数?

我有这个代码是假设添加两个数字,一个浮点数(3.25)和一个整数(2)。 编辑: extern _printf, _scanf global _main section .bss num1: resb 4 section .data format_num: db "%f", 10, 0 section .text _main: mov dword [num1], __float32__(3.25) add num1, 2 sub esp, 8 fld dword [num1] mov dword [num1], eax fstp qword [esp] push format_num call _printf add esp, 12 ret 我得到的输出是: test.asm:11:错误:操作码和操作数无效组合 我期望的结果是: 5.250000

全局描述符表和局部描述符表

我想知道全局描述符表是驻留在每个进程内存空间还是在所有进程之间共享。 LDT呢? LDTR存储在哪里? 谢谢。

如何在同一个系统上发送nmi

我需要发送一个nmi在我正在工作的系统上。 我想testing一些我已经实现的东西。 有没有任何Windows驱动程序,使我们能够做到这一点? 我想我可以使用__outword写入一个端口。 有没有其他办法可以做到这一点? 我还有一个问题。 是否有导致NMI的具体情况? (但是,我不希望系统蓝屏或三重故障。) 谢谢

Windows x64平台上的inline asm中的libsoxr不能编译

我正在尝试编译libsoxr (它是由Audacity团队的libsox库派生的)库。 我可以编译osx 32,osx 64和win32。 他们使用内联asm和Windows x64平台不支持内联asm。 有问题的代码片是这样的: #if HAVE_FENV_H #include <fenv.h> #elif defined _MSC_VER #define FE_INVALID 1 #define FE_DIVBYZERO 4 #define FE_OVERFLOW 8 #define FE_UNDERFLOW 16 #define FE_INEXACT 32 #define FE_ALL_EXCEPT (FE_INEXACT|FE_DIVBYZERO|FE_UNDERFLOW|FE_OVERFLOW|FE_INVALID) static __inline int fetestexcept(int excepts) { short status_word; __asm fnstsw status_word return status_word & excepts & FE_ALL_EXCEPT; } static __inline int feclearexcept(int […]

当processHandle = -1时,这个OpenProcessToken做什么?

我明白这是什么,但是这意味着ProcessHandle设置为-1如下所示? .text:004011D2 83 EC 20 sub esp, 20h .text:004011D5 8D 04 24 lea eax, [esp+20h+TokenHandle] .text:004011D8 50 push eax ; TokenHandle .text:004011D9 6A 28 push 28h ; DesiredAccess .text:004011DB 6A FF push 0FFFFFFFFh ; ProcessHandle .text:004011DD E8 96 04 00 00 call OpenProcessToken

汇编和多核心之间的关系是什么?

这很难说/问,所以请忍受我: 当我们看到程序集的输出时,这是在CPU的核心上执行的。 但是,如果一个CPU有多个核心 – 是在同一个核心上执行的所有程序集? 同一个程序的程序集在什么时候开始在不同的内核上执行? 所以,如果我有(伪装): ADD x, y, z SUB p, x, q 我怎么知道ADD和SUB是否会在同一个内核上执行? 这与亲和力有关吗? 我认为亲和力只把一个进程固定在一个CPU上,而不是一个核心? 我在问这个问题是因为我想试着去了解是否可以合理预测是否在同一个内核上执行连续的汇编指令,以及是否可以控制它们只在同一个内核上执行。 我想了解如何决定是否将相同的程序代码从一个内核更改为不同的内核? 如果程序集可以改变从CPUA Core1到Core2的执行(即使使用亲和性),QPI链接速度是否会生效,以及高速caching是否在不同的CPU内核之间共享?

你可以直接在Windows中调用任务吗?

我明白,在x86处理器中,您可以通过执行引用TSS描述符的call或jmp来直接调用任务。 但是我从来没有听说过在Windows中以这种方式直接调用一个不同的进程。 这是处理器隐藏/未被操作系统使用的function吗?

ld MinGW链接到标准的C库

我有以下代码的问题。 extern printf global _main main: push msg call printf ret msg db "Hello world",0 我使用nasm -fwin32 test.asm与NASM进行汇编,然后使用ld test.obj将其链接起来。 它告诉我“ test.obj:test.asm:(text+0x6): undefined reference to 'printf' ” 如何将我的文件链接到标准C库? 我有最新的MinGW。

Windows强制执行READ-ONLY .text部分,甚至因此被ld链接器禁用

在下面的玩具程序中,我在.text部分声明了一个variables并写入它,由于.text部分被标记为READ-ONLY,所以给出了分段错误: Breakpoint 1, 0x00401000 in start () (gdb) disassemble Dump of assembler code for function start: => 0x00401000 <+0>: movl $0x2,0x40100a End of assembler dump. (gdb) stepi Program received signal SIGSEGV, Segmentation fault. 0x00401000 in start () (gdb) 这里是objdump输出: test.exe: file format pei-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000001f […]

汇编程序和过程调用的问题

我正在使用MASM来做一些汇编编程。 当我尝试运行我的程序时,即使遇到“调用myFunction”时也会立即崩溃,即使我已经从程序中删除了所有代码。 这是我的代码任何帮助将不胜感激。 .486 .model flat .stack 100h ExitProcess PROTO NEAR32 stdcall, dExitCode:DWORD .code _start: call myFunction INVOKE ExitProcess,0 PUBLIC _start myFunction proc near32 myFunction endp END