Как получить доступ к аргументам командной строки из _start в ARM Linux - PullRequest
0 голосов
/ 28 февраля 2020
@File: whichisthebiggest.s
    .global _start

_start:
    LDR R2,=A                   @load numbers in A-C
    LDR R2, [R2]
    LDR R3,=B
    LDR R3, [R3]
    LDR R4,=C
    LDR R4, [R4]

    LDR R1, = message_A         @load message A
    CMP R2, R3                  @compare A and B
    BLE who_is_the_biggest      @if B is greater, go to function
    MOV R3, R4                  @make C the new B
    CMP R2, R3                  @compare B and C
    BLE who_is_the_biggest_2    @if C is bigger, go to function
    B exit                      @end it, were done

who_is_the_biggest:             
    MOV R2, R3                  @since b is bigger, make B the new A
    LDR R1, =message_B          @change the message to B, since A isnt bigger

who_is_the_biggest_2:
    MOV R2, R3                  @put C in the number one spot. R2 is the answer
    LDR R1, =message_C          @change to message C since it is bigger than B

exit:
    MOV R0, #1                  @necessary to bring string
    SWI 0x69                    @prints string
    SWI 0x11                    @stop running program

.data
A:  .word 34                    @declare variables, numbers
B:  .word 10
C:  .word 54
message_A:  .asciz "A > B and A > C"    @declare strings
message_B:  .asciz "B > C and B > A"
message_C:  .asciz "C > A and C > B"

Я работаю над сборкой руки Raspberry Pi, я хочу знать, как я могу вместо message_A AND MESSAGE_B быть в коде ... Я читаю их из аргумента командной строки при запуске пользователем. и дать сообщение, если два аргумента не указаны.

1 Ответ

1 голос
/ 01 марта 2020

argc и argv передаются в стек. Вы можете получить к ним доступ следующим образом:

      ldr  r0, [sp]     /* Get argc... */
      add  r1, sp, #4   /* ... and argv ... */

argv - это массив указателей, и значения будут переданы в ASCII или текстовом формате, поэтому вам нужно будет преобразовать значения в двоичный файл. Если у вас есть arg c из четырех (во-первых, это имя программы), вы можете использовать ниже, чтобы получить указатель на числовые строки

 add r2, r1,#4
 add r3, r1,#8
 add r4, r1,#12

Я бы просто закодировал это в 'C', как это много хлопот, чтобы сделать это в ассемблере без реальной выгоды; кроме как воспитывать себя. Но вы можете видеть, полезный пример с встроенным ассемблером , где «образование» действительно полезно. С помощью встроенного ассемблера вы используете гибкость ассемблера и оставляете все измельчения выделения регистров компилятору 'C'. Компилятор 2020 намного лучше, чем компиляторы 1970–1980-х годов, и часто бывает, что ручной ассемблер сделает много mov Rn, Rm ... Это пустая трата циклов и места для кода, так как алгоритмы распределения SSA и регистров часто устранить их в скомпилированном коде. Кроме того, скомпилированный код, скорее всего, будет правильным, чем ручной ассемблер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...