x86相关内容
我正在尝试编写自己的操作系统,到了需要设置分页的时候。我编写了一些代码,这些代码似乎可以工作,但我意识到我不理解分页是如何工作的。现在我会试着解释我是如何理解事情的,我会有几个问题! 据我所知,分页是一种将地址映射到其他地址的方式,以便每个应用程序都可以看到完整的地址空间(?)。有一种叫做页目录的东西,它存储了1024个4字节的条目,每个条目都包含指向页表的指针,页表也有1024个条目。页表的每
..
作为ASM编程的初学者,我需要在汇编中得到2的38次方的结果,我需要您的帮助来理解为什么我的程序没有产生我需要的结果(它打印4个十进制): .386 .model flat, stdcall option casemap:none include masm32includewindows.inc include masm32includemsvcrt.inc includelib 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
..
这是我第一次问,所以我将在这里尽我最大的努力,但我在一项汇编任务中遇到了麻烦,在该任务中,我获得了一个.cpp文件(如下所示),并且必须创建一个包含Multiply、Square和Divide函数的.asm文件。我有一个问题,那就是在平方和乘法函数完成后,我必须调用PrintResult来显示答案。对于Divide,成功的除法返回1,不成功的除法返回0并调用PrintResult以显示失败消息。我
..
考虑汇编代码-mov edi, offset newarray 据我所知,这将把newarray的地址放入寄存器edi 我不明白的是offset这个词的英文意思是什么? 适合这里。 推荐答案 x86内存地址的格式为segment:offset,其中偏移量部分位于普通(通用)寄存器中,如edi(或64位代码中的rdi)。 在我们使用平面内存模型的现代系统中,segment基数始
..
我在数据段中定义了数组,如-myArray byte 01, 03, 02, 05 在代码中,我有一行mov eax, BYTE PTR myArray[ecx]汇编器在这里抛出一个构建错误 指令操作数的大小必须相同 这可能是什么原因呢?我该怎么解决这件事。我想循环遍历此数组并打印它的 元素 TITLE Subtract Two Nums (SubTwoNums.asm) ; Thi
..
x86 CPU:MSVC(2010) 在下面的代码中EXTRN _printf:PROC是什么意思?为什么在";:之后我们使用一些";PROC";指令而不是";near或";far";? CONST SEGMENT $SG3830 DB 'hello, world', 0AH, 00H CONST ENDS PUBLIC
..
与 num db 1 mov ax,1 和mov ax, num 执行mov ax,1时是ASCII还是整数? 我的意思是,数字不是从键盘插入的,它是预定义的,它可以要求将其转换为整数吗?是ASCII吗? 推荐答案 ASCII是一种编码类型,即您应该如何解释某些数值,如“33是感叹号”... 但CPU不知道ASCII,mov al,33只是将al寄存器设置为位模
..
我通过&MIPS汇编语言学习了汇编语言编程的概念。 我写了几个程序,像斐波那契,堆栈相关的东西等等。 现在,我要介绍用于.386指令集的下一级32位Windows程序集。 这是我已经拥有的。 .386 .model flat, stdcall .stack 4096 ExitProcess PROTO, deExitCode:DWORD .data msg db "Hello, Wo
..
我尝试构建此代码时遇到此错误: 1>------ Build started: Project: Project, Configuration: Debug Win32 ------ 1> Assembling [Inputs]... 1>assign2.asm(12): error A2022: instruction operands must be the same size 1>a
..
我使用masm615汇编程序和TextPad作为编辑器。我正在写32位汇编语言程序。在程序中,由于mul指令,我试图设置零标志,但它不起作用。 谁能告诉我为什么eax寄存器中的结果是零,而零标志是清零的? include irvine32.inc .data .code main proc xor eax,eax call dumpreg
..
使用以下代码片段在EMU8086上进行测试: MOV CX, 1527H SUB CX, 44H 仿真器显示AF为0 1527 - 44 ======== 14E3 手工做减法时,我们得到7-4=3,这里没有问题。 然后2-4,然后我们不得不向下一小块借钱。因此,根据我的理解,AF应该是1。 推荐答案 AF是根据从第3位到第4位的进位(或借用)设置的。
..
如果我的MUL bxbx包含任何值,则结果将在dx和ax之间拆分,那么我如何使用该结果? 我认为使用eax可以修复它,但不行,因为我们无法访问16个高位。 我们可以声明32位变量,但如何使用它? 推荐答案 这里有一个很好的解释: https://www.tutorialspoint.com/assembly_programming/assembly_arithmeti
..
我在启动时显示了displayChar字符。现在如何添加WriteHexBytes,然后在循环中使用WriteHexByte和WriteHexWord将其显示在屏幕上。 *WriteHexByte 需要8位寄存器 通过调用 ConvertHexNibble和使用 WriteChar *WriteHexWord 需要16位寄存器或内存 参数,并显示每个字节 通过调用WriteHexByt
..
下面是两个奔腾组装序列列表中的一个片段。我们有一个外部循环,它试图对我们的序列进行计时,并正在执行调用表以到达这些例程。因此,每次外部呼叫都是从同一位置进行的。这两个序列的不同之处在于,第一个序列比第二个序列少一条指令。 我们在两台英特尔计算机上获得的结果非常不同。 CPUID指令告知Family、Model和Step。 机器1:家庭6,型号15步进11。CPUZ报告“Intel
..
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
..
英特尔x86规范规定,使用同一组中的多个指令前缀会导致未定义的行为。在实践中,奔腾III铜矿CPU在这种情况下是如何反应的?遗憾的是,我没有芯片可供测试。 推荐答案 虽然您已经知道这一点,但为了清楚起见,我将首先说明它。X86指令最多可以有4个前缀(每个前缀来自不同的组),以改变处理器对指令的解释。来自Intel IA-32 Architecture Manual, Volume 2A
..
操作系统中断处理程序应如何处理与编码错误相关的中断? 例如,我试图除以0来测试我的中断,但我的中断处理程序被调用了。但是,由于div指令没有成功执行,EIP不会更新到它之后的下一条指令,并且在使用iret从中断处理程序返回后,它会再次返回到错误的div指令。 mov ax, 3 mov dl, 0 div dl ; go back here again and aga
..
我有一个用C编写的嵌入式应用程序,运行在486/386DX风格的处理器(http://www.dmp.com.tw/tech/vortex86dx)上的FreeDOS上。这台电脑有256MB的内存,但我似乎无法使用大部分内存。 我已经编写了一个简单的程序来调查(在一个循环中调用malloc(),直到返回空指针),虽然每个malloc()请求的大小对结果影响很小,但它总是在300kb左右。我的
..
所以刚才有人问了一个问题: Why do Compilers put data inside .text(code) section of the PE and ELF files and how does the CPU distinguish between data and code? 但最上面的答案是文本部分没有数据,编译器不会这样做! 但我遇到了一些二进制文件,在oll
..