从32位寄存器读取16位

时间:2012-03-27 19:02:36

标签: c assembly embedded arm

我正在尝试从特定寄存器中读取某些值。该手册指定我必须首先访问16位LSB访问,然后访问16位MSB访问。我是否只是一次读取所有32位,然后根据需要分别屏蔽剩余的16 msb / lsb?或者是否有办法只读16位拳头。

谢谢, 尼哥

2 个答案:

答案 0 :(得分:8)

如果手册说要首先访问16位LSB然后再访问16位MSB,请按照手册说的那样进行操作。

例如(小端):

#define REG (*(volatile uint32_t *) 0x1234)

uint16_t val_hi, val_lo;

val_lo = *((volatile uint16_t *) &REG);
val_hi = *((volatile uint16_t *) &REG + 1);

请注意,编译器有时也提供HI和LO标识符来访问LSB或MSB,例如示例中的REG

#define REGL (*(volatile uint16_t *) 0x1234)
#define REGH (*(volatile uint16_t *) 0x1236)

答案 1 :(得分:2)

目前还不清楚您使用的是哪种语言。我假设您在C中使用内联汇编。

我最熟悉NASM。使用i386的NASM语法:

mov eax, 0x12345678 ; load whatever value
mov bx, ax          ; put LSW in bx
shr eax, 16         ; shift MSW to ax
                    ; now ax = MSW, bx = LSW

我猜测气体(C)代码是这样的:

movl $0x12345678, %eax # load whatever value
movw %ax, %bx          # put LSW in bx
shrl $16, %eax         # shift MSW to ax
                       # now ax = MSW, bx = LSW