【发布时间】:2014-04-11 12:39:38
【问题描述】:
这是一个初学者的问题......但我现在已经为此苦苦挣扎了将近 2 天。
我必须在NASM中实现一个功能与C合作, 从 main 函数(在 C 中完成)会将指向常量短数组的指针数组传递给函数,我必须根据要求对指针进行排序,这需要我读取每个常量短数组中的项目。因为它是一个指针,所以我的函数不会返回。
传递给我的函数的指针是这样的: const short *v[], 每个 *v[n] 指向一个不同的常量数组,n 大小未知,但以 null 结束。常量数组大小也是未知的,但以负数结尾(数组中的有效元素保证为正数)。
我的问题是,如何访问这些常量数组中的每个单独元素?
我已经成功地从 [EBP+8] 中读取了指针数组,并且能够通过移动地址来检测指针数组中有多少个元素,但是我不知道如何访问常量数组哪个指针数组正在指向。
我的代码片段:
...
segment .text
global sort_vectors
sort_vectors:
enter 0,0
pusha
mov EBX, dword [EBP+8] ; const short *v[]
mov ECX, 0
.forloop:
;I am able to count how many elements in v from this for loop
mov EAX, dword [EBX+4*ECX]
cmp EAX, 0
jz .forloopj
...
;but I need to access each individual constant short array to do the sorting
...
inc ECX
jmp forloop
.forloopj:
...
关于如何获取每个常量短数组的任何提示?谢谢!
编辑:
好的,我知道我做错了什么。 只要意识到 const short 是 2 个字节,我使用的是扩展通用寄存器(4 个字节) 一直在阅读和写作!仅使用 32 位寄存器的较低部分即可解决,现在可以使用!
我可以稍后在作业到期时发布工作代码。 感谢回复的人!
================================================ ===================
【问题讨论】:
-
我是汇编初学者,但您是否尝试通过存储
mov EAX, dword [EBX+4*ECX] mov EDX, dword [EAX] cmp EAX, 0 jz .forloopj来阅读它 -
抱歉,这里有什么问题?常量短数组的地址是在 forloop 期间存储在 EAX 中的内容。
-
呃,我没有放访问代码,因为它显然不起作用,所以这里基本上没有实现骨架。我已经尝试按照 aduch 建议的方法进行操作。但是,结果很奇怪。不是short常量= 2字节,常量short中的哪个移位应该是[EDX+2*ECX]?我在 64 位 linux 下运行 NASM,并在 cc 和 -elf32 上强制使用 -m32 标志。
-
你应该回答你自己的问题,然后接受你自己的答案。
标签: c arrays pointers assembly nasm