Arrays 如何比较汇编语言(x86)上的两个数组?
我想比较列表1和列表2,并将较大的数字放入列表3。如何做到这一点?这里有一个可选的Arrays 如何比较汇编语言(x86)上的两个数组?,arrays,assembly,x86,cmp,Arrays,Assembly,X86,Cmp,我想比较列表1和列表2,并将较大的数字放入列表3。如何做到这一点?这里有一个可选的A1循环。我想你的安装说明还可以。我假设指令的操作数排序采用英特尔语法 .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 F
A1
循环。我想你的安装说明还可以。我假设指令的操作数排序采用英特尔语法
.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
在解决这样的问题时,你实际上可以从写评论开始。如果你自己接受上面的评论,它们就构成了你想做什么的英语低级步骤。然后,您可以将这些步骤转换为所需的汇编语言。如果需要,您还可以进行优化
[编辑]
还要注意的是,正如@Powerslave在他的回答中所示,您可以使用内置的x86“string”指令cmpsb
将其缩短一点。假设源和目标列表由si
和di
指向
此外,下面将LIST1
和LIST2
的总和放入LIST3
。请注意,您为LIST3
分配了字节,但当对LIST1
和LIST2
元素求和时,如果将它们保留为字节,则会出现溢出。因此,我将用文字来表示总数:
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
解决办法是
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
inspect\u列表
应该是您的A1
循环
cmpsb
在一个步骤中,将[DS:SI]
与[ES:DI]
(本质上是一个虚拟的
cmp[byte ptr DS:SI],[byte ptr ES:DI]
)指针进行比较,并对SI
和DI
指针进行递增(如果DF
为1,则递减),这样您就不必担心它们了
您仍然需要调整BX
,以便迭代LIST3
除此之外,唯一要做的事情是决定存储在
[DS:BX]
..从列表1
和列表2
中的每一个加载一个值,比较它们,将第二个值移到第一个值,如果较大,则将其存储在列表3
,重复。您的BX
值从值LIST2
开始,然后将其添加到从LIST1
检索到的值中。听起来不对。并且没有CMP
指令,因此您没有比较任何值。我可以将add语句放在哪里?我必须添加列表1和列表2的内容并将其存储在list3@OliviaSkye很抱歉,您原来的帖子说您需要将两者中较大的一个放入列表3
。我再加上另一个箱子。
; 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