x86相关内容

寻呼到底是什么?OSDEV

我正在尝试编写自己的操作系统,到了需要设置分页的时候。我编写了一些代码,这些代码似乎可以工作,但我意识到我不理解分页是如何工作的。现在我会试着解释我是如何理解事情的,我会有几个问题! 据我所知,分页是一种将地址映射到其他地址的方式,以便每个应用程序都可以看到完整的地址空间(?)。有一种叫做页目录的东西,它存储了1024个4字节的条目,每个条目都包含指向页表的指针,页表也有1024个条目。页表的每 ..
发布时间:2022-09-06 15:37:18 其他开发

在Irvine32库中使用MASM打印数组

我的程序接受4个整数,并假定将它们显示给用户。在打印值时,我没有得到预期的结果。我正在将MASM与Kip的Irvine32 library 一起使用 我的代码是: include irvine32.inc .data msg byte "Enter a number",0 arr dword 4 dup(?) len=($-arr)/4 .code main PROC mov e ..
发布时间:2022-09-05 22:52:53 其他开发

在程序集文件内调用C++函数

这是我第一次问,所以我将在这里尽我最大的努力,但我在一项汇编任务中遇到了麻烦,在该任务中,我获得了一个.cpp文件(如下所示),并且必须创建一个包含Multiply、Square和Divide函数的.asm文件。我有一个问题,那就是在平方和乘法函数完成后,我必须调用PrintResult来显示答案。对于Divide,成功的除法返回1,不成功的除法返回0并调用PrintResult以显示失败消息。我 ..
发布时间:2022-09-05 22:45:01 C/C++开发

数组的偏移量是如何表示数组的起始地址的

考虑汇编代码-mov edi, offset newarray 据我所知,这将把newarray的地址放入寄存器edi 我不明白的是offset这个词的英文意思是什么? 适合这里。 推荐答案 x86内存地址的格式为segment:offset,其中偏移量部分位于普通(通用)寄存器中,如edi(或64位代码中的rdi)。 在我们使用平面内存模型的现代系统中,segment基数始 ..
发布时间:2022-09-05 22:29:35 其他开发

指令操作数必须具有相同大小的错误

我在数据段中定义了数组,如-myArray byte 01, 03, 02, 05 在代码中,我有一行mov eax, BYTE PTR myArray[ecx]汇编器在这里抛出一个构建错误 指令操作数的大小必须相同 这可能是什么原因呢?我该怎么解决这件事。我想循环遍历此数组并打印它的 元素 TITLE Subtract Two Nums (SubTwoNums.asm) ; Thi ..
发布时间:2022-09-05 22:15:25 其他开发

汇编语言编号:MOV AX、1 ASCII或整数

与 num db 1 mov ax,1 和mov ax, num 执行mov ax,1时是ASCII还是整数? 我的意思是,数字不是从键盘插入的,它是预定义的,它可以要求将其转换为整数吗?是ASCII吗? 推荐答案 ASCII是一种编码类型,即您应该如何解释某些数值,如“33是感叹号”... 但CPU不知道ASCII,mov al,33只是将al寄存器设置为位模 ..
发布时间:2022-09-05 21:57:37 其他开发

Visual Studio 2019-MASM-32位程序集-Hello World

我通过&MIPS汇编语言学习了汇编语言编程的概念。 我写了几个程序,像斐波那契,堆栈相关的东西等等。 现在,我要介绍用于.386指令集的下一级32位Windows程序集。 这是我已经拥有的。 .386 .model flat, stdcall .stack 4096 ExitProcess PROTO, deExitCode:DWORD .data msg db "Hello, Wo ..
发布时间:2022-09-05 21:38:58 其他开发

ZF未因汇编语言中的MUL指令而设置

我使用masm615汇编程序和TextPad作为编辑器。我正在写32位汇编语言程序。在程序中,由于mul指令,我试图设置零标志,但它不起作用。 谁能告诉我为什么eax寄存器中的结果是零,而零标志是清零的? include irvine32.inc .data .code main proc xor eax,eax call dumpreg ..
发布时间:2022-09-05 20:49:40 其他开发

当半字节之间存在借入时,为什么辅助标志为0

使用以下代码片段在EMU8086上进行测试: MOV CX, 1527H SUB CX, 44H 仿真器显示AF为0 1527 - 44 ======== 14E3 手工做减法时,我们得到7-4=3,这里没有问题。 然后2-4,然后我们不得不向下一小块借钱。因此,根据我的理解,AF应该是1。 推荐答案 AF是根据从第3位到第4位的进位(或借用)设置的。 ..
发布时间:2022-08-23 21:45:40 其他开发

在汇编中的乘法运算,如何使用2个寄存器的全部结果?

如果我的MUL bxbx包含任何值,则结果将在dx和ax之间拆分,那么我如何使用该结果? 我认为使用eax可以修复它,但不行,因为我们无法访问16个高位。 我们可以声明32位变量,但如何使用它? 推荐答案 这里有一个很好的解释: https://www.tutorialspoint.com/assembly_programming/assembly_arithmeti ..
发布时间:2022-08-23 21:22:58 其他开发

如何在循环中使用WriteHexByte显示到屏幕上?

我在启动时显示了displayChar字符。现在如何添加WriteHexBytes,然后在循环中使用WriteHexByte和WriteHexWord将其显示在屏幕上。 *WriteHexByte 需要8位寄存器 通过调用 ConvertHexNibble和使用 WriteChar *WriteHexWord 需要16位寄存器或内存 参数,并显示每个字节 通过调用WriteHexByt ..
发布时间:2022-08-23 20:08:59 其他开发

为什么奔腾汇编指令越多,花费的时间就越少?

下面是两个奔腾组装序列列表中的一个片段。我们有一个外部循环,它试图对我们的序列进行计时,并正在执行调用表以到达这些例程。因此,每次外部呼叫都是从同一位置进行的。这两个序列的不同之处在于,第一个序列比第二个序列少一条指令。 我们在两台英特尔计算机上获得的结果非常不同。 CPUID指令告知Family、Model和Step。 机器1:家庭6,型号15步进11。CPUZ报告“Intel ..
发布时间:2022-08-15 14:54:39 其他开发

Vzeroall零寄存器是否为ymm16到ymm31?

vzeroall的documentation似乎不一致。这篇散文说: 该指令将所有XMM或YMM寄存器的内容置零。 然而,下面的伪代码表示在64位模式下,只有寄存器ymm0到ymm15受到影响: IF (64-bit mode) limit ←15 ELSE limit ← 7 FOR i in 0 .. limit: simd_reg_file[i][M ..
发布时间:2022-08-15 14:48:18 其他开发

奔腾III CPU如何处理来自同一组的多个指令前缀?

英特尔x86规范规定,使用同一组中的多个指令前缀会导致未定义的行为。在实践中,奔腾III铜矿CPU在这种情况下是如何反应的?遗憾的是,我没有芯片可供测试。 推荐答案 虽然您已经知道这一点,但为了清楚起见,我将首先说明它。X86指令最多可以有4个前缀(每个前缀来自不同的组),以改变处理器对指令的解释。来自Intel IA-32 Architecture Manual, Volume 2A ..
发布时间:2022-08-15 14:45:00 其他开发

在中断处理程序中如何处理被零除?

操作系统中断处理程序应如何处理与编码错误相关的中断? 例如,我试图除以0来测试我的中断,但我的中断处理程序被调用了。但是,由于div指令没有成功执行,EIP不会更新到它之后的下一条指令,并且在使用iret从中断处理程序返回后,它会再次返回到错误的div指令。 mov ax, 3 mov dl, 0 div dl ; go back here again and aga ..
发布时间:2022-08-10 16:12:51 其他开发

如何使用C应用程序访问FreeDOS中的全部内存空间

我有一个用C编写的嵌入式应用程序,运行在486/386DX风格的处理器(http://www.dmp.com.tw/tech/vortex86dx)上的FreeDOS上。这台电脑有256MB的内存,但我似乎无法使用大部分内存。 我已经编写了一个简单的程序来调查(在一个循环中调用malloc(),直到返回空指针),虽然每个malloc()请求的大小对结果影响很小,但它总是在300kb左右。我的 ..
发布时间:2022-07-22 15:02:16 其他开发