[asm] 프로세서 지시어의 위치에 따라서 다른 코드를 만들어냅니다
글쓴이: gurumong / 작성시간: 금, 2009/08/07 - 8:34오전
간단히 사용자의 이름을 입력받아서
화면을 지우고 문자열의 길이를 고려해서 모니터 중앙에 출력해주는 프로그램입니다
리얼 도스 6.2 환경이구요, MASM6 버전을 사용했습니다
MOVZX 명령어를 사용하기 위해 프로세서 지시어 .386을 처음으로 사용해보았는데요
이것에 위치에 따라 프로그램의 서로 다른 이진코드를 만들어내는데
왜 이런 결과가 나오는지 이해하기 힘듭니다 ㅜ.ㅜ
MASM에서 뽑은 리스트 파일입니다
MOVZX가 사용되는 직전에 .386 지시어가 사용된것과 (실행 잘 됨)
프로그램 소스 맨앞에 .386 지시어가 사용된것 두가지 입니다 (실행 안됨)
아래는 MOVZX가 사용되기 직전에 .386 지시어가 사용된것입니다
Microsoft (R) Macro Assembler Version 6.11 08/07/09 08:14:59 NAME (COM) Page 1 - 1 TITLE NAME (COM) 0000 CODESEG SEGMENT PARA 'Code' ORG 100H 0100 EB 29 BEGIN: JMP MAIN ;-------------------------------------------------- 0102 PARA_LIST LABEL BYTE 0102 14 MAX_LEN DB 20 0103 00 ACT_LEN DB ? 0104 0015 [ KG_DATA DB 21 DUP (' ') 20 ] 0119 57 68 61 74 60 73 PROMPT DB 'What`s your name?', '$' 20 79 6F 75 72 20 6E 61 6D 65 3F 24 ;-------------------------------------------------- 012B MAIN PROC NEAR 012B E8 000B CALL INPUT_NAME 012E E8 0019 CALL CLEAR_SCREEN 0131 E8 0037 CALL PRINT_NAME 0134 B8 4C00 MOV AX,4C00H 0137 CD 21 INT 21H 0139 MAIN ENDP ;-------------------------------------------------- 0139 INPUT_NAME PROC NEAR 0139 B4 09 MOV AH,09H 013B 8D 16 0119 R LEA DX,PROMPT 013F CD 21 INT 21H 0141 B4 0A MOV AH,0AH 0143 8D 16 0102 R LEA DX,PARA_LIST 0147 CD 21 INT 21H 0149 C3 RET 014A INPUT_NAME ENDP ;-------------------------------------------------- 014A CLEAR_SCREEN PROC NEAR 014A B8 0600 MOV AX,0600H 014D B7 01 MOV BH,01H 014F B9 0000 MOV CX,0000H 0152 BA 184F MOV DX,184FH 0155 CD 10 INT 10H 0157 B4 02 MOV AH,02H 0159 B7 00 MOV BH,00H 015B B6 18 MOV DH,18H 015D D0 EE SHR DH,1 015F B2 4F MOV DL,4FH 0161 2E: 2A 16 0103 R SUB DL,ACT_LEN 0166 D0 EA SHR DL,1 0168 CD 10 INT 10H 016A C3 RET 016B CLEAR_SCREEN ENDP ;-------------------------------------------------- 016B PRINT_NAME PROC NEAR 016B 8D 1E 0104 R LEA BX,KG_DATA <span>;********************************************************************************* ; 프로세서 지시어가 사용된 부분 (MOVZX가 사용되기 직전) <span>.386</span> ;*********************************************************************************</span> 016F 2E: 0F B6 06 0103 R MOVZX AX,ACT_LEN 0175 03 D8 ADD BX,AX 0177 C6 07 07 MOV BYTE PTR [BX],07H 017A 43 INC BX 017B C6 07 24 MOV BYTE PTR [BX],'$' 017E B4 09 MOV AH,09H 0180 8D 16 0104 R LEA DX,KG_DATA 0184 CD 21 INT 21H 0186 C3 RET 0187 PRINT_NAME ENDP ;-------------------------------------------------- 0187 CODESEG ENDS END BEGIN
원시코드 앞에 .386 지시어가 사용된것
Microsoft (R) Macro Assembler Version 6.11 08/07/09 08:15:09 NAME (COM) Page 1 - 1 TITLE NAME (COM) <span>;********************************************************************************* ; 프로세서 지시어가 사용된 부분 (원시 프로그램의 앞쪽) <span>.386</span> ;*********************************************************************************</span> 00000000 CODESEG SEGMENT PARA 'Code' ORG 100H 00000100 EB 29 BEGIN: JMP MAIN ;-------------------------------------------------- 00000102 PARA_LIST LABEL BYTE 00000102 14 MAX_LEN DB 20 00000103 00 ACT_LEN DB ? 00000104 00000015 [ KG_DATA DB 21 DUP (' ') 20 ] 00000119 57 68 61 74 60 PROMPT DB 'What`s your name?', '$' 73 20 79 6F 75 72 20 6E 61 6D 65 3F 24 ;-------------------------------------------------- 0000012B MAIN PROC NEAR 0000012B E8 00000010 CALL INPUT_NAME 00000130 E8 00000022 CALL CLEAR_SCREEN 00000135 E8 00000043 CALL PRINT_NAME 0000013A 66| B8 4C00 MOV AX,4C00H 0000013E CD 21 INT 21H 00000140 MAIN ENDP ;-------------------------------------------------- 00000140 INPUT_NAME PROC NEAR 00000140 B4 09 MOV AH,09H 00000142 66| 8D 15 LEA DX,PROMPT 00000119 R 00000149 CD 21 INT 21H 0000014B B4 0A MOV AH,0AH 0000014D 66| 8D 15 LEA DX,PARA_LIST 00000102 R 00000154 CD 21 INT 21H 00000156 C3 RET 00000157 INPUT_NAME ENDP ;-------------------------------------------------- 00000157 CLEAR_SCREEN PROC NEAR 00000157 66| B8 0600 MOV AX,0600H 0000015B B7 01 MOV BH,01H 0000015D 66| B9 0000 MOV CX,0000H 00000161 66| BA 184F MOV DX,184FH 00000165 CD 10 INT 10H 00000167 B4 02 MOV AH,02H 00000169 B7 00 MOV BH,00H 0000016B B6 18 MOV DH,18H 0000016D D0 EE SHR DH,1 0000016F B2 4F MOV DL,4FH 00000171 2E: 2A 15 SUB DL,ACT_LEN 00000103 R 00000178 D0 EA SHR DL,1 0000017A CD 10 INT 10H 0000017C C3 RET 0000017D CLEAR_SCREEN ENDP ;-------------------------------------------------- 0000017D PRINT_NAME PROC NEAR 0000017D 66| 8D 1D LEA BX,KG_DATA 00000104 R 00000184 66| 2E: 0F B6 05 MOVZX AX,ACT_LEN 00000103 R 0000018D 66| 03 D8 ADD BX,AX 00000190 67& C6 07 07 MOV BYTE PTR [BX],07H 00000194 66| 43 INC BX 00000196 67& C6 07 24 MOV BYTE PTR [BX],'$' 0000019A B4 09 MOV AH,09H 0000019C 66| 8D 15 LEA DX,KG_DATA 00000104 R 000001A3 CD 21 INT 21H 000001A5 C3 RET 000001A6 PRINT_NAME ENDP ;-------------------------------------------------- 01A6 CODESEG ENDS END BEGIN
Forums:
참고자료입니다.
http://support.microsoft.com/?scid=kb%3Ben-us%3B92611&x=6&y=10
간단히 말해서 현재 32-bit 모드로 동작하고 있다고 가정해서 코드를 생성하고
있기 때문에 16-bit, 8-bit register 접근에서 문제가 발생하는겁니다.
답변 감사드립니다
답변 감사드립니다 ^^
이전에 어셈블리어를 공부하다가 포기했었는데
얼마전 다시 시작해서 지금은 아주 재미있게 하고 있습니다!
댓글 달기