2015-12-01 37 views
1

我試圖檢查作爲更大的程序的一部分在程序參數中給出的刺痛的長度。我需要將字符串長度的值放入一個名爲n的變量中,這個變量在BSS中未被初始化。我已經嘗試了幾種不同的方法來做到這一點,包括我現在正在嘗試的另一種方法,這裏給出了另一個答案。但是,當我嘗試打印或使用這個小算法的結果時,它總是返回7.我相信我得到的是我想要的地址,而不是結果,但我無法確定要更改的內容。我的繼承人代碼:在NASM中的字符串的FIENDING長度

%include "asm_io.inc" 
SECTION .data 
    fmt1: db "%d",10,0 
    argErrMsg: db "Needs 2 args",10,0 
    argOkMsg : db "Arguments ok",10,0 
    doneMsg: db "Program finished, now exiting",10,0 
    strErrMsg: db "String must be between 1 and 20 charaters",10,0 
    strOkMsg: db "String length ok",10,0 
SECTION .bss 
    X: resd 20 
    i: resd 1 
    n: resd 1 
    k: resd 1 
SECTION .text 
    global asm_main 
    extern printf 
    extern strlen 

asm_main: 

    enter 0,0 
    pusha 

    CHECK_ARGS: 
     cmp dword [ebp+8],2 
     jne ERROR_ARGS 
     je OK_ARGS 

    ERROR_ARGS: 
     push dword argErrMsg 
     call printf 
     add esp,8 
     jmp EXIT 
    OK_ARGS: 
     push dword argOkMsg 
     call printf 
     add esp,8 
     jmp CHECK_STRING 
    CHECK_STRING: 
     mov eax, dword[ebp+16] 
     push eax  ;This is the code I tried using from another answer 
     mov ecx,0 
     dec eax 
     count: 
      inc ecx 
      inc eax 
      cmp byte[eax],0 
      jnz count 
     dec ecx 
     ret 
     pop eax 
     mov [n],ecx ;Tried prining it here to see the result 
     push dword [n] 
     push dword fmt1 
     call printf 
     add esp,8 
     cmp byte [n],1 
     jl ERROR_STRING 
     cmp byte [n],20 
     jg ERROR_STRING 

     jmp OK_STRING ;The program always gets to here since [n] = 7? 
    ERROR_STRING: 
     push dword strErrMsg 
     call printf 
     add esp,8 
     jmp EXIT 
    OK_STRING: 
     push dword strOkMsg 
     call printf 
     add esp,8 
     jmp EXIT 
    EXIT: 
     push dword doneMsg 
     call printf 
     popa 
     leave 
     ret 
+1

您有一個額外的'ret' 2排列從';試圖在這裏查看結果'。循環本身並不是最優的,但假設'eax'具有指向字符串的指針,它應該可以工作。然而,'ebp + 16'可疑,但你沒有顯示原型或它是如何被調用的。 – Jester

+0

由於您使用'printf',因此顯然有權訪問libc,我假設您明確禁止使用'strlen'? :) – Jester

+0

對不起,那個ret想要在那裏,沒有它,我得到了7個問題。我很確定第二個參數(第一個是程序名)是在ebp + 16中,因爲我在開始時做了pusha。它是我的教授通常使用的方法。 –

回答

2

要獲得的argv長度[1]:

 mov  edi,[ebp+12] ;edi = argv = &argv[0] 
     mov  edi,[edi+4]  ;edi = argv[1] 
     mov  ecx,0ffffh  ;scan for 0 
     xor  eax,eax 
     repne scasb 
     sub  ecx,0ffffh  ;ecx = -(length + 1) 
     not  ecx    ;ecx = length 

主要應在EAX返回一個0:

 popa 
     xor  eax,eax 
     leave 
     ret