本文主要是介绍汇编语言--小甲鱼,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[自用] 汇编语言–小甲鱼(全集)
部分笔记, 建议看b站的记笔记功能中记的,那个有时间节点。
第一个程序01 P20 - 05:59
过程:编译生成目标文件,链接目标文件生成可执行文件
可执行文件:程序和数据,描述信息
汇编源程序中指令分两种:
-
汇编指令:有对应的机器码
-
伪指令:给编译器看,没有对应的机器码
- segment ends
一对伪指令, 用来定义一个段
段名 segment
...
段名 ends
- end
表示程序真正的没了,否则编译器不知道什么时候结束,注意和ends进行区分
- assume
假设,cs:ccc cs和ccc段关联,这样编译器会将ccc处理为一个地址,默认在cs段
源程序:源程序文件中的所有内容
程序:源程序中最终由计算机执行处理的指令或数据
第一个程序02 P21 - 00:13
标号:一个标号指代了一个地址, 比如 codesg
exe执行的过程: dos是一个单任务操作系统,cmd先暂停然后转给自己的文件.exe然后返回dos,称作程序的返回
两种错误: 语法错误 逻辑错误
第一个程序03 P22 - 00:20
操作系统都有一个 shell(外壳)程序.
常见debug命令
r # 查看寄存器的值,其中cx中存放的是程序的长度,比如cx=f,表示机器码有15个字节
rax #修改寄存器的值,输入后会出现冒号,填写要修改为多少即可
u 13db:0 # 查看13db:0后边的20h个字节的机器代码反汇编
q # 表示退出
t # 单步执行,并观察结果
e # 改写内容
d # 地址查看
g # ip的偏移地址,可以直接跳转到这里
p # 相当于直接跳过循环
常见debug命令
debug r查看寄存器的值,其中cx中存放的是程序的长度,比如cx=f,表示机器码有15个字节
[BX]和loop指令01 P23 - 00:04
栈指针始终指向有数据的栈顶
mov ax,[0]在debug中表示将ds段的0为偏移地址的内容移到ax寄存器
而在编译器中表示将内容0移动到ax中
编译器中需要先把0放到bx中然后mov ax,[bx]
段寄存器,不能立即数mov
[BX]和loop指令02 P24 - 00:08
Loop指令实现: cx减1, 判断cx的值, 为0则继续执行, 否则跳转至标号处
cx开始默认存放程序的大小,直到将循环次数mov进去
[BX]和loop指令03 P25 - 00:23
mov cx要在标号上一行执行
汇编程序中,数据不能以字母开头,所以有的数字前边要加0
loop指令模板
mov cx count;count为循环次数
S: ...
loop S
[BX]和loop指令026 P26 - 00:49
没时间看复习课,,先跳过之后
[BX]和loop指令06 P28 - 05:39
在一船的PC机中·DOS方式下·DOS和其他台法的程序一般都不会使用0:200~0:2FF
( 0:200h-0:2FFh) 的256个字节的空间. 所以我们用这段空间是安全的.
[BX]和loop指令06 P28 - 10:34
又没时间看了先跳过
包含多个段的程序01 P29 - 00:06
dw定义字型数据,define word
start的意义,告诉程序从哪里开始,也就是说从哪里开始翻译机器码,而不是从一开始的数据就翻译
end除了通知编译器程序结束外,还通知编译器程序的入口在什么地方
我们所assume得data code stack段,cpu是不知道得,因为assume是伪指令,所以需要在start之后,通过指令设置ds,ss得值为data,stack,从而使得data变为真正意义上的数据段,ss成为整整意义上的栈段。至于真正得代码段,应该就是由start来确定把,否则默认为第一行?
包含多个段的程序03 P31 - 00:17
原来如此,这里自定义段名对应得地址间隔,取决于每个段存了多少数据,而段首地址总为16的倍数,指最终偏移1位后是16的倍数,所以当数据段只有1字节数据时候,栈段的地址是数据段地址+1,有x字节时候是,数据段地址+(x/16+1) 实际地址是段地址*16.
更灵活定位内存地址01 P32 - 01:03
and 与 可将对应位设为0
or 或 可将对应位设为1
以字符形式给出数据
单引号
大小写转换
a-A =32=20h
小写字母=大写字母+10 0000
这样就可以不通过判断是否为大小字母,直接都转换为大写或小写
更灵活定位内存地址02 P33 - 00:23
[bx+100]的意义是?
原来如此,妙啊
[bx+idata]的方式进行数组的处理
两个数组遍历时候,每遍历一个元素可以只改一次bx,而不是两次
[bx+5]=[5+bx]=5[bx]=[bx].5
5[bx]这种写法真的妙啊,就好像c语言中,一个在地址5处的数组名,的bx号元素
si和di
bx不够用所以引进的
source distination
更灵活定位内存地址04 P35 - 00:58
[idata]常量表示地址,debug时候可以直接用(debug指令与汇编没关系),masm时候必须加上ds:,不然不认,这也是之前说的为什么要用bx的原因
思想架在语言之上
为啥
数据处理的两个基本问题01 P38 - 00:02
总结以上三个视频:循环cx嵌套循环时候怎么办,进行下层循环时候先存cx到一个寄存器,执行上层循环时再取出来,但是寄存器不够用怎么办?内存,但是很多循环时候内存要以怎样的数据结构来存呢?栈!!!!!!太妙了,尽管学过栈,我也只想到新定义一个段用来存!!妙啊,直接push pop!这也是栈的由来。
寻址方式:
[]内可以填的bx si bp di,其中bx和bp地位相同,一个默认ds段,一个默认ss段(只有bp),
bx加 si或di
bp加 si或di
[idata]除非是0否则需要指明段地址
数据处理的两个基本问题02 P39 - 00:05
8.5数据多长?
比如word ptr ds:[0]
其他方法:默认制定了访问的是子单元还是字节,比如栈push pop 字操作
汇编对应的机器码中,存入的不是ip对应的绝对地址,而是偏移地址
???
转移指令的原理01 P43 - 22:42
s:mov ax,bx ip=0+2----->
mov bx,cx ip=ip+2
jmp s ip=ip+该指令长度(假如2)
mov dx,cx
缓冲器中执行 ip=ip+(jmp s中的偏移地址)-6这句话,这个偏移地址是由编译时候从绝对地址算出来的
ip变回为0
这也是负数的意义所在,用补码表示
short: 绝对位移如何变成相对的八位位移,由编译程序在编译时算出!!
jump near ptr: 段内转移 16位偏移 -32769——32767
转移指令的原理02 P44 - 02:21
jump far ptr:远转移,段间转移,!!不同段
里边不再是偏移地址了,而是绝对的目标地址
转移指令的原理02 P44 - 06:32
9.5
相当于jmp short/near,他们的操作数一直是目的地址,包括far,只不过机器码有的是偏移地址,有的是目的地址
以该内存单元地址中 存的word数据 作为目的地址 16位
32位
转移指令的原理03 P45 - 00:05
9.7 jcxz
所有的有条件跳转指令,都是短转移
写的最终地址,机器码依然是偏移地址
和jcxz刚好相反
而far是目标地址,在机器码中
便于封装调用
实验八、实验九详细讲解 P47 - 00:30
时间又来不及了有点,但是还是
实验八,运行为什么报错捏???jmp.asm
这个实验的核心是:跳转时候用的实际上是偏移地址
如果直接将一句跳转到s 的机器码(假如偏移-2)复制到另一行,那么程序运行并不会到s而是偏移-2
实验九:
Call和ret指令01 P48 - 01:11
时间关系时间关系,先跳一下,先学in out
端口01 P67 - 00:06
通过端口,cpu才能访问硬件
a是指要读写的数据,这里的d是指端口号
BIOS是英文"Basic Input Output System"的 缩略词 ,直译过来后中文名称就是"基本输入输出系统"。
. 70h 端口存入地址
71h 数据
shl :左移,补零,移出的一位放入cf
shl 左移位数大于1时候,只能mov al,cl,将要移动的位数放入 cl中,cf的值是最后移出的一位
shr :右移,补零,最后移出的一位写入cf
端口02 P68 - 00:05
可见一个字节两个bcd码 范围100
时隔200年没看,考试终究还是来了,继续吧
外中断01 P69 - 00:12
外中断信息
这篇关于汇编语言--小甲鱼的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!