Добавление к ответу Анатолия:
В принципе, на уровне сборки нет конфликта.
Информация в компьютере кодируется в битах (один бит = ноль или один), иecx
- это 32 бита информации, больше ничего.
Независимо от того, интерпретируете ли вы старший бит как знак или нет, это соответствует следующему коду, т. е. на уровне сборки вполне допустимо использовать movsx
длярасширить значение (в виде знака), даже если позже вы интерпретируете его как битовую маску или беззнаковое целое.
Наличие конфликта на логическом уровне зависит от запланированной функциональности автора.Если автор действительно хотел, чтобы этот тест против arg_0
не ветвился, если var_8
является "отрицательным" значением и arg_0
<2 <sup>31 , то код правильный.
Кстатив разборке отсутствует информация о размере аргумента в первом movsx
, поэтому средство дизассемблирования, вызывающее это, сбивает с толку (в противном случае это хорошо? Будьте осторожны).
Итак, подписано ли var_8 илибез знака?А как насчет arg_0?
var_8
является первым и главным адресом памяти, и оттуда используется 8 или 16 бит информации (непонятно из вашей разборки, какой именно) - в "подписано" путь.Но трудно рассказать больше о var_8
без изучения полного кода, это может быть даже var_8
32-битная беззнаковая int "переменная", но по какой-то причине автор решает использовать только расширенные синг-младшие 16 битсодержание в этом первом movsx
.arg_0
затем используется как 32-разрядное целое число без знака для инструкции cmp
.
В сборке вопрос не столько в том, является ли var_8
со знаком или без знака, вопрос в сборке состоит в том, сколько битовинформация, которая у вас есть и где, и как интерпретировать эти биты с помощью следующего кода.
В этом гораздо больше свободы, чем в C или других языках программирования высокого уровня, например, если в памяти имеется четыре байтовых счетчика.Вы знаете, что для каждого из них меньше 200, и вы хотите увеличить первый и последний из них, вы можете сделать это:
.data
counter1: db 13
counter2: db 6
counter3: db 34
counter4: db 17
.text
...
; increment first and last counter in one instruction
; overflow not-expected/handled, counters should to be < 200
add dword [counter1],0x01000001
Теперь (представьте себе), как вы будете интерпретировать это при разборе такого кода, не имея оригинальные комментарии из источника выше?Будет сложно, если из другого кода вы не поймете, что counter1-4
используются как отдельные счетчики байтов, и это оптимизация скорости для увеличения двух из них в одной инструкции.