汇编程序语言设计 第一周
第一周
1.硬件组成
1.1 寄存器
重点:硬件分为三个部分:寄存器,输入输出地址,储存器地址
这节课重要的知识点IA32有8个重要寄存器,重点记忆下面一图。
1.2 处理器专用寄存器
专用寄存器有三类:
第一类 标志
改变EIP是可以改变程序的顺序
存储空间是可以分段管理的
1.3 存储器
计算机被分为三个部分,CPU 存储器 IO。存储器对应存储器地址
8位形成字节,16位形成字,32位形成双字,一个存储单位存放的是一个字节,称字节编址。32位可以表征2的32次的名字。32位处理器最多一次处理32位,EAX是32位的
4个二进制,相当于1个16位,32位二进制相当于8个16进制位。H表示16位进制。
MMU存储管理单元。如果程序直接寻找存储器地址是会给存储管理带来麻烦,所以有MMU。
后续学习最多的是平展存储模型。
物理地址与逻辑地址
32位存储空间的划分,可以分为以上部分。
2.程序格式
2.1 处理器指令格式
小结:
指令由操作码和操作数(地址码)组成,左右注意。
这条指令有点像高级语言中的赋值
机器代码也叫指令格式,按照习惯使用16位表示
里面的8B是操作码,操作数部分(Mod R/M)是第二列,SIB也是一种寻址的方式,后面的四个字节都是位移量(80 00 00 00)。上面的格式可能很难理解,但是我们要知道我们高级语言都需要转换成这种机器代码。然后机器代码也不同,同一指令不容数据内容也可能不同。
2.2 语句格式
标号与名字都是用户自己定义的。
定义一个字符
eax也是寄存器,offset msg是操作数
执行性语句,有点像高级语言中的操作。
说明性语句,有点像高级语言的赋值定义等
2.3 源程序框架
stdcall 是标准调用规范
PS:“END”伪指令仅说明汇编到此结束,并不具备返回操作系统的功能。
2.3 信息显示程序
第一个汇编语言程序
13,10对应是\n,在底层内部都是有0 结尾的,字符串结尾字符。这里面Dismsg 相当于Printf()。通过OFFset指出偏移地址。EAX是寄存器,他是进行显示的一个入口参数存放的地方。
程序在IO32.lib 其说明是IO32.inc
注意子程序调用规范
库是前人设计的规范
问题:汇编中定义字符的时候有段基地址什么?
3.开发过程
3.1 MASM开发软件
最主要的是什么系统平台:WINDOWS
汇编程序是将我们源代码转成机器代码的程序。
3.2 操作系统平台
常称为DOS窗口,但是实际上不是
这两者本质有不同
3.3 源程序开发
汇编只是生成一个目标模板文件,然后需要连接称为可执行文件。
不能双击是因为我们生成的控制台,双击并不能看到信息
调试程序:
所谓快速开发,MAKE32就是将步骤汇合在一起
4.程序
1.标准的Hello world
include io32.inc
.data
;数据定义
msg byte 'Hello ,World!',13,10,0
;msgzn byte '你好,瓜娃子!',13,10,0
.code
start:
;主程序
mov eax,offset msg ;显示 这边为什么eax 为什么使用offset
;mov ebx,offset msg
;mov ecx,offset msg
;mov eax,msg
call dispmsg
exit 0
;子程序
end start
2.测试中文可以否
include io32.inc
.data
;数据定义
;msg byte 'Hello ,World!',13,10,0
msg byte '你好,瓜娃子!',13,10,0
.code
start:
;主程序
mov eax,offset msg ;显示 这边为什么eax 为什么使用offset
;mov ebx,offset msg
;mov ecx,offset msg
;mov eax,msg
call dispmsg
exit 0
;子程序
end start
3.测试不用msg1 其他字符
include io32.inc
.data
;数据定义
xjbx byte 'Hello ,World!',13,10,0
;msg byte '你好,瓜娃子!',13,10,0
.code
start:
;主程序
mov eax,offset xjbx ;显示 这边为什么eax 为什么使用offset
;mov ebx,offset msg
;mov ecx,offset msg
;mov eax,msg
call dispmsg
exit 0
;子程序
end start
4.使用其他寄存器
include io32.inc
.data
;数据定义
msg byte 'Hello ,World!',13,10,0
;msg byte '你好,瓜娃子!',13,10,0
.code
start:
;主程序
;mov eax,offset msg ;显示 这边为什么eax 为什么使用offset
mov ebx,offset msg
;mov ecx,offset msg
;mov eax,msg
call dispmsg
exit 0
;子程序
end start
这里看样子不行啊
include io32.inc
.data
;数据定义
msg byte 'Hello ,World!',13,10,0
msg2 byte '你好,瓜娃子!',13,10,0
.code
start:
;主程序
mov eax,offset msg ;显示 这边为什么eax 为什么使用offset
mov ebx,offset msg2
;mov ecx,offset msg
;mov eax,msg
call dispmsg
call dispmsg
exit 0
;子程序
end start
include io32.inc
.data
;数据定义
msg byte 'Hello ,World!',13,10,0
;msg2 byte '你好,瓜娃子!',13,10,0
.code
start:
;主程序
;mov eax,offset msg ;显示 这边为什么eax 为什么使用offset
;mov ebx,offset msg2
mov eax,msg
call dispmsg
;call dispmsg
exit 0
;子程序
end start