[asm] 프로세서 지시어의 위치에 따라서 다른 코드를 만들어냅니다

gurumong의 이미지

간단히 사용자의 이름을 입력받아서
화면을 지우고 문자열의 길이를 고려해서 모니터 중앙에 출력해주는 프로그램입니다
리얼 도스 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
grassman의 이미지

http://support.microsoft.com/?scid=kb%3Ben-us%3B92611&x=6&y=10

간단히 말해서 현재 32-bit 모드로 동작하고 있다고 가정해서 코드를 생성하고
있기 때문에 16-bit, 8-bit register 접근에서 문제가 발생하는겁니다.

gurumong의 이미지

답변 감사드립니다 ^^
이전에 어셈블리어를 공부하다가 포기했었는데
얼마전 다시 시작해서 지금은 아주 재미있게 하고 있습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.