如何检查汇编语言(ASM)中的"数组长度",

Mik*_*ike 6 assembly

我刚开始学习汇编语言.在java中,如果我们有一个Array,我们总是可以使用array.length来获取它的长度.在集会中有这样的事吗?如果是的话,有人可以在这里指导我吗?

编辑:

我很抱歉,我知道程序集没有数组,我试图简化一些事情.

我的意思是,如果我有一个变量

data DB 1,2,3,5,7,8,9,10
Run Code Online (Sandbox Code Playgroud)

鉴于DB可以包含任意数量的元素,我如何检查它包含的总变量?

像java这样的东西,使用int数组来存储它

int data = {1,2,3,4,57,8,9,10};
Run Code Online (Sandbox Code Playgroud)

我们可以只使用data.length来查找元素的总量.

小智 12

回答这个问题的最好方法是使用C示例.在C中,有两种方法可以跟踪数组的长度:

  1. 您存储一个变量,告诉您制作数组的时间.
  2. 你执行字符串操作并将最后一个元素设置为0.然后,您可以实现一个"字符串"长度函数,该函数循环遍历数组,直到找到零.

对于第一个示例,根据您正在使用的汇编程序,您可能可以使用一些技巧.例如,在nasm中你可以这样做:

SECTION .data       

msg:    db "Hello World",10,0  ; the 0-terminated string.
len:    equ $-msg              ; "$" means current address.
Run Code Online (Sandbox Code Playgroud)

如您所见,我们使用equ运算符来获取nasm来计算当前地址msg与其开始之间的差异应该等于其长度.或者,您可以将长度写为数字.

对于第二种情况,您可以轻松编写一个小函数来执行此操作.粗略地说,如果你:

SECTION .text

global _mystrlen

_mystrlen:

    push    ebp        ; conform to C calling conventions.
    mov     ebp, esp

    xor     eax, eax
    lea     ecx, [esp+8]   ; load the start of the array into ecx
    jecxz   end            ; jump if [ecx] is zero.

loop:
    add     eax, 1     ; could use inc eax as well. 
    add     ecx, 4     ; always increment by (sizeof(int)). Change as appropriate
    mov     edx, [ecx] ; load ecx
    cmp     edx, 0     ; compare with zerp
    je      end        ; if ecx is zero, we're done.
    jmp     loop       ; if ecx isn't zero, loop until it is.

end:
    leave              ; restore stack frame
    ret                ; return. eax is retval
Run Code Online (Sandbox Code Playgroud)

请注意,我没有测试过.这只是给你一个想法.

编辑x86_64在Linux上测试了该版本,使用rdiparam1,传入int arr[10] = {1,2,3,4,5,6,7,8,9,0};.9按预期返回.请注意,在Linux上,前面的下划线mystrlen是不必要的.

  • +1'equ $ -msg`概念非常有用 (3认同)

Seb*_*olm 7

汇编比Java低很多.除其他外,这意味着没有"阵列"这样的东西.至少在你知道它的安全Java形式中.

相当于一个数组的是分配一块内存,并将其视为一个数组.但是,您必须自己管理长度,因为您拥有的只是包含数据的大块内存.如果要存储任何元数据(例如长度),则必须自己执行此操作.

您在Java中了解它们的数组包含长度等元数据,并进行边界检查.这些都是你必须要做的事情,只有他们隐藏它才能让你不必担心这些事情.

我建议你看看下面的内容,介绍如何在程序集中创建和使用等同于数组的内容:


Joe*_*ips 2

汇编中不存在数组这样的东西(据我所知)。如果您愿意,您可以自由地发明数组的工作方式。

如果您正在阅读编译器生成的程序集,那么您将必须专门询问该编译器。

一种方法是允许数组的第一个字节存储每个元素的长度。另一种方法是以空值终止数组(这通常是维护字符串的方式)。