CelestialCosmic / themeblog

blog articles by Celestial_Cosmic,source code by chanshiyucx
0 stars 0 forks source link

汇编笔记(三) #23

Open CelestialCosmic opened 2 years ago

CelestialCosmic commented 2 years ago

2022/3/9(咕咕咕...咕咕咕咕咕......)

寄存器各自的功能

ax:数据 bx:数据、偏移地址 cx:循环计数器 dx:累加器

inc

inc 等价于高级编程语言中的 +=/++,也就是自增。

loop

loop 等价于高级编程语言中的 for,也就是循环。

类似于高级编程语言,需要自定义循环的代码段才能使用。

mov cx 50
a: add ax,ax
    loop a

上面的代码就是 n+n 循环 50 次

循环中,cx 的内容是递减的。因为 cx 寄存器的作用就是在 loop 中充当计数器的作用。

段前缀

代码 意义 传递的内容
mov al,[0] (al)=0,同mov al,0
mov al,ds:[0] (al) = ((ds) * 16 + 0 ) 地址
mov al,[bx] (al) = ((ds) * 16 + (bx)) 地址
mov al,ds:[bx] 与mov al,[bx]相同

异或操作

and 与 or 指令。

指令需要一个寄存器和一个二进制数据

形如and al,11001011B

比较完成的结果会直接覆盖到寄存器中

例如 ascII 编码中,通过异或比较编码中的内容来判断字母的大小写。

mov al,20H ;这里将 al 赋值为了 A
or al,00100000B ;这里将 al 转换为了 a
and al,11011111B ;这里将 al 转换为了 A

自定义数据

dw + 8 个数据可以规定一片内存地址,存放 8 个字单元

db 类似于 dw,不过存储的是 8 个双字节单元。

但是定义后,其数据可能在编译过程中被覆盖,可以使用 jmp 指令或者定义多个段解决

如下两个例子:

assume cs:code,ds:data
data segment
data ends
code segment
code ends

多样的内存表示方式

[x + bx],x[bx],[bx].x均可以表示地址:(bx) * 16 + x,也就是以(bx)为段地址,x 为偏移地址。

自定义程序(二)

CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器; ES(Extra Segment):附加段寄存器;

在 assume 中指定段以使用该部分的代码。