汇编语言--小甲鱼

[自用] 汇编语言–小甲鱼(全集)

部分笔记, 建议看b站的记笔记功能中记的,那个有时间节点。

第一个程序01 P20 - 05:59

过程:编译生成目标文件,链接目标文件生成可执行文件
在这里插入图片描述

可执行文件:程序和数据,描述信息
可执行文件内容

汇编源程序中指令分两种:

  • 汇编指令:有对应的机器码

  • 伪指令:给编译器看,没有对应的机器码

  1. segment ends

一对伪指令, 用来定义一个段

段名 segment 
...
段名 ends
  1. end

表示程序真正的没了,否则编译器不知道什么时候结束,注意和ends进行区分

  1. 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

外中断信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值