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 matlab有关常微分方程的问题求解决
    • ¥15 perl MISA分析p3_in脚本出错
    • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
    • ¥15 ubuntu虚拟机打包apk错误
    • ¥199 rust编程架构设计的方案 有偿
    • ¥15 回答4f系统的像差计算
    • ¥15 java如何提取出pdf里的文字?
    • ¥100 求三轴之间相互配合画圆以及直线的算法
    • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
    • ¥15 名为“Product”的列已属于此 DataTable