Сборка NASM - И Маска - PullRequest
       24

Сборка NASM - И Маска

0 голосов
/ 27 апреля 2019

Когда я запускаю эту программу, она говорит:

jdoodle.asm: 9: ошибка: недопустимая комбинация кода операции и операндов

Проблема в том, что AND, ах. Остальная часть кода должна быть правильной, мне просто нужно знать, как решить эту проблему, потому что, как мне кажется, я не могу сделать AND между двумя регистрами.

section .text
global _start
_start:
    call _input
    mov al, input
    mov ah, maschera
    and al, ah
    mov input, al
    call _output
    jmp _exit

_input:
    mov eax, 3
    mov ebx, 0
    mov ecx, input
    mov edx, 1
    int 80h
    ret

_output:
    mov eax, 4
    mov ebx, 1
    mov ecx, input
    mov edx, 1
    int 80h
    ret

_exit:

mov eax, 1

int 80h

section .data
maschera: db 11111111b

segment .bss
input resb 1

1 Ответ

1 голос
/ 27 апреля 2019

Синтаксис MASM / TASM / JWASM отличается от синтаксиса NASM.Если вы хотите загрузить / сохранить данные по адресу, вам нужно явно использовать квадратные скобки.Если вы хотите использовать инструкцию MOV, чтобы поместить адрес метки в переменную, вы не должны использовать квадратные скобки.Квадратные скобки похожи на оператор удаления ссылок.

В 32-битном коде вы хотите убедиться, что адреса загружены в 32-битные регистры.Любой адрес выше 255 не помещается в 8-байтовом регистре, любой адрес выше 65535 не помещается в 16-битном регистре.

Код, который вы, вероятно, искали:

section .text
global _start
_start:
    call _input
    mov al, [input]
    mov ah, [maschera]
    and al, ah
    mov [input], al
    call _output
    jmp _exit

_input:
    mov eax, 3
    mov ebx, 0
    mov ecx, input
    mov edx, 1
    int 80h
    ret

_output:
    mov eax, 4
    mov ebx, 1
    mov ecx, input
    mov edx, 1
    int 80h
    ret

_exit:

mov eax, 1

int 80h

section .data
maschera: db 11111111b

segment .bss
input resb 1
...