我刚开始学习汇编语言.在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中,有两种方法可以跟踪数组的长度:
对于第一个示例,根据您正在使用的汇编程序,您可能可以使用一些技巧.例如,在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是不必要的.
汇编比Java低很多.除其他外,这意味着没有"阵列"这样的东西.至少在你知道它的安全Java形式中.
相当于一个数组的是分配一块内存,并将其视为一个数组.但是,您必须自己管理长度,因为您拥有的只是包含数据的大块内存.如果要存储任何元数据(例如长度),则必须自己执行此操作.
您在Java中了解它们的数组包含长度等元数据,并进行边界检查.这些都是你必须要做的事情,只有他们隐藏它才能让你不必担心这些事情.
我建议你看看下面的内容,介绍如何在程序集中创建和使用等同于数组的内容:
汇编中不存在数组这样的东西(据我所知)。如果您愿意,您可以自由地发明数组的工作方式。
如果您正在阅读编译器生成的程序集,那么您将必须专门询问该编译器。
一种方法是允许数组的第一个字节存储每个元素的长度。另一种方法是以空值终止数组(这通常是维护字符串的方式)。