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

4

2 回答 2

0

这是一个替代A1循环。我认为您的设置说明没问题。我假设 Intel 语法对指令的操作数排序。

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

此外,以下将 和 的LIST1SUMLIST2放入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
于 2013-09-12T12:25:37.787 回答
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]
(本质上是一个 virtual cmp [byte ptr ds:si],[byte ptr es:di])和递增(或递减,如果DF为 1)SIDI指针进行比较,这样您就不必自己担心它们。

您仍然需要调整BX才能迭代LIST3.

除此之外,唯一要做的就是决定将哪个值存储在[DS:BX]...

于 2013-09-12T12:43:56.950 回答