.code/.data 和 code/data 段有什么区别?

What is the difference between .code/.data and code/data segment?

我的导师给了我一个特定的程序代码,使用汇编语言(8086 微处理器指令)中的冒泡排序对一组数据进行排序。 对于之前的所有代码,我都使用了语法:

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

老师给出的代码如下:

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 

我不明白为什么 data segmentcode segment 分别被 .data.code 替换并且(显然)没有必要结束这些片段.此外,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 指令之间的区别以及何时使用哪一个。

如果你没有使用指令 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 以一种只适合一个段的方式组织程序,并且行为不同。如果您不使用此指令,那么您的程序是一个 "standard" 可执行文件 (DOS),被分段分隔。

实际上,无论有无org 100h.

,您都应该手动结束汇编程序以确保一切正常

哦,是的,关于你的问题,“.data/.code 和 data segment/code 段指令之间没有显着差异”,我想到的唯一区别是你必须关闭当您使用 code segment.code 不需要它时。无限循环不是由 code segment 替换 .code 引起的,问题是将控制权正确地返回给 OS。因此,您可以根据需要使用 .codecode segment