shinwu_chen 发表于 2014-10-21 16:18

请教寄存器寻址问题

从《汇编语言程序设计》(布鲁姆)这本书书里看到的一个例子:.section .data
values:
    .int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
.section .text
.globl _start
_start:
    nop
    movl values, %eax
    movl $values, %edi
    movl $100, 4(%edi)
    movl $1, %edi
    movl values(, %edi, 4), %ebx
    movl $1, %eax
    int $0x80在这段汇编码的第11行,将1存入了edi寄存器指向的内存里了,我理解就是values这个标签指向的内存,第一个位置应该就是1了,可是在调试的时候那段values的第一个位置还是10,可是上一行的100就存进去了,调试过程如下:# gdb -q movtest3
Reading symbols from /asm/movtest3...done.
(gdb) break *_start+1
Breakpoint 1 at 0x4000b1: file movtest3.s, line 8.
(gdb) run
Starting program: /asm/movtest3

Breakpoint 1, _start () at movtest3.s:8
8          movl values, %eax
(gdb) s
9          movl $values, %edi
(gdb) s
10          movl $100, 4(%edi)
(gdb) x/11d &values
0x6000dc <values>:        10        15        20        25
0x6000ec <values+16>:        30        35        40        45
0x6000fc <values+32>:        50        55        60
(gdb) s
11          movl $1, %edi
(gdb) x/11d &values
0x6000dc <values>:        10        100        20        25
0x6000ec <values+16>:        30        35        40        45
0x6000fc <values+32>:        50        55        60
(gdb) s
12          movl values(, %edi, 4), %ebx
(gdb) x/11d &values
0x6000dc <values>:        10        100        20        25
0x6000ec <values+16>:        30        35        40        45
0x6000fc <values+32>:        50        55        60
(gdb) 有点不理解为什么第一个数字还是10,而不是1呢,恳请大家指点~

爻易 发表于 2014-10-21 22:17

第1个数字的地址是values+0

程序对100的写入地址是values+4,这已经是第2个数的地址了,原值15=>100

爻易 发表于 2014-10-21 22:22

而那个1,只写入了寄存器,并未写入内存,当然看不到

shinwu_chen 发表于 2014-10-22 10:29

回复 3# 爻易


    看完你回答我又回去看了下书,确实写到了带括号的寄存器是存到里面指向的地址,不带的是存寄存器。。。还是看书不认真啊- -、谢谢了啊!{:2_172:}
页: [1]
查看完整版本: 请教寄存器寻址问题