Моя программа вызывает функцию 183 (getcwd) прерывания 80h, которое копирует абсолютный путь к текущему рабочему каталогу в область памяти, на которую указывает буфер, длиной 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