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