TIL

20201106(금) TIL

학습 목표

libasm의 보너스 파트인 ft_atoi_base.s에서 문자열 -> 정수 변환 코드 작성하기.   

 

발견한 문제

data 섹션에 선언한 배열을 참조할 때 seg fault 오류 발생
	mov		r15, check_arr
.
.
.
	movzx	r14, byte[rsi + r13]
	cmp		byte[r15 + r14], 1
	je		error
	mov		byte[r15 + r14], 1

 byte[rsi + r12]의 byte를 빠트려서 발생한 문제.

 원래 코드는 mov r14, [rsi + r13]과 같이 작성했으나, 이렇게 했을 때 r14의 값을 출력해보니 엉뚱한 값이 들어있었습니다.  

 

mismatch in operand sizes

 사이즈가 다른 오퍼랜드 값을 넘겨주기 위해 mov대신 movzx를 사용했습니다. 남는 부분을 0으로 채우기 때문에 값에 다른 오차는 발생하지 않는 것으로 보입니다.

 

 

학습 내용 

 오늘은 지난 시간에 이어서, ft_atoi_base()의 핵심 부분인 문자열->정수 전환 알고리즘을 어셈블리어로 작성하였습니다. 생각보다 오류가 많이 발생해서 하나씩 수정해나가고 있습니다.

 

base에 오류가 없음에도 무조건 실행되는 error 분기

 seg fault 등의 오류를 모두 수정했음에도, 실행시 무조건 error분기가 실행되어 return 값이 0이 되었습니다. 제대로 base값을 순회하며 검사하고 있는지 테스트해보았으나, base에 오류가 없을 경우 마지막 null까지 제대로 순회하고 있었습니다.

 이 다음에 위치한 라벨이 error였는데, 어떤 테스트 케이스에서든 현재 분기를 마치고 나면, 다음 라벨인 error가 실행된다는 사실을 알게 되었습니다. jmp를 통해 다른 분기(라벨)를 실행하면, 분기가 끝났을 때 원래 위치로 회귀한다고 생각했기 때문에, 전체적으로 코드를 수정해야 할 것 같습니다.

 

다음 학습 계획

 코드와 라벨들이 무조건 순서대로 실행된다는 사실을 몰랐기 때문에, 라벨의 순서가 꼬인 부분이 많습니다. 라벨의 위치를 순서에 맞게 조정하고, 필요한 부분은 코드를 다시 작성할 계획입니다.  

 

참고 자료

'TIL' 카테고리의 다른 글

20210119(수) TIL  (0) 2021.01.20
20201119 (목)  (0) 2020.11.19
20201110(화) TIL  (0) 2020.11.11
20201109(월) TIL  (0) 2020.11.09
20201105(목) TIL  (0) 2020.11.05