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
您有一個額外的'ret' 2排列從';試圖在這裏查看結果'。循環本身並不是最優的,但假設'eax'具有指向字符串的指針,它應該可以工作。然而,'ebp + 16'可疑,但你沒有顯示原型或它是如何被調用的。 – Jester
由於您使用'printf',因此顯然有權訪問libc,我假設您明確禁止使用'strlen'? :) – Jester
對不起,那個ret想要在那裏,沒有它,我得到了7個問題。我很確定第二個參數(第一個是程序名)是在ebp + 16中,因爲我在開始時做了pusha。它是我的教授通常使用的方法。 –