Assembly 这些操作码是做什么的?
我正在学习RISC-V组装的西部数字教程。我对汇编编程比较陌生。所以我有几个澄清的问题,我似乎找不到一个真正的虚拟友好教程 这是有问题的代码 因此,我的问题是:Assembly 这些操作码是做什么的?,assembly,riscv,opcode,Assembly,Riscv,Opcode,我正在学习RISC-V组装的西部数字教程。我对汇编编程比较陌生。所以我有几个澄清的问题,我似乎找不到一个真正的虚拟友好教程 这是有问题的代码 因此,我的问题是: 12人在干什么?我认为堆栈指针在前面的指令中已经移位了16位。我通常不明白为什么在内存中向下移动16位,然后再加上12位。 另外,这个语法在x86中的含义是否与[eax+12]相同 目标操作数始终位于左侧,这是否仅适用于x0寄存器 我注意到我们根本没有使用堆栈指针,我们真的需要这么做吗?另外,sw和lw之间有什么区别?它们都被使用过,我
另外,这个语法在x86中的含义是否与
[eax+12]
相同x0
寄存器sw
和lw
之间有什么区别?它们都被使用过,我不确定它们完成了什么,也不知道为什么一个会被使用而不是另一个sw
将一个字(在本例中为值0,x0始终包含该值)从寄存器存储到内存,并且(IMO)与语法的其余部分相比,参数的顺序向后看是正确的
3) a)我们使用堆栈指针来保存和恢复返回地址,在这个本身不进行调用的小函数中不需要返回地址,但作为函数入口和出口的标准样板,它是一种有用的模式。堆栈用于存储不适合寄存器的局部变量(或者需要在堆栈上支持递归),学习如何使用它是他们在这里向您展示的内容的一部分
3 b)
sw
将寄存器中的值存储到内存中,lw
从内存加载并存储到寄存器中。在设备驱动程序中,内存位置是您与设备通信的方式-存储到内存允许您向设备提供信息(数据或控制信息),从内存加载是您从设备读取信息的方式。我假设sw是“存储字”(将寄存器的值放入内存,lw是“加载字”(从内存中获取一个值并将其放入寄存器。您调用的是移位16位(实际上只是减去值16,没有移位,也没有“位”(其字节))是一种分配。请注意,将未分配内存存储到堆栈中是一种不好的形式(例如,堆栈指针下面是未分配内存),所以通常分配优先于使用。一旦分配了一些堆栈(这里是16字节),新的可用位置处于正偏移。因此,新的SP+12位于新分配的16字节堆栈空间内;由于该空间是正式分配的,即使其他人使用堆栈,它也将保持不变。@ErikEidt但为什么要忽略4字节?这就是函数占用的空间量吗?
# SPDX-License-Identifier: Unlicense
# Copyright (c) 2018 Western Digital Corporation or its affiliates.
.section .text
.align 2
.globl setupGPIO
.include "memory_map.inc"
.include "gpio.inc"
setupGPIO:
addi sp, sp, -16 # Allocate Stack Frame
#First Question
sw ra, 12(sp) # Save return address onto the stack
li t0, GPIO_CTRL_ADDR # Load the base GPIO address
li t1, GPIO_RGB_PINS # Get the RGP Pins offset
sw t1, GPIO_OUTPUT_EN(t0) # Enable RGB pins as output pins
sw t1, GPIO_OUTPUT_XOR(t0) # Set the XOR to that the pins are Active High
#Second Question
sw x0, GPIO_OUTPUT_VAL(t0) # Set all writable GPIO pins to zero
#Third Question
lw ra, 12(sp) # Restore the return address
addi sp, sp, 16 # Deallocate stack frame
ret