Assembly 如何在nasm中声明由用户指定大小的数组?

Assembly 如何在nasm中声明由用户指定大小的数组?,assembly,x86,nasm,intel,Assembly,X86,Nasm,Intel,想以使用x86体系结构的nasm为例,它可以创建一个大小为“n”的数组,其中“n”是用户希望在运行时获得数组大小的数字 extern _printf extern _scanf extern _scanf global _main section .data array: 10,5,4 msg: db "enter the size of the array: ",10,0 size: db 10 format: db "%i",0 section

想以使用x86体系结构的nasm为例,它可以创建一个大小为“n”的数组,其中“n”是用户希望在运行时获得数组大小的数字

extern _printf
extern _scanf
extern _scanf
global _main

section .data
    array:  10,5,4
    msg:    db  "enter the size of the array: ",10,0
    size:   db 10
    format: db "%i",0
section .text
    _main:
          push msg
          call _printf
          add esp, 4

          push size
          push format
          call _scanf
          add esp, 8

    ret

您的意思是像BSS中的
resd n
,用户可以使用
nasm-felf-Dn=1024构建程序,以将nasm宏设置为常量?您可以使用
%ifdef
提供默认值


如果您想要一个运行时可变数组大小,它显然不能在静态存储中(除非您大量过度分配,并且只使用数组中需要的任何部分。这在为BSS进行延迟分配的系统上很好。)

如果您对Windows的示例感到满意,请参阅EuroAssembler中的以下程序。它创建3128字节长的AllocArray.exe,它将在BSS节中保留并初始化请求的大小

AllocArray PROGRAM Format=PE, IconFile=, Entry=Main:
           INCLUDE winapi.htm, cpuext32.htm
%MaxPossibleLength %SETA 1_000_000 ; Specify the maximal acceptable allocation here.
[.text]
Main: StdOutput ="Enter the size of the array (1..%MaxPossibleLength): "
      StdInput EnterredLength    ; Let the user to set array length.
      LodD EnterredLength        ; Convert the enterred decimal number to integer in EAX.
      CMP EAX,%MaxPossibleLength
      JA Main:
      MOV [LengthOfTheArray],EAX
      StoD AllocatedLength       ; Convert the integer EAX to decimal.
      XOR EAX,EAX
      STOSB                      ; Zero-terminate the decimal number.
      MOV EDI,TheArray:
      MOV ECX,[LengthOfTheArray]
      MOV EAX,0x5A5A5A5A
      REP STOSD                  ; Initialize the array with 5A.
      StdOutput ="The array of ", AllocatedLength, =" DWORDs is now allocated statically."
      TerminateProgram
[.bss]
EnterredLength:   DB 16 * BYTE  
AllocatedLength:  DB 16 * BYTE  
LengthOfTheArray: DD DWORD
TheArray:         DD %MaxPossibleLength * DWORD
      ENDPROGRAM AllocArray

汇编语言中没有声明。你能详细说明你想做什么吗?你需要在运行时进行分配。堆栈或堆。与C中的相同。阵列不应具有烧录大小,但应从控制台捕获时应指示。您不能在程序集中这样做。您必须首先从用户处获取大小,然后使用外部内存管理函数从堆中分配该数量的内存。或者在堆栈上保留那么多(但不要太多——堆栈相对较小)。调用哪个函数取决于代码将在其中运行的环境。在C语言中,我想你会叫malloc。在独立应用程序中,可以调用操作系统函数。等等,谢谢,我在第二部分学习得更多,但是为向量保留足够的内存空间并不是不好的做法。你能给我一个例子吗?这不是NASM语法。我认为这是FASM语法(绝对不是MASM,
MOV EDI,数组:
将在MASM中加载,或者由于
而无效)。如果其他人错过了它,
StoD
不是
stosd
,它是一个宏或是这个答案没有定义的东西,但显然让EDI指向字符串的末尾。这段代码的大部分是打印输出,而不是实际的分配和内存集(数组,0x5A,LenthOfTheArray)。OP要求提供一个大规模的ovet分配示例,并且只使用数组的任何部分。实际上,
StoD
不是mavhine指令,也不是
printf
memset
StoD
是欧元ASM:Right附带的格式化打印宏,但通常您会使用
call printf
,因此没有空间将其与机器指令混淆。您使用的
StoD
非常接近
STOSB
,因此很容易混淆它是什么。但更重要的是,在您发表评论之前,这个答案甚至没有说明它需要什么汇编程序。它不适用于NASM,这是OP在中要求的示例。实际上,代码必须在NASM中,因为在不同语言之间,许多事情都会发生变化。但事实是,我创建了一个固定大小的数组,并在输入数组大小时指定了用户,它必须创建数组的最大值,因为正如他们在上面评论的那样,您不能动态创建数组,您必须始终拥有一个大小,而且还有其他人告诉我在这个社区之外。