2014-11-16 2 views
1

У меня проблема с определением «ячейка памяти». В соответствии с «Руководством разработчика программного обеспечения Intel 64 и IA-32» многие инструкции могут использовать расположение памяти в качестве операнда. Например MOVBE (перемещение данных после замены байт):
Инструкция: MOVBE m32, r32asm использование операндов местоположения памяти

Теперь вопрос, как определяется область памяти; Я пытался использовать переменные, определенные в разделе .bss:

section .bss 
    memory: resb 4   ;reserve 4 byte 
    memorylen: equ $-memory 

section .text 
global _start 

_start: 
    MOV R9D, 0x6162630A 
    MOV [memory], R9D 
    SHR [memory], 1 
    MOVBE [memory], R9D 

EDIT: ->

MOV EAX, 0x01 
    MOV EBX, 0x00 
    int 0x80 

< -Edit
Если SHR закомментирована Yasm (Yasm -f elf64 .asm) компилируется без проблем, но при выполнении stdio показывает: Нелегальная инструкция
И если MOVBE закомментирован, возникает ошибка при компиляции: Ошибка : недопустимый размер для операнда 1

Как мне выделить память для использования опции «m», указанной ссылкой на набор инструкций?
[CPU = x64, Compiler = yasm]

+0

@CraigAnderson низких 32 бит 'R9'. – Jester

+0

Спасибо @Jester. FYI для всех остальных - я спросил, что такое R9D, но потом удалил. –

ответ

2

Если это все ваш код, вы падаете в конце в неинициализированную область, так что вы получите ошибку. Это не имеет ничего общего с распределением памяти, которое вы сделали правильно. Вам нужно добавить код для завершения вашей программы с помощью системного вызова выхода или, по крайней мере, положить бесконечный цикл, чтобы избежать ошибки (убейте свою программу с помощью ctrl+c или ее эквивалента).

Обновление: Несмотря на то, что приведенное выше верно, illegal instruction здесь, скорее всего, вызвано тем фактом, что ваш процессор просто не поддерживает инструкцию MOVBE, потому что не все это делает. Если вы посмотрите в ссылке, вы увидите, что она написана: #UD If CPUID.01H:ECX.MOVBE[bit 22] = 0. Это пытается сказать вам, что бит определенного флага в регистре ECX, возвращенный листом 01 инструкции CPUID, показывает поддержку этой инструкции. Если вы находитесь на Linux, вы можете легко проверить /proc/cpuinfo, есть ли у вас флаг movbe или нет.

Что касается недействительного размера операнда: обычно вы должны указывать размер операнда, если он не может быть выведен из инструкции. При этом SHR принимает все размеры (байт, слово, dword, qword), поэтому вы действительно не должны получать эту ошибку вообще, но вы можете получить операцию с непредвиденным размером по умолчанию. Вы должны использовать SHR dword [memory], 1 в этом случае, и это также делает yasm счастливым.

О, и 1 для прочтения руководства Intel;)

+0

Я забыл скопировать возвращаемую часть, но она существует в компилированном коде - извините за это. Я немедленно обновлю код. Указание размера делает трюк для SHR. Спасибо за помощь! Вы также знаете, почему MOVBE обнаруживает незаконную инструкцию? – michi099

+0

Да, см. Обновление. – Jester

+0

Вау - Спасибо за эту быструю помощь. Этот форум невероятен. Как вы описали, нет флаг> movbe <. – michi099

 Смежные вопросы

  • Нет связанных вопросов^_^