2015-10-02 2 views
1

В настоящее время я изучаю сборку, и я использую ассемблер a86, Oracle VM VirtualBox. Мне интересно, почему мы объявляем или помещаем переменные таким образом (после команды перехода)? Если я объявляю или переставляю переменные перед командой перехода, программа станет ошибкой. Есть ли какие-либо объяснения позади такой структуры? Спасибо.Монтажная переменная, где поставить?

seg1 segment 
    org 100h 
    jump start 
    ; variables here (comment) 
    start: 

    mov ah, 4ch 
    int 21h 
seg1 ends 
+0

Если поместить переменные перед прыжком они будут выполнены в виде кода, и это не то, что вы хотите сделать, как правило. Таким образом, вы можете перепрыгнуть через них, или вы можете разместить их ниже кода, который выходит из вашей программы (после int 21h/ah = 4ch). В других моделях памяти вы можете разместить данные в разных сегментах, что позволит вам разделить данные и код. С org 100h я понимаю, что вы создаете программы .COM, где данные и код находятся в одном сегменте. –

+0

Что произойдет, если объявление переменной выполняется как код? – Andre

+0

Процессор будет декодировать переменные как инструкции (он не знает разницы между байтами, которые составляют переменные и байты, составляющие код, - все они являются байтами). В лучшем случае ничего (маловероятно) произойдет; худший случай сбоя и сжигания (более чем вероятно), поскольку данные могут создавать незаконные инструкции или заставлять программу зависать; или вызвать ошибку процессора. Это зависит от переменных. –

ответ

1

Основная идея состоит в том, чтобы сделать невозможным выполнение переменных в качестве кода. Не забывайте, что с точки зрения процессора данные и программы одинаковы. Если вы переходите к области переменных или если IP приходит к ней путем выполнения инструкций, CPU попытается их выполнить, но до тех пор, пока переменные, вероятно, не будут содержать никаких значимых инструкций, произойдет некоторое исключение процессора, и программа будет крушение или зависание.

Хотя, перепрыгивание через переменные не лучший способ сделать это. Вы можете с таким же успехом поместить все переменные в конце программы, и они никогда не будут выполнены. С преимуществом использовать одну команду меньше и сделать код более удобным для чтения, избегая ненужные прыжки:

seg1 segment 
    org 100h 

; code here 
    mov ah, 4ch 
    int 21h  ; this will never return, but end the program. 

; variables here will never be executed. 

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