gpt4 book ai didi

assembly - .code/.data 和 code/data 段有什么区别?

转载 作者:行者123 更新时间:2023-12-03 02:37:41 24 4
gpt4 key购买 nike

我的老师给了我一个特定的程序代码,用于使用汇编语言(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.code分别并且(显然)不需要结束这些片段。此外,假设不存在指令,程序仍然可以正常工作。真正让我困惑的是,当我如下修改程序(将语法更改为我熟悉的语法)时,程序不起作用:

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/.codedataegment/codesegment 指令之间的区别以及何时使用哪一个。

最佳答案

如果您没有使用指令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以一种仅适合一个段的方式组织程序,并且行为不同。如果您不使用此指令,那么您的程序就是一个以段分隔的“标准”可执行文件 (DOS)。

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

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

关于assembly - .code/.data 和 code/data 段有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42905762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com