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