如何处理寄存器周围的括号?

时间:2017-02-05 20:22:54

标签: assembly

Given the following initial register values:
r2 = 6
r3 = 55
r4 = 0
r5 = 25

Given the following memory values:
Value 0x34 at address 55
Value 0x05 at address 65
Value 0x0D at address 80
Value 0x3C at address 81
Value 0x0A at address 82
Value 0xFF at address 83

Now execute the following Nios instructions    
line 1: add r4, r3, r5
line 2: ldb r4, 1(r4)
line 3: ldb r2, -5(r4)

执行第2行后r4的值是多少?在执行第3行之后,r2的值是多少?

我是装配新手,但最好的猜测是:

我知道第1行导致r4中的值为80。

在第2行,它转到内存地址80(存储在r4中),但是括号外的“1”是什么?是开始读取数据的内存地址的偏移量吗?那么r4会是0x0D吗?

-5让我离开第3行......

请帮助解释这个问题。

1 个答案:

答案 0 :(得分:2)

从本手册:http://www-ug.eecg.toronto.edu/desl/manuals/n2cpu_nii51017.pdf

ldb / ldbio - 从内存或I / O外设加载字节

  

计算由rA和的总和指定的有效字节地址   指令的16位立即值。用于加载寄存器rB   所需的存储器字节,符号将8位值扩展为32位。   在具有数据高速缓存的Nios II处理器内核中,该指令可以   从缓存而不是从内存中检索所需的数据。

基于此,我会将您的代码解释为:

add r4, r3, r5   # r4 = r3 + r5
ldb r4, 1(r4)    # r4 = *((signed char *)r4 + 1)
ldb r2, -5(r4)   # r2 = *((signed char *)r4 - 5)

根据你的说法,第1行的r4将是55 + 25 = 80.然后第2行的r4将是0x3c(60)。然后r2将是*(60-5)= 0x34(52)。