我的讲师给了我一个特定的程序代码,用汇编语言中的冒泡排序(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 segment
和code 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
/ .code
和data segment
/ code segment
指令之间的区别以及何时使用哪一个。
答案 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
引起的,问题是正确地将控制权返回给操作系统。因此,您可以根据需要使用.code
或code segment
。