一段找最大值的汇编代码无法正常运行

是《深入理解程序设计 使用Linux汇编语言》这本书里的第二段程序。
书上用的是as编译器,我想用nasm编译器,毕竟Intel风格更好看一些。
这里就有个问题了。
书上有一行命令是:

movl data_items(,%edi,4), %eax

这个在as上是可以编译通过的,但是在nasm里却不能简单的换成

mov eax, data_items[,edi,4]

这绝壁是错的,所以我想了很多办法怎样替代,但是都不行。以下是我的代码:

section .data
dataitems:
db 3,67,24,222,45,75,54,34,44,33,22,11,66,0

section .text

global _start

_start:
mov edi, 0
mov eax, [dataitems+edi]
mov ebx, eax

start_loop:
cmp eax, 0
je loop_end
inc edi
mov eax, [dataitems+edi]
cmp eax, ebx
jle start_loop
mov ebx, eax
jmp start_loop

loop_end:
mov eax, 1
int 0x80

这个代码也是有问题的,中间有两行是

mov eax,[dataitems+edi]

我以为加上方括号是解析对应地址储存的值,然而并不是,经gdb调试,方括号取出来存到eax里的明显是一段地址的十进制形式,最后的输出虽然是正常的dataitems里的数字,但是由于中间的判断都是用地址值判断的,所以结果并不对。

这是什么原因啊?

编译器:nasm 2.13.02

连接器:ld 2.30

结果检查方式:程序运行结束后输入echo $?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问