Сборка NASM x86-64 - Справка по циклу аргументов командной строки - PullRequest
0 голосов
/ 20 апреля 2020

сборка для меня нова, и у меня проблемы с программой, которую я пытаюсь создать. Программа должна отображать количество аргументов, заданных пользователем, и каждый из аргументов, введенных пользователем. Он также должен отображать сообщение, когда аргумент не задан (не считая программу, вызывающую оператор в качестве аргумента). У меня возникают проблемы с выяснением того, как l oop аргументы, чтобы программа отображала все аргументы, независимо от того, сколько задано пользователем. Кто-нибудь знает, как я могу решить эту проблему? Спасибо!

Вот код:

%include "CPsub64.inc"

global main ;entry point for assembly
extern puts

section .text
main:
  push rdi  ;save to stack
  push rsi  ;save to stack

;show # of arguments
  mov rax, rdi
  call WriteDec



;put blank line
  mov rdi, blankline
  call puts

;if more than 1 argument is given then jump to great
  mov rcx, 1
  cmp rcx, rdi
  jg great

  jmp less
;return original values
great:
  pop rsi
  pop rdi


loop:
;show items
  push rdi          ;save to stack
  push rsi
  sub rsp, 8    ;align stack boundary
  add rsi, 8        ;move address to next item
  mov rdi, [rsi]  ;argument from command line
  call puts
cmp rsi, rdi
  jne loop
  add rsp, 8    ;realign boundary
  pop rsi            ;restore registers
  pop rdi

  jmp skip
  less:
  pop rsi
  pop rdi

;display noarg message
  mov rax, 1
  mov rsi, noarg
  mov rdx, noarglength
  syscall

  jmp end
skip:
end:


;display end message
  mov rax, 1
  mov rsi, endmessage
  mov rdx, endmessagelength
  syscall

  ret       ;close C functions


section .data
  blankline: db " ",0

  noarg: db 'No arguments found.',0,0ah 
  noarglength: equ ($-noarg)

  endmessage: db 'The program is completed',0,0ah
  endmessagelength: equ ($-endmessage)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...