본문 바로가기

어셈블리어26

emu8086에서 DB 나 DW 등 사용시 주의해야 할 점. DB나 DW, DD 로 자료영역을 정의 할 때, 메인프로시저를 불러오기전에 먼저 선언해두면 프로그램이 제대로 작동이 안되는것을 확인했습니다. 그림처럼 메인프로시저를 불러오기전에(CALL MAIN) NUM1 이라는 데이터 자료 영역을 정의해두면... (박스친 코드가 CALL MAIN 이라는 코드 앞에 있지요?) 에뮬레이터로 살펴보면 NUM1자료영역코드가 노란색으로 하이라이트 되어 있는데 여기 수록된 명령이 실행되고 있다는 의미입니다. 얼핏보면 정상적인 동작같지만, 사실은 이 코드는 실행하지않고 건너뛰어야 하는 부분입니다. 예상과는 다르게 레지스터값을 엉망으로 만들어 버립니다. 이번엔 메인프로시저 시작한 후에(CALL MAIN 이후) 자료영역을 선언해 보겠습니다. 프로그램을 시작하면 메인프로시저 호출부터 시.. 2019. 8. 17.
emu8086 어셈블후에 실행시 라벨을 이용한 분기가 제대로 안될 때. 어셈블러로 프로그래밍을 하다보면 라벨을 이용해서 분기가 필요한 시점이 있습니다. 하지만 emu8086에서 분기문을 사용할 때는 알아두어야할 사항이 있습니다. 위 코드에서 JL 분기문이 조건을 만족하면 ENND 라벨로 JMP하게 되어 있습니다. 하지만 코드를 실행해보면, 갑자기 뜬금없이 맨 처음으로 돌아가버립니다. 에뮬레이터에서 살펴보니 JL분기문이, 조건을 만족하면 JMP하는 주소가 100h. 즉, 맨 처음으로 돌아가게 되어 있습니다. 우리가 의도한 결과가 아닙니다. 원인은 바로 저 빨간 원에 있습니다... '아니 어셈블도 링킹도 제대로 됐는데 뭐가 잘못됐단말인가?' 그건바로 '라벨과 콜론을 붙여쓰지 않았다는 것' 입니다. ​ 이런문제는 오류로 알려주지 않기때문에, 상당히 곤란합니다. 라벨과 콜론을 붙여.. 2019. 8. 16.
emu8086으로 어셈블리어 연습하기 [로또번호용 난수 6자리 뽑기] .MODEL SMALL .CODE ORG 100h ;100h번지부터 코드시작. ;---------------------------------------------- PROG: CALL MAIN ; 난수를 만들고 출력하는 역활을 담당. CALL ENND ; 프로그램을 종료하는 역활. ;---------------------------------------------- BLANK DB ' $' ; 공백출력을 위한것. ;---------------------------------------------- MAIN PROC NEAR ; 메인 프로시저 시작 MOV CX,06 ; 6개의 수를 뽑는다. AGAIN: PUSH CX ; CX레지스터 데이터를 스택에 저장한다 (바로 위에서 수록한 데이터 보호를 위함.) DR.. 2019. 8. 15.
emu8086으로 어셈블리어 연습 [16진수를 10진수로 변환 후 출력하기] 이번엔 AX레지스터에 16진수를 입력받았다고 가정하고, 이것을 10진수로 처리하여 출력해보겠습니다. .MODEL SMALL .CODE ORG 100h ;100h번지부터 코드시작 CALL MAIN ;'MAIN'프로시저 호출 HLT ;프로그램 중단 (MAIN 프로시저가 실행이 끝나면 HLT로 프로그램을 중단합니다.) ;------------ DECADT DB 7 DUP ('$') ;DECADT라는 바이트크기의 데이터공간을 설정. 메모리에 '$'를 7개 채운다. ;----------- MAIN PROC NEAR ;MAIN 프로시저의 시작 MOV AX,1234h ;1234h라는 수를 입력받았다고 가정했습니다. MOV BX,10 ;10으로 나누어 주기위해 BX레지스터에 10을 수록. MOV CX,0 ;CX레지스터.. 2019. 8. 15.
emu8086을 이용한 어셈블리어 연습 [16진수를 입력하여 16진수로 저장하기] 어셈블리어에선 사용자가 어떤 값을 입력하면 그 값에 대응하는 아스키코드값을 저장하게 됩니다. 가령 'A'를 입력받으면 레지스터엔 41이 저장되게 됩니다. 때문에 저장받은 후에 또다른 처리를 해주어야 합니다. .MODEL SMALL .CODE ORG 100h ERRORMSG DB 'ERROR!$' START: INPUTNUM PROC NEAR INPUT: MOV AH, 1 ; 문자 하나를 입력받는 기능번호 1번을 수록합니다. INT 21h ; CMP AL, 0Dh ; 엔터키(아스키코드:0Dh)가 입력되면 입력을 종료하고 메인루틴으로 돌아가는 역활을 합니다. JE CRLF ; 입력받은 키가 엔터키라면 먼저 띄워쓰기 루틴(CRLF)으로. 그 다음 메인루틴으로 이동하게 됨. SUB AL, 30h ; 아스키코드상.. 2019. 8. 15.
emu8086으로 어셈블리어 연습 [10진수를 입력받아 16진수로 저장하기.] START: ; START 라벨입니다. 저장처리가 끝나고나면 돌아와서 또 다른수를 입력하러 돌아옵니다. MOV AH, 01 ; 한 문자를 입력받는 기능번호 1번을 AH레지스터에 저장. INT 21h ; SUB AL, 30h ; 문자 하나를 입력받은뒤 30h를 빼줍니다. 이유는 아래에서 설명하겠습니다. JL ENDPROG ; 연산결과가 0보다 작다면 ENDPROG로 분기합니다. (수가 아닌 다른 문자 입력했다는 뜻.) CMP AL,9 ; 만일 9와 비교해서 수가 크다면? JG ENDPROG ; ENDPROG로 분기해줍니다.(수가 아닌 다른문자 입력했다는 뜻.) CBW ; AL레지스터값을 AX값으로 만들어 줍니다. 이유는 아래에서 설명하겠습니다. XCHG AX,BX ; AX값과 BX값을 맞바꾸어 줍니다. 최.. 2019. 8. 15.