【问题标题】:What is the difference between .code/.data and code/data segment?.code/.data 和 code/data 段有什么区别?
【发布时间】:2017-08-11 20:36:34
【问题描述】:

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

【问题讨论】:

  • .org 0100h 在我看来就像一个 .com。在 .org 之后添加一个“jmp start”,在您的第一个命令之前添加一个标签“start:”(就在 .code 之后)。顺便说一句:“.com”使用简化的 64k 设置,并假设 CS = DS
  • 对不起,我是汇编新手,因此我不明白“.org 0100h 看起来像 .com”是什么意思。另外,简化的 64k 设置是什么意思?
  • 当你用emu8086无限循环时,你很幸运,因为它不是一台真正的PC(早在199x我们不得不按下重置按钮,等到操作系统启动,加载所有东西回来,希望我们不要忘记将最后一个版本保存到磁盘/软盘)。同时,在 emu8086 中,只需重新启动模拟,并在调试器中按单条指令逐步进行。段寄存器的设置可能出错了,但从你的来源我不清楚为什么,你的版本看起来实际上比讲师更可靠,所以如果你能在调试器中检查它,我将不胜感激,array in mem .
  • 一些注意事项 - 关于 (emu8086) 汇编器:segment.code 和类似的不是指令,而是汇编器指令,因此请务必检查汇编器的文档。也就是说,我从来没有在网上找到任何像样的 emu8086 文档(I found 看起来总是不完整,而且对我的口味不够准确),所以我宁愿不触摸/使用它。您可以通过使用旧的 tasm/masm 文档来达到一定程度,因为 emu8086 正在部分模拟它们(顺便说一句,它完全忽略了 ASSUME 指令,我实际上将其视为积极的事情)。
  • 非常感谢 Ped7g,非常需要和详细的解释。

标签: assembly x86-16 microprocessors emu8086


【解决方案1】:

如果你没有使用指令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 segment.code 不需要它。将.code 替换为code segment 不会导致无限循环,问题是正确地将控制权返回给操作系统。所以你可以随意使用.codecode segment

【讨论】:

  • 非常感谢。这真的很有帮助,现在我更详细地了解了装配。根据您的回答,我能够消除我所有的疑问。
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2018-06-11
相关资源
最近更新 更多