sd3784894 2019-11-23 20:45
浏览 179

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

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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥30 这是哪个作者做的宝宝起名网站
    • ¥60 版本过低apk如何修改可以兼容新的安卓系统
    • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题
    • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
    • ¥15 YoloV5 第三方库的版本对照问题
    • ¥15 请完成下列相关问题!