2013-09-11 1 views
0

У меня есть ниже код сборки:Невозможно получить значение, хранящееся в памяти с помощью режима косвенной адресации

indirect1.s

.section .data 
t1: 
.long 5 
.section .text 
.globl _start 
_start: 
movl $t1, %ecx   #we are passing the address to %ecx 
movl $5, %eax   #we are passing value 5 to %eax 
movl (%ecx), %ebx #Using indirect addressing mode we are getting the value from t1 and passing it to ebx 
addl %eax, %ebx  # add the values in %eax, %ebx and store it in %ebx 
movl $1, %eax  # call exit program 
int $0x80  # Call Master Bruce Wayne 

, когда вышеуказанная программа запускается, я получаю значение 10 в качестве ожидаемый

[[email protected] asm-32]$ as indirect1.s -gstabs+ -o indirect1.o 
[[email protected] asm-32]$ ld indirect1.o -o indirect1 
[[email protected] asm-32]$ ./indirect1 
[[email protected] asm-32]$ echo $? 
10 

Модифицированный вышеуказанную программу ликвидации% ECX реестра:

indirect2.s

.section .data 
t1: 
.long 5 
.section .text 
.globl _start 
_start: 
    movl $t1, %ebx  # we are passing the address to %ebx 
    movl $5, %eax  # we are passing value 5 to %eax 
    addl %eax, (%ebx) # add the values in %eax, %ebx and store it in %ebx 
    movl $1, %eax  # call exit program 
    int $0x80  # Call Master Bruce Wayne 

Когда я запускаю выше программы, я не получаю ожидаемый результат, то есть 10 и я, кажется, получить адрес хранится в% EBX

[[email protected] asm-32]$ as indirect2.s -gstabs+ -o indirect2.o 
[[email protected] asm-32]$ ld indirect2.o -o indirect2 
[[email protected] asm-32]$ ./indirect2 
[[email protected] asm-32]$ echo $? 
136 

Что я делаю неправильно в программе косвенный.

+0

Что вы делаете неправильно? Ну, 'ebx' не содержит желаемого значения, потому что вы его не поместили. (Знаете ли вы, что такое 'int $ 0x80' и какие его требования?) –

+0

@KerrekSB Спасибо за ваш комментарий, когда я указал' addl% eax, (% ebx) ', я предполагаю, что адрес, хранящийся в ebx, будет используется для извлечения значения «5» – mrashok

+0

@KerrekSB, int $ 0x80 вызывает ядро ​​для запуска системного вызова выхода, которое должно выдавать статус выхода на основе содержимого регистра% ebx, которое должно быть 10. – mrashok

ответ

1

Я думаю, что вы хотите что-то вроде этого:

movl $t1, %ebx  # ebx = address of t1 
movl $5, %eax  # eax = 5 
addl (%ebx), %eax # eax += (ebx) 
movl %eax, %ebx  # exit value 
movl $1, %eax  # exit() 
int $0x80   
1

В качестве альтернативы, чтобы сделать ваш второй пример работы:

.section .data 
t1: 
.long 5 
.section .text 
.globl _start 
_start: 
    movl $t1, %ebx  # we are passing the address to %ebx 
    movl $5, %eax  # we are passing value 5 to %eax 
    addl %eax, (%ebx) # add the values in %eax, %ebx and store it in %ebx 
    movl (%ebx), %ebx # THE FORGOTTEN INSTRUCTION (read result back into %ebx) 
    movl $1, %eax  # call exit program 
    int $0x80  # Call Master Bruce Wayne 

Что произошло ваша первоначальная версия indirect2 распечатаны относительный адрес от $t1, что было в %ebx, когда программа вышла.

+0

Большое спасибо за ваш ответ. – mrashok

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

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