.MODEL SMALL
.STACK 64
.DATA
LIST1 DB 1H,0ABH,2H,3AH,12H,0DAH
LIST2 DB 3H,7H,0BCH,0A8H,0C2H,0DAH
LIST3 DB 6 DUP (?)
.CODE
MAIN PROC FAR
MOV AX, @data
MOV DS, AX
MOV CX,6H
LEA SI,LIST1
LEA BX,LIST2
LEA DI,LIST3
A1: MOV AL,[SI]
ADD AL,BX
MOV [DI],AL
INC SI
INC BX
INC DI
LOOP A1
我想比较list1& list2并将更大的数字放在list3中。怎么做?
答案 0 :(得分:0)
这是另一个A1
循环。我认为您的设置说明没问题。我假设英特尔语法在操作数排序上有说明。
A1:
MOV AL,[SI] ; get the next byte from LIST1
ADD AH,[BX] ; get the next byte from LIST2
CMP AL,AH ; compare bytes from 1 & 2
JGT BIGGER2 ; jump if LIST1 byte > LIST2 byte
MOV [DI],AL ; move LIST1 byte to LIST2
JMP NEXT
BIGGER2:
MOV [DI],AH ; move LIST2 byte to LIST3
NEXT:
INC SI ; point to next LIST1 byte
INC BX ; point to next LIST2 byte
INC DI ; point to next LIST3 byte
LOOP A1 ; go to the top for the next byte
在解决这样的问题时,您实际上可以从写出评论开始。如果您自己接受上述评论,它们会形成您想要做的英语的低级步骤。然后,您可以将这些步骤转换为所需的汇编语言。然后,您还可以根据需要进行优化。
[编辑]
另请注意,正如@Powerslave在他的回答中所示,您可以使用内置的x86“字符串”指令cmpsb
来缩短这一点。假设si
和di
指向了源列表和目标列表。
另外,以下内容将LIST1
和LIST2
的SUM放入LIST3
。请注意,您为LIST3
分配了字节,但是当您对LIST1
和LIST2
元素求和时,如果将它们保留为字节,则会出现溢出。所以我将使用单词作为总和:
LIST3 DW 6 DUP (?)
...
CLR AH
A1:
MOV AL,[SI] ; get the next byte from LIST1
MOV [DI],AX ; move the value (byte) to LIST3
MOV AL,[BX] ; get the value (byte) from LIST2
ADD [DI],AX ; add the LIST2 value to LIST3 (word)
INC SI ; point to next LIST1 byte
INC BX ; point to next LIST2 byte
ADD DI,2 ; point to next LIST3 word
LOOP A1 ; go to the top for the next byte
答案 1 :(得分:0)
解决方案是
; ES == DS
lea si,[LIST1]
lea di,[LIST2]
lea bx,[LIST3]
mov cx,LENGTH_OF_LISTS
inspect_lists:
cmpsb
jg first_is_greater ; Use JA instead for unsigned integers
mov al,[byte ptr es:di + 0]
jmp store_result
first_is_greater:
mov al,[byte ptr ds:si + 0]
store_result:
mov [byte ptr ds:bx + 0],al
inc bx
loop inspect_lists
inspect_lists
应该是您的A1
循环。
cmpsb
,在一步中,将[DS:SI]
与[ES:DI]
进行比较(基本上是虚拟cmp [byte ptr ds:si],[byte ptr es:di]
)并递增(如果{{1}则递减}是1)DF
和SI
指针,这样你就不用担心它们了。
您仍需要调整DI
才能遍历BX
。
除此之外唯一要做的就是决定在LIST3
...