.code/.data 和代码/数据段有什么区别



我的导师给了我一个特定的程序代码,使用汇编语言中的气泡排序(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组织 de 程序 以它只适合一个段的方式,行为是不同的。如果不使用此指令,则程序是按段分隔的"标准"可执行文件(DOS(。

实际上,您应该始终手动结束汇编程序,以确保一切正常,无论是否org 100h

哦,是的,关于您的问题,".data/.code 和数据段/代码段指令"之间没有显着区别,我想到的唯一区别是您在使用 code segment 时必须关闭段,而.code不需要它。无限循环不是为了用code segment替换.code引起的,问题是正确地将控制权返回给操作系统。因此,您可以根据需要使用.codecode segment

最新更新