Как объявить массив с размером, указанным пользователем в nasm? - PullRequest
1 голос
/ 06 апреля 2019

хотел сделать пример с nasm, используя архитектуру x86, которая может создать массив с размером "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

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы имеете в виду, как resd n в BSS, и пользователь может построить программу с помощью nasm -felf -Dn=1024, чтобы установить макрос NASM как константу? Вы можете указать по умолчанию %ifdef.

Если вам нужен переменный размер массива во время выполнения, он, очевидно, не может находиться в статическом хранилище (если вы не перераспределяете слишком много и используете только ту часть массива, которая необходима. Это хорошо для систем, которые выполняют ленивое распределение для BSS.)

0 голосов
/ 07 апреля 2019

Если вас устроит пример для 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
...