将下列C语言代码转换为汇编语言


#include <stdio.h>
#include <dos.h>
#include <bios.h>
extern unsigned char asc[256*16];

void draw_a_char(int x, int y, unsigned char *pasc)
{
   unsigned char far *p, far *py, far *px, color;
   int r, c;
   p = (unsigned char far *)0xA0000000 + (y*320+x);
   for(r=0; r<16; r++) /* 一共画16行 */
   {
      py = p+r*320; /* py->行的起点 */
      for(c=0; c<8; c++) /* 每行画8个点 */
      {
         if(*pasc & 1<<(7-c)) /* 从最高位到最低位逐位检测第7-c位是否为1, 若为1则画红点, 若为0则画蓝点 */
            color = 0x0C; /* 前景为高亮度红色 */
         else
            color = 0x01;  /* 背景为蓝色 */
         px = py+c; /* px->行中的某个点 */
         *px = color; /* 画一个点 */
      }
      pasc++;
   }
}

main()
{
   unsigned char buf[100], *pasc;
   int i;
   int x, y;
   gets(buf);          /* 输入一行字符 */
   _AX = 0x0013;
   geninterrupt(0x10); /* 切换到320*200*256色图形模式 */
   x = 0;
   y = 0;
   i = 0;
   while(buf[i] != '\0')
   {
      pasc = &asc[buf[i] << 4]; /* pasc->8*16点阵中的首字节,1个字节代表水平方向的8个点 */
      draw_a_char(x, y, pasc);
      x += 8;
      if(x >= 320)     /* 若x坐标超过屏幕右边界... */
      {
         x = 0;
         y += 16;      /* 则y坐标换到下一行 */
      }
      i++;
   }
   bioskey(0);         /* 敲任意键, 对应的汇编代码是mov ah,0; int 16h */
   _AX = 0x0003;
   geninterrupt(0x10); /* 切换到80*25文本模式 */
}

这个在线网站可以可以将C、C++、Python、Rust、Pascal等多种语言使用多种类型的编译器进行在线编译,可以实时看到输出的汇编/字节码程序http

img

随便找个C编译器,不都有选项,设置输出对应C的ASM汇编吗?

我这只有windows环境,要是windows代码可以直接帮你生成asm文件

这是几种方法
1.使用gcc

    使用gcc -S 1.c可以把1.c转成特殊的1.s,感觉其实是类似于汇编,然后可以修改其代码,要想继续编译可以用gcc -s 1.s然后就可以实现

2.使用VC++ 编译器 自带的 dumpbin 就可以 做反汇编。
如vc++中在C:\Program Files\Microsoft Visual Studio\VC98\BIN\DUMPBIN.exe
dumpbin /DISASM abc.exe
dumpbin /DISASM abc.exe /OUT:abc.asm

3.在vc或者vs的时候按alt+8可以进行汇编调试,不仅可以查看程序的汇编代码,而且也可以查看此时的变量。

4.通过修改项目 -> 属性 -> C/C++ -> 输出文件 -> 汇编输出之后,每次运行后都可以在debug下面找到一个asm文件

具体环境呢?是windows还是有自己的系统?

三种方法:

  1. 在线网站:https://gcc.godbolt.org/ 。自动将代码转汇编。
  2. gcc -S 指令生成汇编代码。
  3. objdump -S指令生成代码。

使用 g++ -S test.s test.cpp 生成汇编代码。(test.cpp为目标文件源码,test.s为预生成的汇编代码文件)。注:此方式生成的汇编与源文件无关联,不易阅读。

使用 objdump -S tt.exe 生成汇编文件。此方式生成汇编文件与源文件具有关联关系,便于阅读。(注意这里的tt.exe是 gcc 编译式添加 -g 指令生成的dbug版本。)

除此之外,对于一些ide都有反汇编的功能,例如Visual studio。

你代码都是错的,还有,你要提供你的所有头文件和lib

方法一,Linux环境下进行编译可得到汇编文件
方法二,VS调试状态下,进行反汇编

用keil C的反汇编功能,很快而且准确