Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MacBook Pro、Windows XP和VS 2008 Express Edition上原始C程序的损坏行为_C_Assembly_Visual Studio 2008_Windows Xp_Touchpad - Fatal编程技术网

MacBook Pro、Windows XP和VS 2008 Express Edition上原始C程序的损坏行为

MacBook Pro、Windows XP和VS 2008 Express Edition上原始C程序的损坏行为,c,assembly,visual-studio-2008,windows-xp,touchpad,C,Assembly,Visual Studio 2008,Windows Xp,Touchpad,我知道这很难相信,但我对此是100%认真的 当我在MacBook Pro(Core 2 Duo P8600)上用Visual Studio 2008 Express Edition在发行模式下编译下面的代码时,Windows XP Professional 32位SP3本机运行,运行可执行文件,只要我触摸触摸板(不是开玩笑),printf就会偶尔被点击,这绝对不会发生 有人能在他的MacBookPro(或任何其他笔记本电脑)上重现同样的问题吗?有人能在程序集中看到问题所在吗 我的猜测是触摸板驱动

我知道这很难相信,但我对此是100%认真的

当我在MacBook Pro(Core 2 Duo P8600)上用Visual Studio 2008 Express Edition在发行模式下编译下面的代码时,Windows XP Professional 32位SP3本机运行,运行可执行文件,只要我触摸触摸板(不是开玩笑),printf就会偶尔被点击,这绝对不会发生

有人能在他的MacBookPro(或任何其他笔记本电脑)上重现同样的问题吗?有人能在程序集中看到问题所在吗

我的猜测是触摸板驱动程序以某种方式操纵了负责浮点比较的寄存器。对于整数,问题不会发生

任何关于这里发生的事情的想法都是非常受欢迎的

#include <stdio.h>

int main()
{
    while (true)
    {
        float x = 1.0f;

        for (int i = 0; i < 50; i++)
        {
            if (0.0f < x)
                x = 0.0f;
        }

        if (x == 1.0f)
            printf("bad: %.2f\n", x);
    }

    return 0;
}
#包括
int main()
{
while(true)
{
浮动x=1.0f;
对于(int i=0;i<50;i++)
{
如果(0.0f
下面是上面代码的程序集列表,由Visual Studio 2008 Express Edition生成:

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

    TITLE   c:\Dokumente und Einstellungen\azad\Desktop\WeirdProblem\main.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat

INCLUDELIB MSVCRT
INCLUDELIB OLDNAMES

PUBLIC  ??_C@_0L@LNNNMCPH@bad?3?5?$CF?42f?6?$AA@    ; `string'
PUBLIC  __real@00000000
PUBLIC  __real@0000000000000000
PUBLIC  __real@3f800000
PUBLIC  _main
EXTRN   __imp__printf:PROC
EXTRN   __fltused:DWORD
;   COMDAT ??_C@_0L@LNNNMCPH@bad?3?5?$CF?42f?6?$AA@
; File c:\dokumente und einstellungen\azad\desktop\weirdproblem\main.cpp
CONST   SEGMENT
??_C@_0L@LNNNMCPH@bad?3?5?$CF?42f?6?$AA@ DB 'bad: %.2f', 0aH, 00H ; `string'
CONST   ENDS
;   COMDAT __real@00000000
CONST   SEGMENT
__real@00000000 DD 000000000r           ; 0
CONST   ENDS
;   COMDAT __real@0000000000000000
CONST   SEGMENT
__real@0000000000000000 DQ 00000000000000000r   ; 0
CONST   ENDS
;   COMDAT __real@3f800000
CONST   SEGMENT
__real@3f800000 DD 03f800000r           ; 1
; Function compile flags: /Ogtpy
CONST   ENDS
;   COMDAT _main
_TEXT   SEGMENT
_x$3834 = -4                        ; size = 4
_main   PROC                        ; COMDAT

; 4    : {

    push    ebp
    mov ebp, esp
    and esp, -64                ; ffffffc0H
    fld1
    sub esp, 60                 ; 0000003cH
    fldz
    push    esi
    fldz
    mov esi, DWORD PTR __imp__printf
    jmp SHORT $LN7@main
$LN43@main:

; 10   :        {
; 11   :            if (0.0f < x)
; 12   :                x = 0.0f;
; 13   :        }
; 14   : 
; 15   :        if (x == 1.0f)

    fstp    ST(0)
    fxch    ST(2)
$LN7@main:
    fxch    ST(2)
    mov ecx, 10                 ; 0000000aH
    fst DWORD PTR _x$3834[esp+64]
    fld DWORD PTR _x$3834[esp+64]
$LN5@main:
    fcom    ST(2)
    fnstsw  ax
    test    ah, 65                  ; 00000041H
    jne SHORT $LN4@main
    fstp    ST(0)
    fxch    ST(2)
    fst DWORD PTR _x$3834[esp+64]
    fld DWORD PTR _x$3834[esp+64]
    fxch    ST(1)
    fxch    ST(3)
    fxch    ST(1)
$LN4@main:
    fcom    ST(2)
    fnstsw  ax
    test    ah, 65                  ; 00000041H
    jne SHORT $LN14@main
    fstp    ST(0)
    fxch    ST(2)
    fst DWORD PTR _x$3834[esp+64]
    fld DWORD PTR _x$3834[esp+64]
    fxch    ST(1)
    fxch    ST(3)
    fxch    ST(1)
$LN14@main:
    fcom    ST(2)
    fnstsw  ax
    test    ah, 65                  ; 00000041H
    jne SHORT $LN15@main
    fstp    ST(0)
    fxch    ST(2)
    fst DWORD PTR _x$3834[esp+64]
    fld DWORD PTR _x$3834[esp+64]
    fxch    ST(1)
    fxch    ST(3)
    fxch    ST(1)
$LN15@main:
    fcom    ST(2)
    fnstsw  ax
    test    ah, 65                  ; 00000041H
    jne SHORT $LN16@main
    fstp    ST(0)
    fxch    ST(2)
    fst DWORD PTR _x$3834[esp+64]
    fld DWORD PTR _x$3834[esp+64]
    fxch    ST(1)
    fxch    ST(3)
    fxch    ST(1)
$LN16@main:
    fcom    ST(2)
    fnstsw  ax
    test    ah, 65                  ; 00000041H
    jne SHORT $LN17@main
    fstp    ST(0)
    fxch    ST(2)
    fst DWORD PTR _x$3834[esp+64]
    fld DWORD PTR _x$3834[esp+64]
    fxch    ST(1)
    fxch    ST(3)
    fxch    ST(1)
$LN17@main:

; 5    :    while (true)
; 6    :    {
; 7    :        float x = 1.0f;
; 8    : 
; 9    :        for (int i = 0; i < 50; i++)

    sub ecx, 1
    jne $LN5@main

; 10   :        {
; 11   :            if (0.0f < x)
; 12   :                x = 0.0f;
; 13   :        }
; 14   : 
; 15   :        if (x == 1.0f)

    fld ST(1)
    fucomp  ST(1)
    fnstsw  ax
    test    ah, 68                  ; 00000044H
    jp  $LN43@main
    fstp    ST(2)

; 16   :            printf("bad: %.2f\n", x);

    sub esp, 8
    fstp    ST(2)
    fstp    ST(1)
    fstp    QWORD PTR [esp]
    push    OFFSET ??_C@_0L@LNNNMCPH@bad?3?5?$CF?42f?6?$AA@
    call    esi

; 17   :    }

    fld1
    fldz
    add esp, 12                 ; 0000000cH
    fldz
    jmp $LN7@main
_main   ENDP
_TEXT   ENDS
END
;Microsoft(R)优化编译器版本15.00.30729.01生成的列表
标题c:\Dokumente and Einstellungen\azad\Desktop\WeirdProblem\main.cpp
.686P
.XMM
包括上市公司
.样板房
INCLUDELIB MSVCRT
包含旧名称
公众_C@_0L@LNNNMCPH@bad?3-5美元CF-42f-6美元AA@`字符串'
公开的__real@00000000
公开的__real@0000000000000000
公开的__real@3f800000
公共交通干线
EXTRN\uuuu imp\uuuuuu printf:PROC
外文:德沃德
;   COMDAT_C@_0L@LNNNMCPH@bad?3?5?$CF?42f?6?$AA@
; 文件c:\dokumente und einstellungen\azad\desktop\weirdproblem\main.cpp
常量段
??_C@_0L@LNNNMCPH@bad?3?5?$CF?42f?6?$AA@DB'不良:%.2f',0aH,00H`字符串'
常数结束
;   COMDAT__real@00000000
常量段
__real@00000000000000000第纳尔;0
常数结束
;   COMDAT__real@0000000000000000
常量段
__real@0000000000000000DQ 000000000000000000r;0
常数结束
;   COMDAT__real@3f800000
常量段
__real@3f800000DD 03f800000r;1.
; 函数编译标志:/Ogtpy
常数结束
;   COMDAT_main
_文本段
_x$3834=-4;尺寸=4
_主程序;COMDAT
; 4    : {
推ebp
电动汽车
和esp,-64;ffffffc0H
fld1
子esp,60;000000 3ch
fldz
推动esi
fldz
电影,德沃德私人影印
jmp短$LN7@main
$LN43@main:
; 10   :        {
;11:if(0.0f
我不知道触摸板驱动程序如何产生这种行为

我的感觉是,这是某种硬件问题。你有没有超频过你的MacBook?一旦你超频过它,CPU就会开始做各种奇怪的事情()。如果你没有超频,可能是你的CPU太热了?检查散热孔可能是个好主意。或者可能只是一个不稳定的CPU


如果是CPU,为什么只有当您触摸触摸板时才会发生这种情况?纯粹是猜测,但可能触摸板的功耗降低了CPU电压,足以导致它做一些愚蠢的事情…

可能与FPU和优化有关。如果您将
x
定义为
易失性浮点
或编译,是否会发生这种情况使用
/O0
?如果是,