8086汇编
8086入门学习
8086汇编代码
使用debug
在终端中输入
debug
进入到调式界面查看寄存器输入
R
r+寄存器变量名
直接修改寄存器的值
查看内存输入
D
也可以添加地址,从1000段地址偏移0开始输出
改变内存的内容
E
第一种方法
第二种方法
使用
A
添加汇编代码T
执行插入的指令U
翻译机器码
部分寄存器
指令的学习
mov
注意逗号后面的控制
下面操作寄存器的高位和低位
注意第三条指令(不包括错误的指令)
1
mov ch, 10
这段代码表示将10给c寄存器的高位(hight)
由此可以知道直接使用
mov
直接赋值给低地址位
add
将两个数相加
同时也可以实现自己加自己
相加如果越位了就直接舍去
如使用地位相加过后溢位了
同样的不会进位
但是使用的是整个的寄存器那么就会进位
sub
sub会向下越界
同样的如果是操作低位或高位,只会在低位或者高位进行sub计算
mul
首先应该知道
乘数一个是放
ax
或者al
当中的,另一个是自己指定的存放的时候默认放在
ax
,如果是16位的乘法,高位就放在dx
div
除数相当于是我们指定的
被除数要分情况,被除数是16位放在
ax
当中;是32
就放在dx
和ax
当中,高位放在dx
地位放在ax
结果的从存放。
高位放余数,低位放置商
and
有
0
就是0
下面演示操作方法
or
- 有
1
就是1
- 但是在
debug
界面我们不能使用二进制,所以先要转换成16进制才能计算二进制
左右移的指令
- 移动都是移动的是二进制
shl
左移
和C语言的一致,向左移动,然后右边补
0
rol
循环左移
- 将高位舍去的位数补充到低位
shr
右移
ror
循环右移
inc
自增操作
dec
自减操作
nop
空的代码段
- 大小为一个字节
- 可以用存放代码段
xchg
交换
- 可以用于交换两个数,寄存器或者地址
neg
取反
- 用于将二进制取反操作
abs
带进位的加法
- 利用的是cf寄存器
abb
带借位的一个减法
- 使用的也是cf寄存器
cmp
是比较,也是减法
通过相减看是否是相等的
call
和ret
通过修改cx的值进行跳转
call
相当于函数的调用ret
用于函数的结束但是整体的结束是INT 21H
CALL 和 RET的都是修改IP的值,也就是说是近转移
CALLF和RETF就是说是远转移,如果通过修改IP不能达到要求,则会修改 CX
本质都是压栈和弹栈的过程
CALL是压栈,将代码的地址压栈
RET是出栈,将代码的地址
offset读取一个函数的地址,然后赋值
- 获取一个函数的地址,然后进行操作
lea
- 计算有效地址:
lea
可以计算一个内存操作数的有效地址,并将结果(即内存地址)加载到目标寄存器中。例如,lea eax, [ebx+ecx*4]
将计算[ebx+ecx*4]
的有效地址,并将结果存储到寄存器eax
中。 - 进行简单的加法运算:
lea
可以执行简单的加法运算,并将结果加载到目标寄存器中。例如,lea eax, [ebx+123]
将ebx+123
的结果计算出来,并将结果存储到寄存器eax
中。
终断
- 程序停止就是中断
寄存器
段地址和偏移地址
一个物理地址可以有很多个段地址加偏移地址的组合
下面演示使用DS(数据段地址)+偏移地址给ax赋值
注意标红的地方就是使用的偏移地址
不通过
r
修改DS寄存器由于DOS的限制,不能直接使用MOV修改DS寄存器
但是可以使用下面的例子对DS赋值
我们先将值赋给AX然后在对其赋值
CS和IP 代码段寄存器
代码运行地址
物理的内存等于
CS*16+IP=内存
下面使用实例
先将规定地址,在添加汇编代码
使用U将机器码翻译成汇编代码
注意
如果要指定一段地址运行,需要修改CS和IP的数值
jump
指令
用于不同内存的跳转
下面的实现在1E2B:0100运行mov ax,8989
然后使用jump与运行jump1000:0000
运行move bx,1212
注意在编写的时候我们需要手动跳转内存进行写代码
栈
先进后出,后进先出
压栈
将ax,bx,cx压入栈
出栈
寻址的实现
我们通过记录段地址用SS,使用SP记录偏移的地址
栈的越界
也就是说,计算机不会检测,需要人为的注意栈区的大小
寻址方式
- 使用偏移地址的方式
- 首先使用CS进行段地址的赋值
- 然后使用偏移地址的方式查找
- 注意BX寄存器也是可以用来当作偏移地址
SI
和DI
BX 寄存器BX的替代品
- 代表了以SS:BP
- 可以用于寻址
- 同时还可以使用
.
表示偏移地址
ES
附加段寄存器
相当于备胎,和其他的差不多
标志寄存器
比较器,相当于c++的if
段
代码段
![image-20230722172758881](https://compilation-1317182407.cos.ap-nanjing.myqcloud.com/win32%E6%B1%87%E7%BC%96/image-20230722172758881.png)
注意我们需要先将cs指定,也就是code segment
还需要将codesg ends 结尾
语法
循环
- 使用loop进行循环
- 根据CX的值是否为0,进行判断是否是可行的