array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 汇编学习笔记(15)综合研究 - 爱码网

使用寄存器

TC2.0编译器,编译连接如下代码

汇编学习笔记(15)综合研究

用Debug加载,-u命令查看汇编代码,发现根本找不到main函数所在代码段,故用print语句将main函数所在代码段的偏移地址输出方便查找。

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

可以看到,在程序开头多出两行代码push bp;mov bp,sp这是因为汇编程序将main函数作为子程序处理,须将栈顶指针保存,以便返回。

使用内存空间

程序访问内存空间需要知道两点:

  • 地址

  • 类型

C语言的指针型数据即可完成这两个功能,例如

*(char *)0x2000='a'

表示向偏移地址为2000的内存空间存入一个字符'a',可以用段地址和偏移地址的形式表示

*(char far *)0x20000000='a'

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

注意*(char far *)0x20001000='a'汇编翻译为

mov bx,2000

mov es,bx

mov bx,1000

mov byte ptr [bx],61

全局变量与局部变量的储存

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

原来,C语言中全局变量是放在ds:[01A6]开始的内存中,代码段中的多有函数都可以访问,而局部变量是存放在栈中的。

函数返回值的处理

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

C语言使用AX寄存器传递返回值为int型数据的值

不用main函数编程

汇编学习笔记(15)综合研究

编译报错,无法找到c0s.obj文件,使用汇编的连接器LINK.EXE进行连接生成exe文件,并用debug查看

汇编学习笔记(15)综合研究

可以看到,程序从偏移地址0开始,下面再写一个使用main函数的正常程序,并编译连接生成exe

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

程序从01fa开始,我们猜测,偏移地址0到01fa之间的代码就是c0s.obj调用main函数的相关代码,从偏移地址0处开始使用u命令查看,发现在011A处调用main函数,在0156处返回

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

所以,我们清楚了exe文件的生成过程:

1.编译器加载c0s.obj文件,进行相关的初始化工作
  2.c0s.obj调用main函数,开始用户程序
  3.用户程序运行结束从main函数返回到c0s.obj的程序中继续运行
  4.c0s.obj进行资源释放,环境恢复等工作
  5.c0s.obj的程序调用DOS的int 21h例程的4ch号中断功能,程序返回

现在,我们自己重新写一个c0s.asm文件并生成c0s.obj取代tc原有的c0s.obj文件

 1 assume cs:codesg
 2  
 3 data segment
 4     db 128 dup (0)
 5 data ends
 6 
 7 codesg segment
 8     
 9 start:  
10         mov ax,data
11         mov ds,ax
12         mov ss,ax
13         mov sp,128
14         
15         call s
16         
17 
18         mov ax,4c00h
19         int 21h
20 s:
21 
22  
23 codesg ends
24 end start

 

连接原先的f函数文件生成f.exe,使用debug查看,f函数作为一个子程序成功运行了

汇编学习笔记(15)综合研究

汇编学习笔记(15)综合研究

学的越多,发现不会的越多,学海无涯!

相关文章: