是《深入理解程序设计 使用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 $?