我的程序调用中断 80h 的函数 183 (getcwd) 将当前工作目录的绝对路径复制到 buff 指向的内存位置,长度为 4096。返回的绝对路径长度通常小于 4096 字节所以我想得到它的真实长度。我该怎么做?
%define LF 0Ah ; Line feed ASCII code.
%define STDOUT_FILENO 1 ; Standard output stream.
%define SYS_exit 1
%define SYS_write 4
%define SYS_getcwd 183
SECTION .bss
buff resb 4096
SECTION .text
global _start
_start:
mov eax, SYS_getcwd ; getcwd
mov ebx, buff
mov ecx, 4096
int 80h
mov eax, SYS_write ; print result to stdout
mov ebx, STDOUT_FILENO
mov ecx, buff
mov edx, 4096
int 80h
mov eax, SYS_exit ; exit
mov ebx, 0
int 80h
我添加代码来查找空终止字符串的长度到我的程序中,如下所示并且它有效:
%define LF 0Ah ; Line feed ASCII code.
%define STDOUT_FILENO 1 ; Standard output stream.
%define SYS_exit 1
%define SYS_write 4
%define SYS_getcwd 183
SECTION .data
mesg1 db "Can't not find string length.",LF
mesg1_l db $-mesg1
SECTION .bss
buff resb 4096
SECTION .text
global _start
_start:
mov eax, SYS_getcwd ; getcwd
mov ebx, buff
mov ecx, 4096
int 80h
mov al, 0 ; find string length with scasb
mov edi, buff
cld
repne scasb
jne error1
sub ecx, 4096
neg ecx
mov edx,ecx
print: mov byte [buff + ecx],LF
mov byte [buff + ecx + 1], 0
inc edx
mov eax, SYS_write ; print result to stdout
mov ebx, STDOUT_FILENO
mov ecx, buff
int 80h
jmp exit
error1: mov eax, SYS_write
mov ebx, STDOUT_FILENO
mov ecx, error1
mov edx, mesg1_l
int 80h
exit: mov eax, SYS_exit ; exit
mov ebx, 0
int 80h
最佳答案
问:如何找到字符串的长度(例如“getcwd()”返回的字符串)?
答:与标准库函数“strlen()”执行此操作的方式相同:解析字符串直到找到“\0”分隔符,然后将该位置作为字符串长度返回。
附言: 我强烈建议您考虑使用 Gnu 汇编程序“gas”而不是“nasm”。一旦您开始使用 x86 以外的汇编程序,“bass-ackwards”英特尔语法就会变得非常烦人。
恕我直言......
关于linux - 我如何在 nasm 中获取系统调用 getcwd 返回字符串的真实长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025006/