汇编研究实验-不用main函数编程

程序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个单元  结果如下

 

 

运行正常。-。-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值