Это правильная сборка? - PullRequest
1 голос
/ 04 июня 2011

Могу ли я обработать такой массив в сборке?

db a 10,20,30,40,50

и затем скажите:

mov si,0

и затем обратиться к элементу, подобному этому

mov AX,a[si]

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Технически, да, но было бы более эффективно написать

mov si, offset a
mov ax, [si]

Еще одна вещь: a определяется как массив байтов.И ax - это 16-битный регистр.Таким образом, mov ax,[si] заставит ax содержать первые два байта a (то есть al=10, ah=20).

То, что вы, вероятно, хотите, это

 mov al, [si]

или

 mov al, a[si]
1 голос
/ 04 июня 2011

Да, это разрешено / поддерживается.

У @ elder_george есть хотя бы правильные вещи: вы чаще хотите поместить адрес в регистр, а не кодировать его в инструкции. В довольно типичном случае, когда вы проходите массив, вы можете захотеть что-то вроде:

    mov bx, offset a
    xor si, si
next_char:
    mov al, bx[si]
    ; process al
    inc si
    cmp si, 5
    jle next_char

Однако, если это возможно, часто более удобно обрабатывать данные с конца до начала:

    mov bx, offset a
    mov si, 5
next_char:
    mov al, bx[si]
    ; process al
    dec si
    jnz next_char

Или вы можете поменять ролями базы и индекса для другой (в настоящее время в основном устаревшей) оптимизации:

    mov esi, offset a
    mov ecx, 5
next_char:
    mov al, esi[ecx]
    ; process al
    loop next_char

Вы можете сделать этот конкретный трюк только с 32-битными регистрами - ecx может действовать как «базовый» регистр, но cx не может (и цикл только работает с [e] cx. И наоборот, bx и bp могут действовать как базовые регистры, но loop не будет работать с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...