Два литерала ? Как в значениях постоянной времени сборки, таких как 1234
или 'Y'
? Обычно это бесполезно, потому что вы можете просто выяснить результат самостоятельно или использовать %if
, чтобы позволить ассемблеру сделать это во время сборки. т.е. оптимизировать cmp вместо написания инструкций, которые устанавливают и читают FLAGS.
Но если вы настаиваете, cmp
может принять не более одного непосредственного операнда, поэтому mov
- немедленно передаст другое константное число в регистр first.
mov eax, 'Y'
cmp AL, 'Y'
Устанавливает флаги:
- ZF = 1, потому что 'Y' - 'Y' = 0
- CF = OF = 0, потому что нет заимствовать и без переполнения со знаком
- SF = 0
(также пишутся PF и AF.)
re: ваш фактический код, который пытается Сравните результат ввода-вывода переменной времени выполнения с целочисленной литеральной константой 'Y'
Похоже, вы думаете, что вы можете read
байтов в регистре. Это не вариант. Системного вызова, эквивалентного getchar
, не существует. mov si, r9w
копирует содержимое (оставляя старшие 6 байтов RSI неизменными), не устанавливая SI = адрес R9W. Регистры не имеют адресов .
Считать в буфер (например, в стек) и затем загрузить его в регистр. Как читать входные данные из STDIN в сборке x86_64? Или использовать cmp
с операндом памяти.
Используйте strace ./my_program
, чтобы увидеть, какие системные вызовы вы делаете и какой код ошибки или успех они возвращают.
64-битное соглашение о вызовах не передает аргумент в RBX. Я думаю mov rbx, 0
это опечатка для mov edx, 2
. (Кажется, у вас тоже есть длина и аргументы FD.) Вы хотите RDI = fd = 0, RDX = length = 2. (Или больше, если пользователь вводит более длинную строку).
RSI должен указывать на память для read(int fd, void *buf, size_t len)
. У вас есть старшие 6 байтов RSI, установленные с адреса hot_cold
, но младшие 2 байта установлены в ноль при копировании r9w
без видимой причины. Это может заставить его вернуться -EFAULT
, или вы просто пишете куда-то еще в вашем .data
разделе.