如何比较汇编语言(x86)中的2个数组?

时间:2013-09-12 09:07:04

标签: arrays assembly x86 cmp

    .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中。怎么做?

2 个答案:

答案 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来缩短这一点。假设sidi指向了源列表和目标列表。

另外,以下内容将LIST1LIST2的SUM放入LIST3。请注意,您为LIST3分配了字节,但是当您对LIST1LIST2元素求和时,如果将它们保留为字节,则会出现溢出。所以我将使用单词作为总和:

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)DFSI指针,这样你就不用担心它们了。

您仍需要调整DI才能遍历BX

除此之外唯一要做的就是决定在LIST3 ...

存储哪个值