Перемещение регистра в индекс массива на ассемблере x86

Я пытаюсь переместить регистр bl в массив байтов на языке ассемблера x86, но следующий оператор выдает сообщение об ошибке от ассемблера masm.

mov arr[2], bl производит вывод 1>p4.asm(48): error A2101: cannot add two relocatable labels.

Можно ли переместить регистр в массив на ассемблере x86?


person Anderson Green    schedule 26.03.2013    source источник
comment
Я провел несколько дней в поисках ответа на этот вопрос, но ответов пока не нашел.   -  person Anderson Green    schedule 26.03.2013
comment
bx - это 16-битный регистр, который больше байта, если вам нужен только байт, содержащийся в bx, вам нужно получить доступ к bl его младшей 8-битной части.   -  person Seki    schedule 26.03.2013
comment
@Seki Сейчас я исправил эту часть, но я все еще пытаюсь выяснить, как переместить регистр в определенный индекс массива.   -  person Anderson Green    schedule 26.03.2013


Ответы (2)


В основном то, что следующее должно работать для жестко закодированного значения индекса:

mov byte ptr [arr + 2], bl  ;store bl

[] необязательны: непонятные скобки в MASM32

Для более общего способа:

mov si, 2                ;your index
mov al, bl               ;bl = byte value from your question
mov bx, offset arr
mov byte ptr [bx+si], al
person Seki    schedule 26.03.2013
comment
mov byte ptr [ax], bl выдает эту ошибку: 1>p4.asm(54): error A2031: must be index or base register - person Anderson Green; 26.03.2013
comment
извините, хотя я могу довольно легко читать ассемблер, я немного заржавел, чтобы писать что-то самому. Я забыл, что mov byte ptr должен использовать базовый (bx/bp) или индексный (si/di) регистр. Смотрите мое обновление. - person Seki; 26.03.2013

Если мы используем инструкцию с непосредственным операндом, то мы должны указать, сколько байтов получит наш операнд. Поэтому мы должны использовать ключевое слово, такое как byte, word или dword, чтобы сообщить ассемблеру, сколько следующих байтов в оперативной памяти мы хотим получить доступ.

mov byte ptr[bx+si], 01h
mov word ptr[bx+si], 0001h
mov dword ptr[bx+si], 00000001h

Но если мы используем регистр в качестве операнда (при этом он известен среди байтов), то нам не нужно его указывать (для того, чтобы листинг стал меньше с более легким обзором).

mov [bx+si], al
mov al, [bx+si]

mov [bx+si], ax
mov ax, [bx+si]

Исключение с MASM и регистром DWORD в качестве операнда.

mov dword ptr[bx+si], eax
mov eax, dword ptr[bx+si]

Кортик

person Dirk Wolfgang Glomp    schedule 17.04.2013