assembly相关内容
下面是两个奔腾组装序列列表中的一个片段。我们有一个外部循环,它试图对我们的序列进行计时,并正在执行调用表以到达这些例程。因此,每次外部呼叫都是从同一位置进行的。这两个序列的不同之处在于,第一个序列比第二个序列少一条指令。 我们在两台英特尔计算机上获得的结果非常不同。 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
..
我知道无符号Long存储在eax/edX中,但我想知道如何才能知道执行一条rdtsc指令需要多少个时钟周期? 编辑:这样的东西能用吗? .lobl rdtsc rdtsc: rdtsc 移动%eax,%ecx 移动%edX,%eBX rdtsc subl%ecx,%eax subl%eBX,%edX 退回 推荐答案 您的代码看
..
我使用的是Windows 10,安装了Cygwin。我一直在使用Cygwin编译/汇编c语言程序和使用Cygwin安装的“GCC”和“NASM”汇编程序。据我所知,NASM有一个-f win64模式,所以它可以汇编64位程序。现在,对于Windows上的x64汇编编程,YouTube似乎缺乏教程。YouTube上的大多数汇编编程教程要么适用于x64 Linux,要么适用于x32 Windows,我
..
我一直在为Linux用NASM编写一个程序。我希望能够从我为SIGFPE建立的信号处理程序中返回到正常的代码路径。精简后的示例代码为: section .text global _start _start: ; --- Enter the program --- mov ebx,8 ; Load the signal to h
..
我对指令大小和可寻址空间感到有点困惑(我假设指令大小应该与地址位的大小相同。我没有在我的书中找到足够的解释)如果我是正确的,那么在理论上,如果我们在32位体系结构(RISC风格)中有2^32个可寻址单元(字节)的内存,那么4字节大小的加载指令如何保存操作码和地址? 推荐答案 您假设一条指令可以对来自任意绝对地址的加载进行编码。在x86上也是如此,即使在64位模式下也是如此(但有一个特殊
..
操作系统中断处理程序应如何处理与编码错误相关的中断? 例如,我试图除以0来测试我的中断,但我的中断处理程序被调用了。但是,由于div指令没有成功执行,EIP不会更新到它之后的下一条指令,并且在使用iret从中断处理程序返回后,它会再次返回到错误的div指令。 mov ax, 3 mov dl, 0 div dl ; go back here again and aga
..
我正在编写一个程序,它从用户那里获取一个整数,然后输出它的二进制等价物中有多少个1。因此,首先我认为我需要将其转换为二进制,然后使用循环并检查所有32位,以确定有多少个1。 我已经浏览了几个小时,尝试了不同的方法来首先将整数转换为二进制。做这件事最好的方法是什么?有没有办法直接以二进制格式读取寄存器值,或者我需要先转换它?这是我到目前为止拥有的所有代码。 .data EnterIn
..
例如在此代码中: #display message li $v0, 4 la $a0, Message #promt user to enter name li $v0, 8 la $10, username li $a1, 20 syscall #display the name li $v0, 4 la $a0, userName syscall 我很困惑li(立即加载)和l
..
我目前正在尝试实现一个递归函数来计算以MIPS为单位的字符串长度。这是我现在掌握的代码。我正在努力弄清楚基本情况以及如何让它返回字符串长度。我觉得我非常接近,因为当我单步执行程序时,它会正确地计算并存储输入的字符串的长度。如有任何帮助,我们不胜感激: .text #.align 2 main: la $a0, input #load string for user input li $v
..
我正在尝试执行一个非常简单的程序,但不断收到错误:Invalid language element lw $t0, 0($a0) #load integer from $a0->$t0 beq $t0, 1, 1dimensional #branch if $t0=1 1dimensional: do something 我不明白为什么会出现此错误。
..
这是我第一次使用汇编,我正在尝试实现一个链表。 每个节点有两个字--第一个是节点的值,第二个是列表中下一个节点的地址。对于最后一个节点,NEXT为零。 列表的底部是包含第一个节点地址的单词,如果列表为空,则为0。 我正在尝试实现函数&Add Item&Quot;,其中第一个参数($a0)是列表基址的地址,$a1是存储我想要添加到列表中的值的地址。 为此,我尝试遍历列表并查找最后一项,因此将其
..
在学习汇编的过程中,我有一个问题 如果我执行以下操作: la $a1, 0x3f 数字63已加载到A1中。 如果我使用不带前导0x的常量,它是十进制的,结果相同: la $a1, 63 但我如何处理二进制文件?让我们说 la $a1, 00111111 MIPS如何理解00111111是二进制数字63? 推荐答案 通常不支持二进制文字常
..
我对堆栈段(Ss)和堆栈指针(Sp)寄存器有一点困惑。 当堆栈为空时,sp值是否等于ss值? 我读到,当我们把一个字(2字节)压入堆栈时,sp递减2,如果第一个语句为真(sp=ss),那么我可以说如果堆栈不为空,堆栈指针的值总是小于或等于堆栈段的值这是真的吗?? 如果我们将一个值影响到sp,使其大于ss,会发生什么??即: MOV SS,200小时 移动SP,400h MOV AX,1010h 推
..
这个小程序只打印在外壳中编写的2个argv。 .global main main: ldr r2, [r1,#8] ldr r1, [r1,#4] ldr r0, =message_format bl printf mov r0, #0 message_format: .asciz "argv: %s %s " 我希望它以0代码退出,
..
if ($t4 >= $5) $t8 = $t8+1 给出该伪代码,我根据各种来源进行了这一尝试。看似简单,但我仍在学习基础知识。不太确定这是否正确。 slt $t1, $t5, $t4 beq $t0, $zero, endLoop addi $8, $8, 1 主引用:Greater than, less than equal, greater than equal in
..
在VGA图形模式中,不会显示光标,但BIOS会跟踪其位置。对于每个可用的显示页面,BIOS将光标的列和行坐标(当然不是X和Y坐标)记录在光标保存区中,16字节从线性地址0450h开始。有趣的事实:BIOS还不必要地更新CRT控制器寄存器光标位置高和光标位置低。 从一开始,在图形屏幕上运行的应用程序就必须创建自己的光标,因此我完全意识到我也必须提供自己的光标。 但有一个小故障。显然,DO
..
我对在FreeDOS上用C编程感兴趣,同时在这个过程中学习了一些基本的ASM,使用FreeDOS会允许我的程序访问超过标准640K的内存吗? 其次,关于ASM,我知道在现代处理器上,由于CPU体系结构的复杂性,很难在汇编语言上编程,但使用FreeDOS是否会限制我使用可能更简单的16位指令集? 推荐答案 在没有任何扩展器的情况下,程序在DOS下最多可以使用640KB的低内存。但每
..
在Intel 32位体系结构中,我可以使用MODR/M字节使用32位地址位置进行调用。根据英特尔手册,操作码扩展需要/2(010B),MOD需要00B,101B允许32位位移。 如果我想在64位体系结构中进行远调用,以便有空间容纳64位地址,我知道我可以/3(011B)用于操作码扩展。然而,仍然只提供32位位移。是否可以将目标指定为64位地址? 我主要想知道如何在给定该位置的64位地址的情
..