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条回答

    报告相同问题?

    悬赏问题

    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记