.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 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
以一种只适合一个段的方式组织程序,并且行为不同。如果您不使用此指令,那么您的程序是一个 "standard" 可执行文件 (DOS),被分段分隔。
实际上,无论有无org 100h
.
,您都应该手动结束汇编程序以确保一切正常
哦,是的,关于你的问题,“.data/.code 和 data segment/code 段指令之间没有显着差异”,我想到的唯一区别是你必须关闭当您使用 code segment
而 .code
不需要它时。无限循环不是由 code segment
替换 .code
引起的,问题是将控制权正确地返回给 OS。因此,您可以根据需要使用 .code
或 code 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 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
以一种只适合一个段的方式组织程序,并且行为不同。如果您不使用此指令,那么您的程序是一个 "standard" 可执行文件 (DOS),被分段分隔。
实际上,无论有无org 100h
.
哦,是的,关于你的问题,“.data/.code 和 data segment/code 段指令之间没有显着差异”,我想到的唯一区别是你必须关闭当您使用 code segment
而 .code
不需要它时。无限循环不是由 code segment
替换 .code
引起的,问题是将控制权正确地返回给 OS。因此,您可以根据需要使用 .code
或 code segment
。