728x90

strcat을 구현해봤다.

destination 문자열의 '\n'까지 확인하고  '\n'위치부터 source 문자열 데이터를 입력시키는 것이다.

문자열을 1바이트씩 이동시켰다.

실행 화면

 

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly memcpy 구현  (0) 2020.03.16
nasm x64 assembly strcmp 구현  (0) 2020.03.15
nasm x64 assembly strcpy 구현 -2  (0) 2020.03.11
nasm x64 assembly strcpy 구현 -1  (1) 2020.03.11
inline func alloca  (0) 2020.03.10
728x90

위 memcpy는 문자열을 입력받고 복사할 데이터 수를 입력받는다.

입력받은 문자열과 복사할 데이터수만큼 memcpy의 목적 메모리주소에 복사한다.

 

여기서도 strcpy때와 같이 rep movsb 명령어를 사용했다. ecx에 입력한 데이터 수인 copy_count 값을 넣어주고 rdi에는 복사되야하는 목적 메모리 주소와 rsi에는 복사될 데이터가 있는 메모리 주소를 넣어줬다.

이후 rep movsb 명령어에 의해 한 바이트씩 ecx가 감소하면서 1바이트씩 메모리에 복사하게 된다.

실행화면

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly strcat 구현  (0) 2020.03.16
nasm x64 assembly strcmp 구현  (0) 2020.03.15
nasm x64 assembly strcpy 구현 -2  (0) 2020.03.11
nasm x64 assembly strcpy 구현 -1  (1) 2020.03.11
inline func alloca  (0) 2020.03.10
728x90

실행 결과

nasm x64 assembly로 strcmp를 구현해 봤다. 

문자열들을 입력받고 1바이트씩 비교하여 strcmp함수를 수행하는 함수이다.

해당 코드는 strcmp(string1,string2)일 경우의 코드이다.

문자가 다를때 string1 에서 string2를 빼주어 strcmp의 결과값이 되도록 했다.(실제 strcmp함수 동작)

sys_read 함수로 문자열을 입력했을 때 마지막에  \n이 들어가기 때문에 \n을 처리해주는 부분을 따로 짜서 0으로 만들어 주는 작업을 했다. 

 

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly strcat 구현  (0) 2020.03.16
nasm x64 assembly memcpy 구현  (0) 2020.03.16
nasm x64 assembly strcpy 구현 -2  (0) 2020.03.11
nasm x64 assembly strcpy 구현 -1  (1) 2020.03.11
inline func alloca  (0) 2020.03.10
728x90

 

_strlen 를 퉁해 문자열의 길이를 r10레지스터에 저장한다.

이후 _strcpy에서 rcx에 r10 즉 입력한 문자열의 길이를 넘겨주고

rsi에 입력한 문자열, rdi에는 복사할 문자열 주소를 넣어준다.

 

rep movsb는 rsi를 rdi로 1byte씩 ecx값만큼 데이터를 옮기는 명령어이다.

한번 동작할때마다 ecx는 -1이 되며 0이되면 더이상 줄어들지않고 다음 명령어를 실행시킨다.

실행화면

 

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly memcpy 구현  (0) 2020.03.16
nasm x64 assembly strcmp 구현  (0) 2020.03.15
nasm x64 assembly strcpy 구현 -1  (1) 2020.03.11
inline func alloca  (0) 2020.03.10
nasm x64 assembly strlen 구현  (0) 2020.03.10
728x90

strcpy를 구현해 봤다.

bss영역에 1024크기의 문자열 string1, string2를 선언해준다.

이후 sysread를 통해 string1에 문자열을 입력해주고 _strcpy를 호출한다.

_strcpy에서는 lea를통해 rsi로 옮긴 string1에 1바이트씩 접근하여 al로 데이터를 옮긴 후 string2에 데이터를 쓰고 있다. 

 

이후 _print 를 통해 데이터를 복사된 문자열을 출력한다.

strcpy 실행화면

 

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly strcmp 구현  (0) 2020.03.15
nasm x64 assembly strcpy 구현 -2  (0) 2020.03.11
inline func alloca  (0) 2020.03.10
nasm x64 assembly strlen 구현  (0) 2020.03.10
loop  (0) 2020.03.01
728x90

alloca.c

alloca함수는 스택에 함수를 할당해주는 함수이다. malloca 스택버전?

지인 과제로 alloca를 gdb로 열어보았다.

aclloca 디스어셈블리

alloca함수는 inline함수로 따로 함수를 호출하지않아 gdb로 분석시 어셈블리 코드가 그대로 들어가있다.

alloca는 동작 과정에서 alloca로 입력한 인자 위코드에서는 5000 +31을 하고 16으로 나눈 값에 16을 곱하여 16보다 작은 수는 버려서 16으로 aligned 시켜준다. 입력한 인자보다 무조건 큰 스택영역이 할당된다.

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly strcpy 구현 -2  (0) 2020.03.11
nasm x64 assembly strcpy 구현 -1  (1) 2020.03.11
nasm x64 assembly strlen 구현  (0) 2020.03.10
loop  (0) 2020.03.01
어셈블리 문법  (0) 2020.03.01
728x90

어셈블리로 strlen 을 구현해 봤다.

 

strlen의 경우 al 즉 8bit 1byte씩 문자들을 '\n'와 비교하여 문자열 끝을 찾았다.

sys_read를 통해 문자열을 입력하니 fgets 처럼 '\n'이 문자열에 포함되어있었다.  

bss영역인 string에서도 직접 1byte씩 메모리에 접근하여 모든 문자열을 1byte씩 비교할 수 있었다.

 

strlen 구현은 무난했지만 printf함수 호출에서 오히려 더 어려움을 느꼇던것 같다.

단순히 호출하면 되는 줄 알았지만 스택 메모리 주소가 맞지않아 rsp를 조정후에 호출해주었다.

 

printf함수 내부적으로 movaps를 호출하는데 여기서 스택메모리가 16 단위로 aligned 되어야하는것이다.

디버깅 후에 add rsp, 8을 통해 16단위로 stack memory를 aligned 해주어 printf호출에 성공했다.

 

728x90

'Programming > assembly' 카테고리의 다른 글

nasm x64 assembly strcpy 구현 -1  (1) 2020.03.11
inline func alloca  (0) 2020.03.10
loop  (0) 2020.03.01
어셈블리 문법  (0) 2020.03.01
echo  (0) 2020.03.01
728x90

loop.s

반복문은 again에 해당하는 곳이다.

 

_start부터 코드를 보면

rax,1  rdi,1 rsi,msg rdx 1등을 통해 sys_write(1,msg,1)을 호출할 준비를 하고있다. r10은 범용 레지스터로 어느 목적이든 사용가능한 레지스터이다. 

 

again을 보면 r10과 100을 비교한다. je done 명령어는 cmp를 통해 비교한 양쪽값이 같으면 done을 호출한다는 의미이다. 두개의 값이 같지않으면 syscall을 통해 msg 'A'를 출력하게 된다. 이후 rax에 1을 넣음으로써 sys_write를 호출할 준비를 해주고 r10의 값을 1증가시켜준다. inc 명령어는 해당 레지스터의 값을 1올려주는 명령어이다. jmp again을 통해 반복을 해준다. 문자열 출력과 r10값 증가가 100번 반복하여 r10과 100의 값이 같아지면 done으로 이동한다.

 

done 은 sys_exit를 호출한다. 프로그램을 종료시킨다.

728x90

'Programming > assembly' 카테고리의 다른 글

inline func alloca  (0) 2020.03.10
nasm x64 assembly strlen 구현  (0) 2020.03.10
어셈블리 문법  (0) 2020.03.01
echo  (0) 2020.03.01
sum.c 스택 프레임  (0) 2020.03.01

+ Recent posts