是的,我已经彻底搜索了整个地方的互联网以寻求帮助。不,我对装配一无所知。我进入课程一周(微处理器),老师是一个疯狂的精神病患者,认为他生气,因为我们都是初学者。
无论如何,我必须提出一个ASM代码(对于emu8086),它将在任何给定大小的数组中找到最小值和最大值。在示例代码中,他提供(看起来是什么)包含名为LIST的数组的数据段。他声称他将用其他不同大小的列表替换此列表,我们的代码必须能够处理它。
以下是示例代码。我已经突出了我添加的部分,只是为了向您展示我已尽力解决这个问题:
; You may customize this and other start-up templates;
; The location of this template is c:\emu8086\inc\0_com_template.txt
org 100h
data segment
LIST DB 05H, 31H, 34H, 30H, 38H, 37H
MINIMUM DB ?
MAXIMUM DB ?
AVARAGE DB ?
**SIZE=$-OFFSET LIST**
ends
stack segment **;**
DW 128 DUP(0) **; I have NO CLUE what this is supposed to do**
ends **;**
code segment
start proc far
; set segment registers:
MOV AX,DATA **;**
MOV DS,AX **;I'm not sure what the point of this is, especially since I'm supposed to be the programmer, not my teacher.**
MOV ES,AX **;**
; add your code here
**;the number of elements in LIST is SIZE (I think)
MOV CX,SIZE ;a loop counter, I think
;find the minimum value in LIST and store it into MINIMUM
;begin loop
AGAIN1:
LEA SI,LIST
LEA DI,MINIMUM
MOV AL,[SI]
CMP AL,[SI+1]
If carry flag=1:{I got no idea}
LOOP AGAIN1
;find the maximum value in LIST and store it into MAXIMUM
;Something similar to the other loop, but this time I gotta find the max.
AGAIN2:
LEA SI,LIST
LEA DI,MINIMUM
MOV AL,[SI]
CMP AL,[SI-1] ;???
LOOP AGAIN2
**
; exit to operating system.
MOV AX,4C00H
INT 21H
start endp
ends
end start ; set entry point and stop the assembler.
ret
答案 0 :(得分:3)
我不是肯定的,但我想你想在LIST变量之后立即移动SIZE变量:
data segment
LIST DB 05H, 31H, 34H, 30H, 38H, 37H
SIZE=$-OFFSET LIST
MINIMUM DB ?
MAXIMUM DB ?
AVARAGE DB ?
ends
它的作用是给出当前地址($)和LIST变量开头之间的字节数 - 从而为您提供列表变量本身的大小(以字节为单位)。因为LIST是一个字节数组,SIZE将是数组的实际长度。如果LIST是一个WORDS数组,则必须将SIZE除以2。如果你的老师写了那段代码,那么也许你应该不管它。
我不清楚为什么你的老师做了一个堆栈段,我想不出任何使用它的理由,但也许它将在未来的任务中变得清晰。现在,您可能应该知道DUP是复制的简写。这行代码:
DW 128 DUP(0)
将128个字的内存初始化为0。
以下代码行:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
正在设置指针,以便您可以遍历LIST。您需要知道的是,此时,AX指向数据段的开头,因此指向LIST的开头。
至于其余的......看起来你有无穷无尽的循环。你需要做的是: