x64 어셈블리로 문자열의 소문자를 별표로 바꾸는 프로그램을 작성했습니다. 어셈블리 프로시 저는 C ++ 프로그램에서 호출되고 문자 배열을받습니다. x86에 적용된 유사한 논리가 작동했지만 (사용되는 레지스터 등의 차이) 이제 x64 용으로 빌드 될 때 문자열이 변경되지 않은 상태로 유지됩니다. 저는 Debian Linux와 nasm
.
section .text
global func
func:
push rbp
mov rbp, rsp
; zadanie jako takie
mov rax, QWORD [rbp+8]
loop:
cmp BYTE [rax], 97
jl increment
cmp BYTE [rax], 122
jg increment
mov BYTE [rax], 42
increment:
add rax, 1
cmp BYTE [rax], 0
jne loop
exit:
mov rax, 0 ;return 0
mov rsp, rbp
pop rbp
ret
다음 C ++ 프로그램에서 호출됩니다.
#include <stdio.h>
#define LENGTH 1024
extern "C" int func(char *a);
int main(void)
{
int result;
char text[LENGTH];
printf( "Write some string\n" );
fgets( text, LENGTH -1, stdin );
printf("String: %s\n", text);
result=func(text);
printf("String: %s\n", text);
return 0;
}
필요한 경우 다음이 있습니다 makefile
.
CC=gcc
ASMBIN=nasm
all : asm cc link
asm :
$(ASMBIN) -o func.o -f elf64 -l func.lst func.asm
cc :
$(CC) -m64 -c -g -O0 main.cc
link :
$(CC) -m64 -o test -lstdc++ main.o func.o
clean :
rm *.o
rm test
rm errors.txt
rm func.lst
또한 x86에서 x64로 포팅하기위한 모든 리소스를 주시면 감사하겠습니다.
프로그램이 작동하지 않는 이유는 x64의 다른 호출 규칙 때문입니다. 참조 : 링크 참조. 문자열 배열의 주소는 x86의 경우처럼 스택에 전달되지 않았지만 rdi 레지스터에 저장되었습니다. 따라서 해결책은 배열 주소를로드하는 명령어를 다음으로 변경하는 것입니다.
mov rax, rdi
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다