【问题标题】:NASM array pointers operationNASM 数组指针操作
【发布时间】: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


【解决方案1】:

哦,谢谢有人提醒我。

解决方案其实是在编辑中写的,不过我再贴一遍: const short 只有 2 个字节,我在程序中使用扩展通用寄存器(4 个字节)进行读写,这导致了跳转地址和随机值的问题。

访问数组中的每个单独元素本质上是这样的: 考虑任何数组都是一个扁平的长链元素。阅读每个元素就像单独移动链条,直到有东西告诉你停下来。

由于学术规定,不会发布解决方案代码。很抱歉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2018-08-22
    • 1970-01-01
    • 2021-03-02
    • 2014-12-12
    • 2017-11-06
    • 1970-01-01
    相关资源
    最近更新 更多