Чтение в 16 бит из 32-битного регистра - PullRequest
5 голосов
/ 27 марта 2012

Я пытаюсь прочитать определенные значения из определенного регистра.В руководстве указано, что сначала я должен получить доступ к 16-битному LSB, а затем к 16-битному MSB.Должен ли я просто читать все 32 бита одновременно, а затем маскировать оставшиеся 16 мсб / фунт соответственно при необходимости?Или был бы способ прочитать только 16-битный кулак.

Спасибо, Neco

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Если в руководстве сказано, что сначала нужно получить доступ к 16-разрядному LSB, а затем к 16-разрядному MSB, сделайте, как сказано в руководстве.

Например (little-endian):

#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)
2 голосов
/ 27 марта 2012

Неясно, какой язык вы используете для этого. Я предполагаю, что вы используете встроенную сборку в C.

Я наиболее знаком с NASM. Использование синтаксиса NASM для i386:

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
...