java打印对象内存地址 分布式事务 事务消息 分布式事务 几种解决方案 分布式事务-Seata 分布式事务-Seata 分布式事务-LCN-TCC 分布式事务-LCN 分布式事务-消息队列-定时任务-本地事件表 Zuul网关实战02 Zuul网关实战01 灰度发布落地实战2 灰度发布落地实战1 Gsnova on Heroku build Systemd Debian system initialization manage multi id_rsa ubuntu 64bits cannot run 32bits app REHL power auditing Debug Assembly for ARMv8 on QEMU ARM体系结构--寄存器 Run Debian iso on QEMU ARMv8 QEMU ARM64 guide cross compiler install buildroot install QEMU install python入门--数据结构 python入门--内置数据类型 python入门--类 异常 python入门--条件表达式 方法 python入门--数字 字符串 数组 RTC驱动分析 块设备驱动 TCP UDP socket 触摸屏驱动 USB驱动 LED按键中断 LCD 驱动 驱动信号 根文件系统 实验 内核实验 字符设备驱动程序 绪论 uboot 实验 LCD 实验 系统时钟和UART 中断控制器 Nand Flash控制器 MMU 实验 储存管理器实验 GPIO实验 点亮LED 编译加载驱动 制作烧写内核 dnw替代方法 MINI2440 TQ2440安装配套Linux 使用NFS 制作烧写跟文件系统 grub引导Windows 烧写裸版程序-linux Ubuntu 网络没有 eth0 Linux自动挂载 烧写裸板程序 电路基础 Mac词典 Vim插件 Assembly 综合研究 Assembly 指令总结 Assembly 直接定址表 Assembly 使用BIOS进行键盘输入和磁盘读写 Assembly 外中断 Assembly 端口 Assembly int指令 Assembly 内中断 Assembly 标志寄存器 Assembly 转移指令的原理 Assembly Call和ret指令 Assembly 数据处理两个基本问题 Assembly 灵活定位内存地址 Assembly 包含多个段的程序 Assembly [bx] loop Assembly 第一个程序 Assembly 寄存器 (内存访问) Assembly 寄存器 AWS VPN with EC2 hidden file in picture(linux) Assembly 基础 idea shortcuts 常用快捷键 idea plugin folder install ruby and jekyll

Assembly 综合研究

2014年10月05日

###以下均在TC 2.0上实验 安装Turbo C 2.0,将tc.exe单独拷贝到另一个目录,之后编译连接,根据错误信息拷贝LIB文件到另一目录

C语言真正的入口不是main,main只是那个入口函数的一个call

C语言的函数对应汇编的子程序

全局变量放在数据段,局部变量放在当前栈空间

AX寄存器贯穿于函数内外,AX是C程序中用来存放函数返回值的地方

###不用main函数编程 f.c 源程序:

f()
{
	*(char far *)(0xb8000000+160*20+80) = 'a';
	*(char far *)(0xb8000000+160*20+81) = '2';
}

连接时报错:Undefined symbol ‘_main’ in module C0S (与c0s.OBJ文件相关)

利用汇编语言的link.exe对f.c进行连接,使用debug查看,与之前的main()程序做对比,发现缺少开头(开头工作)和结尾(善后工作)的汇编指令


tc.exe把c0s.obj和用户.obj文件一同进行连接,生成.exe文件,过程如下:

  1. c0s.obj 里的程序调用main函数,从此用户程序开始运行(CALL)
  2. 用户程序从main函数返回到c0s.obj的程序中(RET)
  3. c0s.obj的程序接着运行,进行相关的资源释放,环境恢复等工作
  4. c0s.obj的程序调用DOS的int 21h例程的4ch号功能,程序返回

这个规定不是在编译时保证的(tc.exe对f.c的编译是可以通过的),也不是连接的时候保证的(虽然tc.exe文件对f.obj文件不能连接成.exe,但link.exe却可以),而是如下机制保证的:

首先,C开发系统提供了用户写的应用程序正确运行所必须的初始化和程序返回等相关程序,这些程序存放在相关的.obj文件(比如,c0s.obj)中

其次,需要将这些文件和用户.obj文件一起进行连接,才能生成可正确运行的.exe文件

第三,连接在用户.obj文件前面的由C语言开发系统提供的.obj文件里的程序要对main函数进行调用

基于这种机制,只要改写c0s.obj让他调用其他函数,编程时就可以不写main函数了:

用汇编语言编写一个c0s.asm:

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.exe对c0s.asm进行编译,生成c0s.obj,并替换tc2.0提供的c0s.obj

注意,完成测试后,需要把tc2.0的c0s.obj恢复

###函数如何接收不定数量的参数 栈传递参数,依次压栈