유사한 솔루션이 x86에서 작동했지만 Linux의 C ++ 프로 시저에서 전달 된 배열을 수정하는 x64 어셈블리의 프로그램이 작동하지 않습니다.

infoholic_anonymous

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로 포팅하기위한 모든 리소스를 주시면 감사하겠습니다.

infoholic_anonymous

프로그램이 작동하지 않는 이유는 x64의 다른 호출 규칙 때문입니다. 참조 : 링크 참조. 문자열 배열의 주소는 x86의 경우처럼 스택에 전달되지 않았지만 rdi 레지스터에 저장되었습니다. 따라서 해결책은 배열 주소를로드하는 명령어를 다음으로 변경하는 것입니다.

mov rax, rdi

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관