본문 바로가기

어셈블리어 공부용26

emu8086 어셈블리어 연습 [이중루프문] .MODEL SMALL .CODE ORG 100h PROG: CALL DOUBLELOOP HLT DOUBLELOOP PROC NEAR MOV CX,2000h ;루프를 2000h 만큼 돌리기 LOOPHERE2: PUSH CX ;첫 번째 루프값 저장하기 MOV CX,2000h ;두 번째 루프값 전달하기 LOOPHERE: ;2000h만큼 루프 LOOP LOOPHERE ; POP CX ;첫 번째 루프값 가져오기 LOOP LOOPHERE2 ;맨 위로 RET DOUBLELOOP ENDP END PROG emu8086에선 코드를 실행하면 느리게 실행되지만, 도스환경에선 엄청 빠르게 처리됩니다. 그래서 게임같은것을 만들땐 이중루프문이나 삼중루프문으로 프로그램 속도를 잡을 필요가 있습니다. 프로그램이 너무 느리면 루프횟.. 2019. 8. 18.
어셈블리어 INT 21h 정리 INT 21H - 01H 키보드로부터 문자를 기다린다. 호출 AH = 01H 리턴 AL = 입력된 문자의 ASCII 코드 ​ INT 21H - 02H 현재의 커서 위치에 문자를 출력한다. 속성은 커서 위치의 문자의 속성에 따른다. 호출 AH = 02H DL = 문자의 ASCII 코드 ​ INT 21H - 07H 키보드로부터 한 문자를 에코없이 입력받는다. 호출 AH = 07H 리턴 AL = 1byte의 ASCII 코드 ​ INT 21H - 09H 문자열을 화면으로 출력한다. 호출 AH = 09H DS:DX = 문자열의 세그먼트와 오프셋 ​ INT 21H - 0AH 키보드로부터 리턴키가 들어올때 까지 입력받은 문자를 버퍼에 저장한다. AH = 0AH DS:DX = 버퍼의 서그먼트와 오프셋 ​ INT 21H.. 2019. 8. 17.
어셈블리어 공부할때 좋은 프로그램 'emu8086' https://softfamous.com/emu8086/ EMU8086 Free Download for Windows 10, 7, 8/8.1 (64 bit / 32 bit) This in an application that can demonstrate valuable for architects and understudies alike, empowering them to evaluate the capacities of a 8086 chip and comprehend its working mode substantially similar. It includes a coordinated constructing agent and co softfamous.com 가상 8086프로세서환경을 제공하는 프로그램 입니다... 2019. 8. 17.
모토로라 68000 아키텍쳐 어셈블리어를 위한 어셈블러 EASy 68k 어셈블리어는 하드웨어에 종속되는 언어입니다. 때문에 하드웨어의 종류 만큼이나 문법이 다릅니다. ​ 크게 두 가지 언어에 대해서 이야기 해보자면 x86 ( x86 assembly language )어셈블리어가 있고, 68k ( 68K assembly language )어셈블리어가 있습니다. ​ x86은 인텔 프로세서 (80x86) 를 위한 어셈블리어이고 68k는 모토로라 프로세서( Motorola 68000 architecture )를 위한 어셈블리어입니다. ​ 68k어셈어와 x86어셈어의 차이점 중 한 가지만 말해본다면 ​ MOV 는 인텔어셈어에서 쓰는 문법인데 모토로라 어셈어는 MOVE 라는 문법을 사용합니다. ​ 68k 어셈어 어셈블러는 EASy68K 가 있습니다. 이 어셈블러는 어셈블 말고도 디버거.. 2019. 8. 17.
emu8086에서 나눗셈이 이상할 때. emu 8086에서 나눗셈을 하면 정상적인 값이 아니라, 이상한 값이 출력되는 경우가 있습니다. 예를 들어서 16진수 Bh를 십진수로 진수 변환하고자 할 때, 몫이 0이 될 때 까지 10으로 계속 나누면서 나머지를 얻은 순서를 역순으로 나열하는 작업을 하게 됩니다. MOV AL, 0Bh ;16진수 11을 10진수로 변환하기. MOV BX,10 ;제수 10을 BX 레지스터에 넣기. DIV BX ; AX레지스터를 10나누기 PUSH DX ; 나머지를 스택에 쌓기 (나머지가 DX레지스터에 리턴된다.) DIV BX ; 10나누기 PUSH DX ; 나머지를 스택에 쌓기 이렇게 작성한 다음 스택에서 수를 차례대로 꺼내어 출력하면 될것 같습니다. 스택의 칸칸에는 1 그리고 1이 들어있을 겁니다. 하지만 이 코드를 직.. 2019. 8. 17.
emu8086에서 DB 나 DW 등 사용시 주의해야 할 점. DB나 DW, DD 로 자료영역을 정의 할 때, 메인프로시저를 불러오기전에 먼저 선언해두면 프로그램이 제대로 작동이 안되는것을 확인했습니다. 그림처럼 메인프로시저를 불러오기전에(CALL MAIN) NUM1 이라는 데이터 자료 영역을 정의해두면... (박스친 코드가 CALL MAIN 이라는 코드 앞에 있지요?) 에뮬레이터로 살펴보면 NUM1자료영역코드가 노란색으로 하이라이트 되어 있는데 여기 수록된 명령이 실행되고 있다는 의미입니다. 얼핏보면 정상적인 동작같지만, 사실은 이 코드는 실행하지않고 건너뛰어야 하는 부분입니다. 예상과는 다르게 레지스터값을 엉망으로 만들어 버립니다. 이번엔 메인프로시저 시작한 후에(CALL MAIN 이후) 자료영역을 선언해 보겠습니다. 프로그램을 시작하면 메인프로시저 호출부터 시.. 2019. 8. 17.