Intereting Posts
Какая фактическая разница между обновлением пакета и обновлениями безопасности? Удаление Deepin DE от Ubuntu 16.04 LTS Как заставить систему объявить время в верхней части часа с помощью eSpeak Как установить ограниченные дополнительные функции ubuntu, но не затухать? dropbox slow on ubuntu 14.04 Как я могу сделать учетную запись моего клиента без пароля автоматически пытаться подключиться к любой открытой беспроводной сети? Как я могу предоставить проводные соединения с Интернетом при отключении беспроводной сети? Пусть GNOME-Shell действует как Unity путем поиска файлов или нажатия клавиши ALT Grub не может установить – core.img «необычно большой» Linux Anti-Virus Почему в Launcher есть зарезервированное место? В окне диспетчера настроек нет настроек звука Переименуйте файл в имя родительского каталога в терминале Сколько стоит Ubuntu? почему файлы samba share не могут получить доступ некоторым пользователем в течение некоторого времени?

Почему мое сравнение с регистром не работает в Ассамблее NASM?

Изучение сборки NASM в 32-битном Ubuntu.

Это дает мне головные боли: предположим, что у меня есть массив (я называю его вектором в программе) в .data :

 vector db 1,2,3,4 size equ $-vector 

И у меня также есть номер 0 :

 index db 0 

Я хочу сохранить size в EBX , а затем сохранить index в ECX и, наконец, проверить, если ECX < EBX . В этом примере это будет 0 < 4 . Моя программа просто не делает этого:

 SECTION .data vector db 1,2,3,4 size equ $-vector index db 0 ; Vocabulary msg1 db "ECX = EBX",10 msg2len equ $-msg2 SECTION .text global main main: ; ----------------------------------------------- ; MAIN ; ----------------------------------------------- mov EBX,size ; EBX = 4 mov ECX,[index] ; ECX = 0 call check ; Check ECX < EBX (0 < 4) ; ----------------------------------------------- ; EXIT ; ----------------------------------------------- mov EAX,1 int 0x80 ; ----------------------------------------------- ; Check ; Checks whether ECX < EBX ; ----------------------------------------------- check: cmp ECX,EBX jge greater_or_equal mov EAX,4 mov EBX,0 mov ECX,msg1 mov EDX,msg1len int 0x80 jmp end_check greater_or_equal: mov EAX,4 mov EBX,0 mov ECX,msg2 mov EDX,msg2len int 0x80 end_check: ret 

Он выводит:

ECX> = EBX

Но это не так. ECX должен быть 0, а EBX – 4.

Я не вижу проблемы, но у меня есть наблюдение:

 mov EBX,size 

Эта строка меня беспокоит – я хотел сделать это:

 mov EBX,[size] 

Но я получаю ошибку сегментации. Я не знал, что это произойдет, но я предполагаю, что это потому, что size не является адресом – это просто номер, поэтому я не могу использовать скобки на нем. Возможно, я ошибаюсь (в этом случае это может быть причиной проблемы).

 index db 0 msg1 db "ECX < EBX",10 mov ecx, [index] 

index определяется как db , поэтому команда переместится в ecx этот 0 и еще 3 байта из msg1

Использование:

 index dd 0