Сравнение двух значений на языке ассемблера с использованием SASM

#assembly #compare #comparison #sasm

#сборка #Сравнить #сравнение #sasm

Вопрос:

Сейчас я работаю над проектом, в котором мне нужно выполнить умножение матрицы. Я указал в комментарии в приведенном ниже коде, что я не могу изменить указанные переменные и их тип. Поэтому я не могу переключиться на макрос section .resb и должен использовать section .data. Я пытаюсь протестировать программу, сравнивая rA и cB сначала перед выполнением операции.

Я решил распечатать строки, чтобы проверить, работает ли программа так, как задумано. По-видимому, программа считает, что две переменные, которые я сравниваю, не равны, когда предполагается, что все наоборот. Я неправильно EAX использовал и EBX ?

 %include "io.inc"
section .data
;Below variables are to be used. 
rA db 2

cA db 3

matrixA db 2,3,4

        db 1,0,0

rB db 3

cB db 2

matrixB db 0,127

        db 1,100

        db 0,10
section .text
global CMAIN
CMAIN:
    mov ebp, esp; for correct debugging
    ;write your code here
    
    lea eax, [rA]
    lea ebx, [cB]
    
    mov ax, [eax]
    mov bx, [ebx]
    
    
    cmp ax, bx ;this line is supposed to compare if both digits are equal
    JE bothEqual
    JNE notEqual
    
bothEqual:
    PRINT_STRING "Can be multiplied"
    NEWLINE
    
    PRINT_DEC 1, eax 
    NEWLINE
    PRINT_DEC 1, ebx
    jmp FINISH

notEqual:
    PRINT_STRING "Can not be multiplied"
    NEWLINE
    
    PRINT_DEC 1, eax ; Check the value of eax. [In this case, the expected value of eax = 2 but program prints 770]
    NEWLINE
    PRINT_DEC 1, ebx  ; Check the value of ebx. [In this case, the expected value of ebx = 2 but program prints 2]
    jmp FINISH 
    
FINISH:
    nop
    xor eax, eax
    ret
 

Комментарии:

1. Я попытался удалить двойные скобки, но это приводит только к сообщению об ошибке error: invalid combination of opcode and operands .

2. Извините, я виноват. При ближайшем рассмотрении … все ваши rA , rB , cA и cB определяются как байты с db , но вы перемещаете и сравниваете 16-битные значения, например, mov ax, [eax] и cmp ax, bx . Вы должны использовать mov al, [eax] и mov bl, [ebx] затем cmp al, bl . Или вы можете оставить инструкции в покое и определить эти элементы с dw помощью вместо db .