2017-03-20 8 views
3

강사가 특정 프로그램 코드를 제공하여 어셈블리 언어로 버블 정렬 (8086 마이크로 프로세서 지침)을 사용하여 일련의 데이터를 정렬했습니다. 이전의 모든 코드의 경우 내가 구문을 사용했다 :.code/.data와 code/data 세그먼트의 차이점은 무엇입니까?

DATA SEGMENT 
    <DATA HERE> 
DATA ENDS 
CODE SEGMENT 
    ASSUME DS:DATA, CS:CODE 
    START: 
     <CODE HERE> 
    CODE ENDS 
END START 

내 강사에 의해 주어진 코드는 다음과 같습니다 다음 data segmentcode segment 각각 .data.code로 대체 이유

org 100h 
.data 

array db 9,6,5,4,3,2,1 
count dw 7 

.code 

mov cx,count  
dec cx 

nextscan:   
mov bx,cx 
mov si,0 

nextcomp: 

mov al,array[si] 
mov dl,array[si+1] 
cmp al,dl 

jnc noswap 

mov array[si],dl 
mov array[si+1],al 

noswap: 

inc si 
dec bx 

jnz nextcomp 

loop nextscan 

mov cx,7 
mov si,0 

print: 

mov al,array[si] 
add al,30h 
mov ah,0eh 
int 10h 
mov ah,2 
mov dl , ' ' 
int 21h 
inc si 
loop print  

ret 

내가 이해하지 못했다 (분명히) 그 세그먼트를 끝낼 필요가 없다는 것을 의미합니다. 또한 assume 지시문이 없으며 프로그램이 계속 정상적으로 작동합니다. 정말 내가 (나는 잘 알고 있었는지에 변경된 구문) 아래 그림과 같이 프로그램을 수정하는 경우, 프로그램이 작동하지 않았다이었다 혼동 무엇 : 실행하는 동안 위의 코드는 무한 루프에 결과

data segment 

array db 9,6,5,4,3,2,1 
count dw 7 

data ends 

code segment 

assume ds:data, cs:code 

start: 
mov ax,data 
mov ds,ax 
mov cx,count  
dec cx 

nextscan:   
mov bx,cx 
mov si,0 

nextcomp: 

mov al,array[si] 
mov dl,array[si+1] 
cmp al,dl 

jnc noswap 

mov array[si],dl 
mov array[si+1],al 

noswap: 

inc si 
dec bx 

jnz nextcomp 

loop nextscan 

mov cx,7 
mov si,0 

print: 

mov al,array[si] 
add al,30h 
mov ah,0eh 
int 10h 
mov ah,2 
mov dl , ' ' 
int 21h 
inc si 
loop print  

ret 

code ends 
end start 

. 도움이된다면 emu8086을 사용합니다. .data/.codedata segment/code segment 지시어의 차이점을 이해하고 어느 것을 사용해야하는지에 대한 도움이 필요합니다.

+0

'.org 0100h'은 .com처럼 보입니다. .org 다음에 "jmp start"를 추가하고 첫 번째 명령 (.code 바로 다음) 앞에 "start :"레이블을 추가하십시오. btw : '.com'은 단순화 된 64k 설정을 사용하며 CS = DS라고 가정합니다. – Tommylee2k

+0

죄송합니다. 새 어셈블리입니다. 따라서 ".org 0100h는 무엇을 의미하는지 이해하지 못했습니다. com. " 또한 단순화 된 64k 설정의 의미는 무엇입니까? – 50calrevolver

+1

emu8086으로 무한 루프에 부딪혔을 때, 실제 PC가 아니기 때문에 매우 운이 좋았습니다. (다시 199x에 리셋 버튼을 눌러야하고, OS가 부팅 될 때까지 기다렸다가 모든 물건을 다시로드 할 때까지 기다렸다가 희망을 가지지 않았 으면합니다.) 마지막 버전을 디스크/플로피에 저장하는 것을 잊지 마십시오.) 한편 emu8086에서는 시뮬레이션을 다시 시작하고 단일 명령어 당 디버거에서 단계별로 진행합니다. 아마 세그먼트 레지스터의 셋업은 잘못되었지만 당신의 소스로부터 그것은 당신의 버전이 실제로 강사보다 견고 해 보였으므로, 디버거에서 체크 아웃 할 수 있다면 감사하겠다. mem의'array'는 어디에 있겠는가? . – Ped7g

답변

3

당신이 org 100h 다음 수동으로 프로그램을 종료하는 데 필요한 지시어를 사용하므로이 같은 ret 교체하지 않는 경우 :

int 21h 
inc si 
loop print  

;ret 
mov ax, 4c00h  ;◄■■ END PROGRAM PROPERLY AND 
int 21h   ;◄■■ RETURN CONTROL TO OS. 

code ends 
end start 

이 지침 org 100h는 단지 하나 개의 세그먼트에 맞는 방법으로 드 프로그램을 구성하고을 그 행동은 다르다. 이 지시문을 사용하지 않으면 프로그램은 세그먼트로 구분 된 "표준"실행 파일 (DOS)입니다.

사실 조립품 프로그램을 수동으로 끝내야 org 100h의 유무에 관계없이 모든 것이 올바르게 수행됩니다.

아, 네 질문에 대해서는 ".data/.code와 데이터 세그먼트/코드 세그먼트 지시어"사이에 큰 차이가 없습니다. 내 마음에 오는 유일한 차이점은 세그먼트를 닫아야한다는 것입니다. code segment을 사용하고 .code을 필요로하지 않습니다. 무한 루프가 .codecode segment으로 바꾸지 않아서 문제가 제어권을 OS로 올바르게 반환하고있었습니다. 따라서 .code 또는 code segment을 원하는대로 사용할 수 있습니다.

+1

고마워. 이것은 정말로 도움이되었고, 이제 저는 어셈블리를 훨씬 더 자세히 이해합니다. 나는 당신의 답을 기초로 모든 의구심을 해소 할 수 있습니다. – 50calrevolver