研究试验4 不用main函数编程
f.c
f()
{
*(char far*)(0xb8000000+160*10+80) = 'a';
*(char far*)(0xb8000000+160*10+81) = 2;
}
(1) 使用turbo C 2.0 无法连接 f.c
(2) 使用link.exe 进行连接、使用debug查看程序
(2)用debug观察 f 程序.png
(3)debug m.exe
-
m.c
:main
的偏移地址是01FAH
main()
{
*(char far*)(0xb8000000+160*10+80) = 'a';
*(char far*)(0xb8000000+160*10+81) = 2;
}
-
m.exe
与f.exe
机器码完全一致
(3) debug m.exe 观察机器码.png
(4)使用G命令
(4)G命令.png
(5) 对main函数调用的指令和程序返回的指令是不是来自C0S.obj
C0S.obj
0 o O
零 小欧 大欧
(5)_main _exit 显示错误信息.png
(6)使用debug查看 c0s.exe
以及 m.exe
debug c0s.exe 调试.png
debug m.exe 调试.png
-
main
的偏移量是01fa
,在076A:011AH
处的确有一句call 01FA
,但是对比之下,我看不出来书上所说的两个.obj
一共进行连接,在何处连接?看不懂...
(8)tc.exe
将c0s.obj
与用户.obj
文件一同进行连接
tc.exe 将c0s.obj 与 用户.obj文件一同进行连接
《汇编语言(第三版)》研究试验4 :324页
使用自己的 c0s.asm 编译生成c0s.obj 编程时可以不写main函数
assume cs:code
data segment
db 128 dup (0)
data ends
code segment
start: mov ax,data
mov ds,ax
mov ss,ax
mov sp,128
call s
mov ax,4c00H
int 21h
s:
code ends
end start
-
masm c0s.asm
生成c0s.obj
替换原本的 c0s.obj
文件,我遇到无法编译的问题,于是手动删除了原本的 c0s.obj 文件
,把新的ASM
文件名改成C.asm
就可以顺利编译,然后生成了一个C.OBJ
文件,然后将这个C.OBJ
文件改名为c0s.obj
使用自己编写的c0s.obj 调试f.exe.png
使用自己编写的c0s.obj 运行 f.exe 在屏幕中间显示绿色字符 a.png
fbuf.exe 向安全的内存空间写入 "a~h"
#define Buffer ((char *)*(int far*)0x200)
f()
{
Buffer = 0;
Buffer[10] = 0;
while(Buffer[10]!=8) {
Buffer[Buffer[10]] = 'a' + Buffer[10];
Buffer[10]++;
}
}
'a' + Buffer[10] 对应机器码.png
Buffer[0] = 0 机器码.png
Buffer[10]!=8 机器码.png
Buffer[10]++ 机器码.png
fbuf.c 机器码 1.png
fbuf.c 机器码 2.png
fbuf.c 机器码 3.png
fbuf.c 机器码 4.png
fbuf.exe 但是为什么是写到这里?.png
- 存疑:fbuf.exe 但是为什么是写到这里?