(1)编写一个程序ur1.c
main()
{
_AX=1;
_BX=1;
_CX=2;
_AX=_BX+_CX;
_AH=_BL+_CL;
_AL=_BH+_CH;
}
把这个程序保存在minic下,然后,编译,连接,生成ur1.exe.
(2)用Debug加载ur1.exe,用命令查看ur1.c编译后的机器码和汇编代码。
思考:main函数的代码在什么段中?用Debug怎样找到ur1.exe中main函数的代码?
分析:我用debug加载ur1.exe,用命令查看代码,发现完全看不出和ur1.exe有什么关系!……
(3)用下面的方法打印出ur1.exe被加载运行时,main函数在代码段中的偏移地址;
main()
{
printf("%x\n",main);
}
思考:为什么这个程序能打印出main函数在代码段中的偏移地址?
分析:打出来的main的地址为1fa.根据以前学的汇编,我认为main只是一个标号,代表一个地址!
(4)用debug加载ur1.exe,根据上面打印出的main函数的偏移地址,用u命令查看main函数的汇编代码。仔细找到ur1.c中每条C语句对应的汇编代码。
查看的代码如下:
K:\minic>debug url.exe
-u1fa
141A:01FA 55 PUSH BP
141A:01FB 8BEC MOV BP,SP
141A:01FD B80100 MOV AX,0001
141A:0200 BB0100 MOV BX,0001
141A:0203 B90200 MOV CX,0002
141A:0206 8BC3 MOV AX,BX
141A:0208 03C1 ADD AX,CX
141A:020A 8AE3 MOV AH,BL
141A:020C 02E1 ADD AH,CL
141A:020E 8AC7 MOV AL,BH
141A:0210 02C5 ADD AL,CH
141A:0212 5D POP BP
141A:0213 C3 RET
(5)通过main函数后面有ret指令,我们可以设想:C语言将函数实现为汇编语言中的子程序。研究下面程序的汇编代码,验证我们的设想。
程序ur2.c
void f(void);
main()
{
_AX=1; _BX=1; _CX=2;
f();
}
void f(void)
{
_AX=_BX+_CX;
}
编译,连接后,用debug加载,查看代码,代码如下:
K:\minic>debug ur2.exe
-u1fa
141A:01FA 55 PUSH BP
141A:01FB 8BEC MOV BP,SP
141A:01FD B80100 MOV AX,0001
141A:0200 BB0100 MOV BX,0001
141A:0203 B90200 MOV CX,0002
141A:0206 E80200 CALL 020B
141A:0209 5D POP BP
141A:020A C3 RET
141A:020B 55 PUSH BP
141A:020C 8BEC MOV BP,SP
141A:020E 8BC3 MOV AX,BX
141A:0210 03C1 ADD AX,CX
141A:0212 5D POP BP
141A:0213 C3 RET
- [游客] 飘过 06/11 13:31
- [fpamc] 貌似我正在步入你的路线……`(*∩_∩*)′Up!Up! 05/24 07:46
- [782936509] 敢问高手你是什么基础开始学的,我没有基础想学编程可以的吗?很想成为一个编程员,希望多多指教,呵呵 12/24 19:26
- [aten] 上面的程序我忘记设置要写入的扇区数了,……-_-~! 08/07 15:50
- [keyia] 啊,如梦初醒!万分感谢 05/28 01:32
- [aten] 好久没来汇编网了,拿你调试的结果来说吧! F:\dosimg\>debug c0s.exe - 05/26 22:52
- [keyia] keyia:变成游客了 05/22 19:42
- [游客] 向您请教: (8)从上我们可以看出tc.exe把c0s.obj和用户obj文件一同进行连接,生成e 05/22 19:40
- [aten] dw 定义的应该是10个字单元,我写成了8个了!所以答案就成了20H 04/26 22:01
- [aten] 恩,^_^ 04/24 18:36
- [游客] 这个,你的那个安装INT9中断程序的程序有一点错误,以下这个是我改正后的: assume cs:c 10/08 07:28
- [游客] 没想到我想走的路和正在走的路你已经走过一遍了,可以的话请加865650570——凌陶 愿我们在同一 10/07 23:30
- [keyia] 向您请教: (8)从上我们可以看出tc.exe把c0s.obj和用户obj文件一同进行连接,生成 05/22 19:44