2013-01-02 3 views
0

어셈블리 언어를 배우려고하는데 배열에 쓰는 데 간단한 문제가 있습니다. 내 프로그램은 명령 줄 인수를 읽고이를 표시하고 배열에 써야합니다. 아래의 코드에는 하나의 표시된 선이 있습니다. 이 줄 주석으로 컴파일 된 컴파일 된 프로그램을 잘 작동하지만 주석 처리하지 않으면 몇 가지 문자를 표시 한 후 중단됩니다. 여기서 뭐가 틀린거야? 짧은 인수 행이있을 때 작동하지만이 배열은 전체 명령 줄을 포함 할만큼 충분히 커야합니다. 내가 여기서 뭔가를 놓치고 있니?어셈블리 언어로 배열에 쓰는 데 문제가 있습니다.

        assume cs:kod, ds:dane 

kod  segment 
.286 


start: 

mov  ax,seg wstos 
mov  ss,ax 
mov  sp,offset wstos        

xor  cx,cx 
xor  ax,ax  
mov  si,80h 
mov  dl,[si] 
mov  cl,dl 
mov  ah,2h 
int  21h 
inc  si 
xor  di,di 

petla: 
    inc  si 
    mov  dl,[si] 
    ;mov  [tablica + di],dl <<<< this line 
    test dl,dl 
    jz  sprawdz 
    int  21h 
    inc  di 
    dalej: 
loop petla 

sprawdz: 
    mov  al,[si+1] 
    cmp  al,0 
    jne  dalej 



koniecprogramu: 
mov  ax,4c00h 
int  21h 

dane segment 
    tablica  db 128 dup(0) 
dane ends 

stos1 segment STACK 
    dw 256 dup(?) 
    wstos dw ? 
stos1 ends 

답변

0

나는 offset tablica == 0 일뿐 아니라 ds == cs라고 생각합니다.

mov si, 80h 
mov al, [si]; 

가 준수하려면, 하나 DS가있는 경우에는 명령 줄이 mov al,cs:[si]에 액세스 할 수 있습니다 (초기화되어야한다, 또는 당신은 단순히을 남길 수 있습니다 :이 줄은 예상대로 작동하면 적어도 그것은이어야한다 데이터를 2 줄을 주석 처리하여 코드 세그먼트에 저장하십시오.

;dane segment 
    tablica  db 128 dup(0) 
;dane ends 
+0

도움 주셔서 감사합니다. 어제 나 스스로 그것을 실제로 풀었다. ;) 문제가 ds 레지스터를 초기화하지 못했습니다. 이제 모든 것이 정상적으로 작동합니다. 항상 명령이 나를 위해 그것을한다고 가정한다고 생각했습니다. 그럼 실제로이 명령은 무엇을하고 있습니까? 어디서나 찾을 수 없습니다. – Dcortez

+0

어셈블러가 레이블 (ds : segment)의 주소/오프셋을 계산하려고 할 때 assum 지시문의 매개 변수를 참조하여 수행합니다. 이것은 물론 ds가 가정 된 세그먼트의 값을 포함한다는 것을 전제로합니다. 포인터 (예 : di)가 byte, word, dword 또는 구조체를 가리키는 것으로 가정 할 수있는 invoke/call 매크로에도 사용됩니다. –

0

"MOV [tablica + 디]"ES에 대한 무엇을?

+0

예 ... 'ds'는 무엇입니까? 'start :'레이블 (아마도 필요하지는 않지만)에서 초기화 할 수 있지만 그렇지 않습니다. 'ds' 또는'es'를 초기화하십시오'assum' 지시어는 당신을 위해 이것을하지 않습니다 .. 시작시 DOS는'ds'와'es'를 PSP 세그먼트에 초기화합니다 - 명령 행 인자는 - 'tablica'는 안에있다. 데인. 하나의 케이스 또는 다른 케이스에서 세그먼트 재정의가 필요하다고 생각합니다. –

+0

안되요. 그는 여러 세그먼트를 가지고 있으므로 EXE 프로그램입니다. –

관련 문제