Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何比较汇编语言(x86)上的两个数组?_Arrays_Assembly_X86_Cmp - Fatal编程技术网

Arrays 如何比较汇编语言(x86)上的两个数组?

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

我想比较列表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    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