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

时间:2017-03-20 14:07:45

标签: assembly x86-16 microprocessors emu8086

我的讲师给了我一个特定的程序代码,用汇编语言中的冒泡排序(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指令之间的区别以及何时使用哪一个。

1 个答案:

答案 0 :(得分: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以一种只适合一个段并且行为不同的方式组织de program。如果你不使用这个指令,那么你的程序就是一个分段的“标准”可执行文件(DOS)。

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

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