Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 这些操作码是做什么的?_Assembly_Riscv_Opcode - Fatal编程技术网

Assembly 这些操作码是做什么的?

Assembly 这些操作码是做什么的?,assembly,riscv,opcode,Assembly,Riscv,Opcode,我正在学习RISC-V组装的西部数字教程。我对汇编编程比较陌生。所以我有几个澄清的问题,我似乎找不到一个真正的虚拟友好教程 这是有问题的代码 因此,我的问题是: 12人在干什么?我认为堆栈指针在前面的指令中已经移位了16位。我通常不明白为什么在内存中向下移动16位,然后再加上12位。 另外,这个语法在x86中的含义是否与[eax+12]相同 目标操作数始终位于左侧,这是否仅适用于x0寄存器 我注意到我们根本没有使用堆栈指针,我们真的需要这么做吗?另外,sw和lw之间有什么区别?它们都被使用过,我

我正在学习RISC-V组装的西部数字教程。我对汇编编程比较陌生。所以我有几个澄清的问题,我似乎找不到一个真正的虚拟友好教程

这是有问题的代码

因此,我的问题是:

  • 12人在干什么?我认为堆栈指针在前面的指令中已经移位了16位。我通常不明白为什么在内存中向下移动16位,然后再加上12位。
    另外,这个语法在x86中的含义是否与
    [eax+12]
    相同

  • 目标操作数始终位于左侧,这是否仅适用于
    x0
    寄存器

  • 我注意到我们根本没有使用堆栈指针,我们真的需要这么做吗?另外,
    sw
    lw
    之间有什么区别?它们都被使用过,我不确定它们完成了什么,也不知道为什么一个会被使用而不是另一个

  • 1) 从堆栈指针中减去16将在堆栈上为当前帧保留空间。为了将内容存储到该保留空间中,需要向递减的堆栈指针添加偏移量(在本例中为12)

    2)
    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