qq_39454005
qq_39454005
采纳率0%
2017-07-10 01:08 阅读 1.0k

修改C语言程序代码的错误

void printman(int x,int y)
{
gotoxy(y,x);
_AX=02;_CX=01;_AH=0xa;
geninterrupt(0x10);
}
为什么在code blocks 里面是错误的 、
错误提示:'_AX' undeclared (first use in this function)
该怎么修改

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • justin_bkdrong 枫舞的季节 2017-07-10 01:27

    _AX , _CX , _AH 是寄存器,geninterrupt(0x10); 是调用中断 0x10 。 估计只能在DOS 或者WINDOWS95 WIN31 等系统下运行,而 CodeBlocks不是一个编译器,只是运行IDE,它依赖于其他的编译器 比如 MinGW VC++ ,而这些编译器中默认没有 _AX , _CX , _AH 这些寄存器变量。所以报错说没有定义这些变量。要使用这些寄存器,有两种方式:
    1 嵌入汇编指令
    2 使用汇编语言,编译为 obj 然后链接到exe 中。

    如果 codeblocks 调用 VS 那么可以 用
    __asm {
    mov ax,02
    mov cx,01
    mov ah,0ah
    int 10
    }
    但是vs代码只是32位程序支持,64位不支持。
    如果使用 MinGW 它支持嵌入AT&T 汇编,你可以百度一下它的格式。

    但是你这段代码估计在win xp win7 win8 win10 上 不允许调用 int 10h 中断,会引发异常(在win10上试了,不行,其他系统没验证)

    做一个dos 虚拟机,或者 win95虚拟机实验一下。应该能通过。

    点赞 2 评论 复制链接分享
  • justin_bkdrong 枫舞的季节 2017-07-10 02:34

    codeblocks 中使用的编译器是 vs 还是 mingW还是 其他的?
    使用vc 编译器用下面的写法

     __asm { 
    mov ax,02
    mov cx,01
    mov ah,0ah
    int 10
    }
    

    使用mingW 编译器要用下面的写法.

         __asm__("movw $2, %ax\n\t"
        "movw $1,%cx\n\t"
        "movb $0x0a, %ah\n\t"
        "int  $0x10"
        );
    
    点赞 1 评论 复制链接分享
  • qq_39454005 qq_39454005 2017-07-10 01:54

    但是
    __asm {
    mov ax,02
    mov cx,01
    mov ah,0ah
    int 10
    }
    这个代码在code blocks 里面显示的也是有错误的
    expected string literal before ')' token

    点赞 评论 复制链接分享

相关推荐