2014-01-21 3 views
3

내 교과서에 사용 된 어셈블리 구문이 너무 많은 문제가 발생하는 이유는 윈도우 8이해 조립 구문 문제 2013

.MODEL SMALL 
    .586 

    .STACK 100h 

    .DATA 
    Message DB 'Hello, my name blank', 13, 10, '$' 

    .CODE 
Hello PROC 
    mov ax, @data 
    mov ds, ax 
    mov dx, OFFSET Message 
    mov ah, 9h 
    int 21h 
    mov al, 0 
    mov ah, 4ch 
    int 21h 
Hello ENDP 

    END Hello

를 사용할 때 너무 많은 시행 착오 후, 난 여전히 몇 가지 문제 이해하기 처음에는 명령 프롬프트와 올바른 링커를 사용하여 masm32로 코드를 실행 해 보았습니다. 그런 다음 Visual Studio 2013을 사용해 보았습니다. 심지어 Visual Studio 내에서 masm32를 사용합니다. 매번 비슷한 문제가 발생합니다. 어셈블러에는 @data 줄에 문제가 있으며 Hello에 대한 밑줄이 없습니다. 후자를 수정하면 불일치 한 블록에만 문제가 발생했습니다.

MS-DOS 가상 환경을 사용하여 해결 방법을 찾았으며 .586 명령을 제거한 후에 코드가 올바르게 작동했습니다.

주요 문제가 x64 OS 환경에서이 코드를 실행하려고했으나 여전히 언어를 배우는 것으로 보았 기 때문에 초기에 실행할 수없는 이유에 대한 다른 의견을 듣고 싶습니다.

우리가 사용하는 책은 IBM PC 제품군 3 판의 Jones, 어셈블리 언어입니다.

+2

코드는 64 비트 아키텍처에서 더 이상 기본적으로 지원되지 않습니다. 이를 위해서는 DOS 에뮬레이터가 필요합니다. – Devolus

+1

정확하게이 코드를 16 비트 대 32 비트로 만드는 것은 무엇입니까? 새로운 아키텍처에서 특정 명령어를 사용할 수 없게 만드는 요인은 무엇입니까? 솔직히 어셈블리를 배우기 시작 했으므로 사소한 질문처럼 보일지 모르겠지만 구문 사용법을 이해하는 데 정말 매료됩니다. – Los

+0

당신이 알고 있어야하는 코드를 작성했다면. 어쨌든'int 21h '를 사용하는 것은 16 비트의 DOS 프로그램을 작성하고 있다는 것을 의미합니다. – Devolus

답변

0

32 비트 링커를 사용하고 있습니다. masm32/bin에서 link16이라는 16 비트 링커를 사용해야 코드를 연결할 수 있습니다.

-then-

link16 filename.obj 
0

16 비트 및 32 비트 addressmode 차이

ml /c /Fl filename.asm 

우리 codesegment 및 어셈블러 operandsize 사용 방법 내측 피연산자/레지스터 어드레스의 기본 사이즈 및 주소 크기 접두어.

16 비트 주소 모드에서 기본 크기는 16 비트이고 16 비트 주소 모드에서 32 비트 레지스터/피연산자 및/또는 32 비트 주소를 사용하려는 경우 어셈블러는 피연산자 및/또는 모든 32 비트 명령어에 프리픽스 adddresssize. 그러나 16 비트 주소 모드에서 16 비트 명령어 만 사용하는 경우 operandize 및/또는 adddresssize 접두사는 필요하지 않습니다.

32 비트 주소 모드에서 기본 크기는 32 비트이고 32 비트 주소 모드에서 32 비트 레지스터/피연산자 및/또는 32 비트 주소를 사용하려면 어셈블러에서 피연산자 및/또는 32 비트의 모든 명령어에 adddresssize 접두어를 붙이십시오. (대개 32 비트 명령어를 사용하는 경우 코드의 바이트 수를 최소화하는 것이 좋습니다.)하지만 32 비트 주소 모드에서 16 비트 명령어를 사용하면 어셈블러는 operandsize 및/또는 adddresssize 프리픽스를 배치해야합니다 .

추가 두 가지 주소 모드에 대해 서로 다른 코드 부분을 갖고 싶다면 두 가지 어셈블러 지시문 (use16 및 use32)을 사용하여 코드가 작성된 주소 모드를 결정하십시오. 양쪽 옆 addressmodes

..

또한 실제 모드 및 보호 모드 사이에 큰 차이가있다. 16 비트 주소 모드 (시작시 기본값)와 함께 사용되는 realmode의 경우 기본 세그먼트 크기가 64KB 세그먼트가되고 모든 주소가 segmentregister의 세그먼트 부분 및 주소를 작성하기위한 오프셋 부분과 함께 계산됩니다. 보호 모드의 경우 우리는 사용하려는 세그먼트의 크기를 지정하기 위해 전역 및/또는 로컬 설명자 테이블을 사용해야합니다.마침내

...

기본 운영 시스템의 아키텍처 것은 우리에게 우리가 우리의 코드와 어떤 소프트웨어 인터럽트를 사용하기 위해 aviable이다 조립해야한다는의 대상에 대한 요구 사항을 제공합니다.

더크