Ваш текущий подход к проверке размера во время выполнения требует, чтобы ассемблер сгенерировал машинный код для всех возможных путей кода, даже тех, которые могут не быть приняты во время выполнения.
Если один или несколько из этих путей кода приводятв недопустимых комбинациях операндов, очевидно, что это не удастся.
Вам придется переместить проверку размера, чтобы она выполнялась во время компиляции. Что-то вроде:
IF SIZEOF theInt EQ SIZEOF BYTE
mov eax, 0
mov al, theInt
ELSEIF SIZEOF theInt EQ SIZEOF WORD
.. etc ..
ENDIF
call writeInt
Если вы согласны с расширением знака аргумента вместо расширения нуля, вы, вероятно, можете упростить все это до:
push theInt
pop eax
call writeInt
Редактировать: Этот подход не будет работать для аргумента r/m8
.