linux - 我如何在 nasm 中获取系统调用 getcwd 返回字符串的真实长度?

标签 linux assembly x86 nasm system-calls

我的程序调用中断 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/

相关文章:

c - ARMv7 汇编语言 : How to add two uint32_t and return a uint64_t result

c - 显式多线程 SIMD 操作的最快方法是什么?

c - 汇编与 C 代码比较

linux - rundeck-配置失败 : SSH Keyfile does not exist

c++ - C++ 隐含了这个,以及它是如何被压入堆栈的

c - select 中可以使用相同的 fd 进行读写

assembly - NOPL在x86系统中有什么作用?

c - 如何在 gcc/mingw 内联汇编中添加简单的 float4

linux:无法创建链接

c - 如何知道新创建的文件的完整路径?