所以,我或多或少是自愿学习NASM的,我很难找到真正解释它的来源。与Java或C#不同,我不能只使用谷歌,因为程序集不再被许多人使用。我需要准备一篇关于“Assembly/NASM简介”的演讲,而不是解释代码,而是解释语言是如何工作的。包括如何粗略访问注册表,他们做什么,如何访问堆栈和存储在那里的东西。
现在,我得到了寄存器的名称是E( are )X以及其他一些寄存器,每个寄存器都有自己的功能或什么(老实说,我还没有真正理解。如果有人能进一步解释的话,我会很感激,但这对我来说并不是必要的,而且他们是由CPU“存储”/used的东西,但是后来一些消息来源正在谈论RAX,这完全把我吓了一跳。是否有
我有一个问题,我的Cortex-M0是硬故障,所以我试图调试它。我正在尝试打印当硬故障发生时被推到堆栈中的ARM核心寄存器的内容。
以下是我的基本组装代码:
__attribute__((naked)) void HardFaultVector(void) {
asm volatile(
// check LR to see whether the process stack or the main stack was being used at time of exception.
"mov r2, lr\n"
"
我试图传递多个参数,如此代码,以计算(A)^3:
diffcube:push bp
mov bp,sp
mov ax,[bp+4]
sub ax,[bp+6]
mov bp,ax
mul bp
mul bp
pop bp
ret 4
使用堆栈传递参数很容易,但是如何在MASM中的过程中返回多个值(显然,寄存器的数量总是有限的)。
我的程序在尝试将“%1”写入字符串时失败。
(gdb) info frame
Stack level 0, frame at 0xb6b3c040:
eip = 0xb7877cdf; saved eip 0xb7858eae
called by frame at 0xb6b3cc50
Arglist at 0x91a1649, args:
Locals at 0x91a1649, Previous frame's sp is 0xb6b3c040
Saved registers:
ebx at 0xb6b3c02c, ebp at 0xb6b3c038, esi at
我在附近尝试使用简单的程序集脚本,似乎找不到打印数组长度的方法。下面是最小的复制品:
let a = new Array<string>();
logging.log(a.length.toString());
不编译
ERROR TS2339: Property 'toString' does not exist on type 'i32'.
logging.log(a.length.toString());
~~~~~~~~
in assembly/main.ts(171,23)
我正在学习python,并试图了解在python中堆栈是如何工作的。我有一些疑问。我知道堆栈是如何工作的,我已经阅读了很多关于堆栈的文章和教程。我读过很多关于stackoverflow的帖子,它们都很好,但我还是有一些疑问。
到目前为止,我已经读取了函数的堆栈存储和返回值。它的工作原理是后进先出原则。
只有堆栈的第一个值将返回并存储在顶部。
所以我的问题是-假设有四个变量:
a = 9
b = 2
c = 13
d = 4
它们按函数调用值的顺序存储在堆栈中,例如:
sum = a + d
sum = b + c
a = 9
d = 4
b = 2
c = 13
它们会从上到下返回。现在我的
class Assembly {
func getThis(value: Int) -> () -> () {
var a = value
return {
a += 1
print(a)
}
}
}
let assembly = Assembly()
let first = assembly.getThis(value: 5)
first()
first()
let second = assembly.getThis(value: 0)
second()
sec
我试图在程序集中为arm64(AArch64)编写一个FIQ处理程序。到目前为止,我已经编写了一个IRQ处理程序。我只是想知道我的FIQ处理程序是否应该与我的IRQ看起来不同。
我的FIQ处理程序做了以下工作:
- Push Registers onto stack
- Read GIC Interrupt Ack Register to identify the interrupt no.
- Check if it is not spurious interrupt. If it is spurious branch to end of irq handler.
- branc
我从我的主类中调用一个方法,当满足特定条件时,该方法使用更新的参数调用自己。当我有方法调用本身时,我不需要它回到调用它的地方。换句话说,不需要有一个方法调用的“堆栈”--每个方法调用都可以代替堆栈上先前方法的调用。
为了使我的观点更清楚,当使用MIPS汇编语言时,我们使用跳转(j)和跳转和链接(jal)。我希望我的方法调用就像跳转,而不担心返回到它的调用者那里。我认为这可能会节省一些时间/提高性能。
这是我代码的相关部分:
if (temp.contains(names[index]))
{
System.out.println(names[index]);
if (index
我一直在研究编程语言是如何工作的,其中一些语言有所谓的虚拟机。我知道这是在另一种编程语言中对编程语言的某种形式的模拟,并且它的工作方式类似于使用堆栈执行编译语言的方式。我说对了吗?
有了我所说的条件,令我困惑的是,许多非编译语言允许变量具有“自由”类型系统。例如,在Python中,我可以这样写:
x = "Hello world!"
x = 2**1000
字符串和大整数是完全不相关的,并且占用不同数量的内存空间,那么如何在基于堆栈的环境中表示这些代码呢?这里到底发生了什么?X是否指向堆栈上的新位置,而旧的字符串数据未被引用?这些语言不使用堆栈吗?如果不是,它们如何在内部表示变
我知道原始值存储在堆栈中,而非原语值存储在堆中。据我所知,堆栈还包含对非原始值的引用。现在,我的疑问是,我们在哪里存储对原语的引用?例如,
int a=10;
据我所知,值10被存储在堆栈中,但我的问题是a值存储在哪里?
另外,请提供一些好的资源来学习Java中的内存管理。我在网上读了很多东西,但都不清楚。
我需要做一个ARM汇编程序,它将打印出斐波那契序列,但我不确定如何处理它。
“斐波纳契数1等于1。”
“费波纳奇数2等于1。”
诸若此类。
目前,我的代码如下所示:
B main
maxF DEFW 0
enterI DEFB "Please enter the number of fibonacci numbers to print: ",0
newline DEFB "\n",0
fibbo DEFB "Fibonacci number ",0
is DEFB " is ",0
e