В целях отладки вы можете попробовать создать функцию, которая принимает аргументы для всех членов структуры, например:
/* Assumes g_curr_td is a global variable. */
void FillStruct( BYTE hour, BYTE minute, BYTE second, BYTE dom, BYTE month, BYTE year )
{
g_curr_td.year = year;
g_curr_td.month = month;
g_curr_td.dom = dom;
g_curr_td.hour = hour;
g_curr_td.minute = minute;
g_curr_td.second = second;
}
Использование такой функции должно сделать код ассемблера одинаковым независимо от того, используете ли вы значения из буфера или константные выражения. Если он все еще падает, возможно, это что-то с вашим буфером, даже если вы, кажется, проверили все углы, которые я мог придумать, имея дело с буфером.
Вы можете вызывать эту функцию как FillStruct( g_rx_buffer[3], g_rx_buffer[4], g_rx_buffer[5], g_rx_buffer[6], g_rx_buffer[7], g_rx_buffer[8] )
, а в случае сбоя вызывать ее как FillStruct( a, b, c, d, e, f )
, где a, b, c, d, e и f являются либо исходными аргументами, либо новыми константами. Попробуйте заменять аргументы по одному за раз и посмотрите, не сработает ли только одно конкретное поле или не сработает ли какое-либо поле.
РЕДАКТИРОВАТЬ: Кроме того, именно то, что ваш typedef
или #define
для типа BYTE
, какой компилятор и ОС вы используете, и вы используете какие-либо прагмы, например. упаковать структуру в байтовое выравнивание?