У меня есть следующий метод C, который принимает два 16-битных коротких Интс и:Доступ к флагам без встроенной сборки?
- добавляет два целых числа
- Если флаг переноса установлен, добавить 1 к результату
- NEGATE (НЕ) все биты в конечных результатах
возвращает результат:
short __declspec(naked) getchecksum(short s1, short s2) { __asm { mov ax, word ptr [esp+4] mov bx, word ptr [esp+8] add ax, bx jnc skip_add add ax, 1 skip_add: not ax ret } }
Мне пришлось написать это в встроенной сборке, потому что я не знаю, как протестировать флаг переноса, не используя ассемблер. Кто-нибудь знает, как это сделать?
Хотя не ответ на ваш вопрос, не могли бы вы использовать 'АЦП топором, 0' и удалите 'jnc skip_add',' add ax, 1', 'skip_add:'. 'adc ax, 0' добавит' 0' к 'ax', а затем добавит 1 к этому результату, если установлен флаг переноса. Еще одна проблема с кодом заключается в том, что 'bx' изменяется, а соглашения о вызовах' cdecl' требуют, чтобы функция bx' сохранялась вызываемой функцией (то есть 'push/pop bx') или использовала регистр, который не нужен сохраняются функцией (например, 'cx' или' dx'). Вы можете написать 'add ax, bx', чтобы устранить необходимость в' bx' с 'add ax, word ptr [esp + 8]' и удалить 'mov' в' bx' вообще –