레이블이 어셈블리인 게시물을 표시합니다. 모든 게시물 표시
레이블이 어셈블리인 게시물을 표시합니다. 모든 게시물 표시

2014년 11월 5일 수요일

Vim 파일 저장 오류 __ 10

최종 오류의 원인으로 등장한 stat() 함수.
하지만 DOSBox에서는 실패한 이 함수의 결과가 시험용을 작성한 코드에서는 성공했다.
어째서 다른 결과가 나온 걸까?

gdb를 이용해서 어셈블리 코드 레벨의 실행 절차마저 세세하게 따져봐야 할 지경에 이르게 되었다.
하지만 Linux gdb에서의 어셈블리 코드의 표기가 MS-Windows 계열에서 사용하는 표기와 너무 달라서 해독이 난감해 하던 터였다.

일단, 지난 번에 만든 stat() 함수를 사용하는 테스트용 C program의 Assembly code를 생성해 보았다.
실행 결과야 이미 알고 있으니 최대한 단순하게 만들어서 Assembly code도 간단하도록 간략화 시켰다.

stat() 테스트 프로그램

gcc에서 -S 옵션을 사용하면 Assembly Code를 출력한다.
gcc -S 옵션
그렇게 만들어진 Assembly Code는...
테스트 프로그램의 Assembly Code
역시나 뭔가 참 어색하다.
상수값에 $를 쓴다거나 레지스터 이름에 %를 붙인다는 걸 알 수 있지만, 오퍼랜드의 순서가 바뀌어 있고, %gs:20 ?? 156(%esp) ??? 이건 대체 뭘까?

Linux용 Assembly 공부를 해야 하나 하고 관련 서적과 자료들을 인터넷에서 검색을 했다.

헌데... CPU는 동일한 인텔 계열인데 굳이 Assembly 공부를 다시 해야 하나?
OS에 관련된 부분을 제외하면 단순히 표기법만 다른 것 아닌가?

그렇다면 gcc에서 Assembly Code를 출력할 때 이 표기법을 바꿀 수 있지 않을까?
전에 어디에선가 본 기억으로는 Assembly Code의 표기법은 AT&T와 Intel의 방식으로 나뉘어져 있으며, AT&T 표기법은 Unix 계열에서, Intel 표기법은 MS-Windows 계열에서 주로 사용한다고 했던 것 같다.
gcc는 MS-Windows용으로도 porting되어 있으니 양쪽 표기법을 모두 지원할 것이라 생각이 들어 gcc 매뉴얼을 다시 살펴 보았다.

그래서 찾아낸 옵션, -masm=intel로 지정해주면 된다.
-masm 옵션
그렇게 만들어진 Assembly Code,
테스트 프로그램의 Assembly Code. Intel 표기법
이제야 조금 익숙해진 모양새.

그렇다면 gdb에서도 Assembly Code룰 보여줄 때 표기법을 바꿀 수 있지 않을까?
그래서 gdb 매뉴얼을 찾아 본 결과,
gdb의 disassemble 옵션

2012년 7월 24일 화요일

6502 CPU의 Instruction Set

Apple II, Commodore64 등에 사용된 MOS Technology의 6502 CPU의 Instruction Set에 대한 문서입니다.

http://www.6502.org/tutorials/6502opcodes.html

Instruction은 56개밖에 안됩니다.
operand type에 따라 code가 달라져서 Instruction Code의 수는 훨씬 많지만요.

Flag라던지 Operand의 형식에 관한 설명이 없고 이에 대한 별도의 문서도 눈에 띄지 않습니다.

구닥다리라 이제는 사용되지도 않는 CPU의 Instruction을 참조하는 이유는, 에뮬레이터에 대한 궁금증 때문입니다. 과연 에뮬레이터는 어떤 식으로 에뮬레이션을 구현하는지 알고 싶어서 입니다.
에뮬레이터의 레지스터 구조체 및 함수들

ADC Instruction의 예

어드레싱모드에 관한 매크로


ADC Instruction에 관한 매크로