Вопрос сборки x86 - PullRequest
       7

Вопрос сборки x86

2 голосов
/ 03 мая 2010

Это моя программа сборки, которая является просто функцией подкачки * x * y. Таким образом, первый аргумент из main - это адрес x, который находится в 8(%ebp), а второй - адрес y, который находится в 12(%ebp). Программа меняет местами x и y. Мне нужно 7 строк для этого. Вы можете сделать это 6 строк и есть условие, что вы можете использовать только регистры %eax, %ecx и %edx 3. Я так много думаю об этом, но не могу сделать это 6 строк. Должен быть способ, не так ли? Это может быть не так уж важно, но если есть способ получить его в 6 строк, я хочу знать.

movl 8(%ebp), %eax
movl (%eax), %ecx
movl 12(%ebp), %edx
movl (%edx), %eax
movl %ecx, (%edx)
movl 8(%ebp), %ecx
movl %eax, (%ecx)

Ответы [ 4 ]

2 голосов
/ 03 мая 2010

Какой ассемблер вы используете и на какой процессор нацеливаетесь?

Если вы используете MASM, вы можете добавить смещение в регистр, например:

mov eax, ebp - 12
mov ecx, ebp - 8
mov ebp - 12, ecx
mov ebp - 8, eax

В качестве альтернативы вы можете использовать инструкцию xchg и сделать это в 3 строки:

mov eax, ebp - 12
xchg ebp - 8, eax
xchg ebp - 12, eax

Это кажется таким простым, что, может быть, я что-то упустил?

1 голос
/ 03 мая 2010

Синтаксис Motorola на самом деле не моя вещь, но вот пример из 5 инструкций:

movl 8(%ebp), %eax
movl (%eax), %ecx
movl 12(%ebp), %edx
xchg (%edx), %ecx
movl %ecx, (%eax)

См. Комментарий Паскаля о том, что короче, может быть, медленнее. xchg %reg,(mem), скорее всего, будет медленнее, чем перезагрузка адресов из-за неявного префикса lock.

1 голос
/ 03 мая 2010

Может быть, вы можете использовать трюк своп xor:

http://en.wikipedia.org/wiki/Xor_swap

0 голосов
/ 07 мая 2010

Я понял !! это основано на трюке свопа XOR. но что-то другое ^^; ответ

movl    8(%ebp), %eax 
movl    (%eax), %ecx 
movl    12(%ebp), %edx 
xorl    (%edx), %ecx
xorl    %ecx, (%eax) 
xorl    %ecx, (%edx) 

так продолжайте использовать один доступ к памяти. потому что в x86 источник и назначение оба не могут получить доступ к памяти с помощью инструкции. только один может быть использован в каждой инструкции. так что я использую вот так.

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