어셈블리어 공부용/emu8086 REPORT (오류보고)3 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. emu8086 어셈블후에 실행시 라벨을 이용한 분기가 제대로 안될 때. 어셈블러로 프로그래밍을 하다보면 라벨을 이용해서 분기가 필요한 시점이 있습니다. 하지만 emu8086에서 분기문을 사용할 때는 알아두어야할 사항이 있습니다. 위 코드에서 JL 분기문이 조건을 만족하면 ENND 라벨로 JMP하게 되어 있습니다. 하지만 코드를 실행해보면, 갑자기 뜬금없이 맨 처음으로 돌아가버립니다. 에뮬레이터에서 살펴보니 JL분기문이, 조건을 만족하면 JMP하는 주소가 100h. 즉, 맨 처음으로 돌아가게 되어 있습니다. 우리가 의도한 결과가 아닙니다. 원인은 바로 저 빨간 원에 있습니다... '아니 어셈블도 링킹도 제대로 됐는데 뭐가 잘못됐단말인가?' 그건바로 '라벨과 콜론을 붙여쓰지 않았다는 것' 입니다. 이런문제는 오류로 알려주지 않기때문에, 상당히 곤란합니다. 라벨과 콜론을 붙여.. 2019. 8. 16. 이전 1 다음