汇编语言(asm)编程问题。请务必使用您正在使用的处理器和/或指令集以及汇编程序。警告:对于.NET程序集,请改用标签[.net-assembly]。对于Java ASM,请改用标签[java-bytecode-asm]。
我要回答以下关于6502汇编语言的问题: “在堆栈上,有以下值(首先是顶部元素):0x01、0x02、0x03、0x04、0x05、0x06 地址 0xc000 处是...
我是一名正在上课的学生,我在这个项目上遇到了真正的麻烦。现在,我不仅仅是在寻找答案,因为我很想了解正在发生的事情,但我...
我知道在组装时必须非常小心,即: 这样做: 移动啊,10小时 移动,00h;股息 = 1000h 移动 bl,10 小时;除数 = 10h div...
我尝试用两个不同的汇编器(其中一个是在线的,另一个是FASMARM)来汇编以下代码: lsl r1、r2、#4 lslge r1、r2、#4 生成的机器代码是(小-
我有两个返回结构的函数,一个通过复合文字返回它,另一个初始化一个变量然后返回它: 类型定义结构{ 整数存储[256]; } 数据_t; 数据_t
我知道在x86架构中,我可以在内核上下文中读取CR3寄存器 跟踪内核的页目录。 现在我正在尝试使用 SPARC 架构在 Linux 上做同样的工作。 我怎样才能...
如何使用Assembly在8051中创建2个占空比为50%的方波
我正在尝试在Proteus仿真环境中通过8051的p2.6和p2.7端口创建两个230和460Hz的方波。它还将通过 p2.0 的开关输入来改变其行为。当
在 Windows 上使用 MASM 在 x64 程序集中写入文件的问题
我尝试在 Windows 上使用 x64 程序集和 MASM 写入文件,但内容未正确写入。我在下面包含了我的代码,但我不确定问题出在哪里。我正在使用
我被告知要使用反汇编程序。 gcc 有内置的东西吗?最简单的方法是什么?
考虑compare_and_exchange_strong_explicit的定义: _Boolatomic_compare_exchange_strong_explicit( 易失性 A* obj, C* 期望,C 渴望...
我正在阅读《ARM 架构参考手册》来编写一个具有 ARM7TDMI CPU 的 Game Boy Advance 模拟器。我对ARM架构不太熟悉。手册中提到“从...
我正在为 Cortex-R5 编写一些启动代码。代码编译、链接和运行没有问题。但是,我收到以下警告。 警告:L6437W:在startup.o中重定位#REL:7(
我想知道如何单步执行运行时代码(大概是在 Visual Studio Code 中)。我不认为这个问题与 Go 的任何特定版本有关,但就上下文而言,我在 Intel Mac 上使用 1.18.3。 W...
我正在开发一个操作系统作为一种爱好,并且在处理键盘IRQ时遇到了一个奇怪的问题,我不知道为什么,但是当出现的字符串太少时,我收到了无效的操作码ISR。 ..
如何使用内联汇编将ID_AA64MMFR1_EL1寄存器的内容读取到64位变量中?
这是此答案的后续问题。 我正在尝试使用内联汇编将 ID_AA64MMFR1_EL1 寄存器的内容读入 64 位变量: #包括 #包括 这是this答案的后续问题。 我正在尝试使用内联汇编将 ID_AA64MMFR1_EL1 寄存器的内容读取到 64 位变量中: #include <stdio.h> #include <stdint.h> #include <inttypes.h> int main(void) { uint64_t foo; __asm volatile("mov %0, ID_AA64MMFR1_EL1" : "=r"(foo) ::); printf("%"PRIx64"\n", foo); } 注意:我需要读取 ID_AA64MMFR1_EL1 才能知道 AFP 字段的值。 但是,汇编器拒绝此代码: $ gcc t1b.c /tmp/ccTDGH7d.s: Assembler messages: /tmp/ccTDGH7d.s:22: Error: undefined symbol ID_AA64MMFR1_EL1 used as an immediate value 一个简单的问题:如何正确做? 如果您的程序在 EL0 上运行,您应该使用 hwcaps 中提供的 HWCAP_CPUID API - 更多详细信息,请参阅本文 ARM64 CPU 功能寄存器。请参阅此处了解工作示例代码。 mov助记符仅用于在通用和/或 FP/SIMD 寄存器(x0-x30、xzr、sp、q0-q31)之间移动,以及将立即值移动到通用寄存器中。移入和移出系统寄存器分别使用 msr 和 mrs。所以在这里你想要 mrs 而不是 mov。 请注意,从您的标头来看,您似乎是在普通用户空间 C 程序中执行此操作。在典型的操作系统上,用户空间运行在异常级别 0 (EL0)。但ID_AA64MMFR1_EL1名称上的EL1标签表明它只能在EL1及更高版本(即内核模式)下读取。所以执行这条指令会陷入陷阱。 某些操作系统可能通过模拟指令来处理陷阱。我知道 Linux 对某些功能 ID 寄存器执行此操作,但不记得这是否是其中之一。但是,在这种情况下,返回到程序的值不一定等于硬件实际返回的值。例如,操作系统可以屏蔽它不想让您知道的功能位。 在其他操作系统上(例如 MacOS,如果我没记错的话),你的程序会因 SIGILL 而死掉。 通常,操作系统会提供其他类似这样的CPU特性查询机制。例如,Linux 有 /proc/cpuinfo,MacOS 有 sysctl。
我一直认为 SP 是相对于 BP 而言的,这意味着在堆栈上压入和弹出内容将使用地址 BP - SP,其中 BP 是堆栈的开始,SP 是当前...
代码的访问次数是多少: MOV R1、R0 STR R4,[R1,#4]! LDR R3,[R1] R1-R4均为32位。 答案是五个,我真的很困惑。有人能帮我吗? 所以...
我在Qt的源代码中看到了一些x86汇编: q_atomic_increment: movl 4(%esp), %ecx 锁 包括 (%ecx) 移动 $0,%eax 塞内%al 雷特 .对齐4,0x90 .type q_atomic_increment,@
我一直在研究MIT6.828的Lab1。我对用于切换到保护模式的代码有疑问。 这是汇编代码 # 使用 bootst 从实模式切换到保护模式...
我正在读一个处理时间戳的C++函数,有一个像这样的表达式: % (60 * 60) % 60 我认为这个表达式严格等同于: 吨% 60 然而,当我进入这个