程序f.c
对其进行编译 连接,思考相关的问题
①编译和连接哪个环境会出问题。
连接过程。
②显示出的错误信息是什么?
③这个错误信息可能和哪个文件相关?
C0S.OBJ
(2)用学习汇编语言时使用的LINK.EXE对TC.EXE生成的F.OBJ文件进行连接,生成F.EXE。用DEBUG加载F.EXE,查看成个程序的汇编代码。思考相关的问题。
①F.EXE的程序代码总共有多少字节?
1DH个
②F.EXE程序能正确返回码?
不能(没有CALL指令 不能正确返回)
③F函数的偏移地址是多少?
0000h
(3)写一个程序M.C
用TC.EXE 对M.C 进行编译,连接,生成M.EXE,用DEBUG 察看M.EXE整个程序的汇编代码。思考相关问题。
①M.EXE的程序代码共有多少个字节?
1DH
②M.EXE能否正确返回?
能
③用DEBUG对 M.EXE 进行跟踪:①找到对main函数进行调用的指令的地址;(CS:011A CALL 01FAH)②找到整个程序返回的指令。(141F:0156 INT 21H(前面有mov AX,4C00H))
用LINK.EXE 对C0S.OBJ进行连接,生成C0S.EXE
用DEBUG分别查看C0S.EXE和M.EXE的汇编代码,注意从开头开始查看,两个文件中的程序代码有何相同之处?
debugM.EXE
DEBUG C0S.EXE
出了第一行传入的数据不同其余均相同。
用DEBUG找到M.EXE中调用的main函数的call指令的偏移地址,从这个偏移地址开始巷口查看10条指令;然后用DEBUG加载C0S.EXE 从相同的偏移地址开始向后查看10条指令。对两处的指令进行对比。
DEBUG下的M.EXE
DEBUG下的C0S.EXE
结构完全相同 只有部分数据是不同的。
用汇编语言编写一个程序C0S.ASM 然后把它编译成C0S.OBJ, 替代精简C环境下的C0S.OBJ文件
程序如下
在新的C0S.OBJ下重新编译F.C 生成F.EXE
运行结果
成功了!-。-
在新的C0S.OBJ的基础下,写一个新的H.C,向安全的内存空间写入从'a'到'h'的8个字符。分析、理解H.C
H.C程序如下
将H.EXE用DEBUG打开 汇编代码如下
C:/minic>debug h.exe
-u
1427:0000 B81F14 MOV AX,141F
1427:0003 8ED8 MOV DS,AX
1427:0005 8ED0 MOV SS,AX
1427:0007 BC8000 MOV SP,0080
前续准备
1427:000A E80500 CALL 0012
调用函数
1427:000D B8004C MOV AX,4C00
1427:0010 CD21 INT 21
程序返回
1427:0012 55 PUSH BP
1427:0013 8BEC MOV BP,SP
1427:0015 BB0002 MOV BX,0200
1427:0018 8EC3 MOV ES,BX
1427:001A 33DB XOR BX,BX
1427:001C 26 ES:
1427:001D C7070000 MOV WORD PTR [BX],0000 向ES:0000位置写入0000
1427:0021 BB0002 MOV BX,0200
1427:0024 8EC3 MOV ES,BX
1427:0026 33DB XOR BX,BX
1427:0028 26 ES:
1427:0029 8B1F MOV BX,[BX]
1427:002B C6470A00 MOV BYTE PTR [BX+0A],00 计数单元设置
设置计数单元
1427:002F EB3C JMP 006D
检验计数单元数据是否符合要求
1427:0031 BB0002 MOV BX,0200
1427:0034 8EC3 MOV ES,BX
1427:0036 33DB XOR BX,BX
1427:0038 26 ES:
1427:0039 8B1F MOV BX,[BX]
1427:003B 8A470A MOV AL,[BX+0A]
1427:003E 0461 ADD AL,61
将AL中写入要写入内存单元的字符
1427:0040 BB0002 MOV BX,0200
1427:0043 8EC3 MOV ES,BX
1427:0045 33DB XOR BX,BX
1427:0047 26 ES:
1427:0048 8B1F MOV BX,[BX]
1427:004A 50 PUSH AX
1427:004B 53 PUSH BX
将字符入栈
将写字符首地址入栈
1427:004C BB0002 MOV BX,0200
1427:004F 8EC3 MOV ES,BX
1427:0051 33DB XOR BX,BX
1427:0053 26 ES:
1427:0054 8B1F MOV BX,[BX]
1427:0056 8A470A MOV AL,[BX+0A]
1427:0059 98 CBW
1427:005A 5B POP BX
1427:005B 03D8 ADD BX,AX 设置写入单元
1427:005D 58 POP AX 将字符出战
1427:005E 8807 MOV [BX],AL 将字符写入
1427:0060 BB0002 MOV BX,0200
1427:0063 8EC3 MOV ES,BX
1427:0065 33DB XOR BX,BX
1427:0067 26 ES:
1427:0068 8B1F MOV BX,[BX]
1427:006A FE470A INC BYTE PTR [BX+0A]
计数器+1
1427:006D BB0002 MOV BX,0200
1427:0070 8EC3 MOV ES,BX
1427:0072 33DB XOR BX,BX
1427:0074 26 ES:
1427:0075 8B1F MOV BX,[BX]
1427:0077 807F0A08 CMP BYTE PTR [BX+0A],08
1427:007B 75B4 JNZ 0031
计数器检测段
1427:007D 5D POP BP
1427:007E C3 RET
写入地址为DS:0000开始的8个单元 结果如下
运行正常。-。-