2015-05-31 4 views
3

Я underdstand, что это очень глупо вопрос, которого, но я не могу понять ответ на какое-то время
Как правильно объявить и определить «переменные» в ГАС AT & T ассемблере?
Например, я хочу буфер для 5 байтов, две 1-байтовые переменные (первоначально с 0 значением), 2-байтная переменная с 0 и 2-байтовой переменной с 10.
Этот код не работает правильно, не менее отладчик говорит (в первой строке программы, после этих объявлений, всего nop инструкция), что b и c - большие цифры вместо нулей.Определение «переменные» на языке ассемблера

.bss 
    .lcomm r, 5 

.data 
    a: .byte 0 
    b: .byte 0 
    c: .word 0 
    d: .word 10 
+1

Кажется, это хорошо для меня. Возможно, ваш отладчик читает 'b' и' c' как 'dwords', и в этом случае' b' и 'c' могут быть' 0x0a0000' и ​​'0x0a00' или больше. – user35443

+0

Или, может быть, отладчик показывает адреса, а не значения. Вы не показывали, что вы делали в отладчике, и какой из них вы используете, но для печати 'a' вы можете использовать' x/b & a' в 'gdb'. – Jester

+1

Вот как вы определяете переменные в сборке GAS. Возможно, ваш отладчик не знает, что 'b' и' c' должны быть 8-битными и 16-разрядными. Отладочная информация, сгенерированная ассемблерами, не так хороша, как сгенерированная компиляторами. –

ответ

3

Вот то, что вы видите в окне "Часы":

a = 0 = 0x00 = 0x0000 = 0x00 0000 = 0x0000 0000 

b = 167772160 = 16777216 * 10 = 0x1000000 * 0x0A = 0xA000000 

c = 655360 = 65536 * 10 = 0x10000 * 0x0A = 0xA0000 

d = 10 = 0x0A = 0x0000 000A 

Что это значит? Это означает, что ваш компилятор выполнил свою работу, но ваш отладчик читает c и b как двойные слова (4 байта) вместо байтов.

Когда он читает в b, он считывает его значение 0x00, c в значении 0x0000 и d в значении 0x0A на вершине вместе, что делает его 0xA000000.

Аналогичная вещь имеет значение c. a повезло, так как следующие 4 байта равны нулю, поэтому a действительно равен нулю.

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

+0

Спасибо. Но что я могу сделать сейчас? Я не могу использовать отладчик для адекватного просмотра моих переменных? –

+0

@Construct Я не очень хорошо знаком с 'kdbg', для него могут быть некоторые настройки. Если вы смогли получить доступ (возможно, лежащий в основе) 'gdb' через какой-либо интерфейс или напрямую использовать gdb, ваша проблема будет решена. Вы все же можете попытаться скомпилировать с 'as -g',' as -g3' или 'as -ggdb', а затем загрузить, так что будет некоторая дополнительная информация для отладки, присутствующая для' kdbg'. – user35443

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