在命令行中传递参数,汇编编程

时间:2016-06-05 10:15:17

标签: assembly parameter-passing nasm

让我简单解释一下:)。

我接近参数10,使用EBP寄存器和ebx寄存器,因为它的堆栈结构包含EBP(基址寄存器),返回地址,参数#,参数1,参数2 ...因为我不知道使用本地注册。 我可以看到参数已正确输入,因为我可以使用call print_string打印它。但是,因为< while:>代码行,似乎字符串10似乎没有被读取,因为对于它来说,推荐行什么都不做。 我会轻轻地问一下从代码开始的位置。谢谢阅读。

输入:./atoi 10
结果:10

%include "asm_io.inc"

    segment .data

    segment .bss
    input   resw 1

    segment .text
    global  main
main:
    enter   0,0
    pusha
    mov ebx, [ebp+12]
    mov eax, [ebx+4]
     ; call print_string
    dump_stack 1,2,4
    mov ebx, 0      
    mov ecx, 10
while:
    cmp al, 0x0a
    je print
    sub eax, 0x30
    mov [input], eax
    mov eax, ebx
    mul ecx
    add eax, [input]
    mov ebx, eax
    jmp while
print:
    mov eax, ebx
    call print_int
    call print_nl

    popa
    mov     eax, 0 
    leave
    ret

1 个答案:

答案 0 :(得分:2)

您的 while 循环不会读取任何字符!您可以使用mov dl,[eax]检索这些内容 从下面的代码中可以看出,不需要使用临时输入变量。

  xor   ebx, ebx            ;Result
while:
  movzx edx, byte ptr [eax] ;Read 1 character
  test  dl, dl              ;Test for end of string
  jz    print               ;End found
  sub   dl, 0x30            ;Go from character to value [0,9]
  imul  ebx, 10             ;Result x10
  add   ebx, edx            ;Add new digit
  inc   eax                 ;To next character
  jmp   while