汇编笔记(2)

8086的数据总线宽度为16根,读取次数:1024/(16/8)=512

80836的数据总线宽度是32根,读取次数:1024/(32/8)=256

寄存器(内存访问)

一个字要用两个地址连续的内存单元来存放,低位放在低地址单元中,高位放在高地址单元中

0、1两个内存单元来存储一个字,0是低地址单元、1是高地址单元

字单元:存放一个字型数据(16位)的内存单元,由两个连续的内存单元组成

起始地址为N的字单元简称N地址字单元

内存中字的存储:

0 20H
1 4EH
2 12H
3 00H
4
5

地址为N的字单元的高/低位字节单元是N号单元和N+1号单元

DS寄存器通常存放要访问数据的段地址,ds是段寄存器,用ds存放数据段的段地址

cs:代码段寄存器;ip:指令指针寄存器;ss:栈寄存器;sp:栈指针寄存器

mov al,[0] ; mov 寄存器名 内存单元地址

[...]表示一个内容

[...]其中的0表示内存单元的偏移地址,因为只有偏移地址不能定位一个内存单元,所以8086CPU自动取ds中的数据为内存单元的段地址

字的传送

在mov指令中给出16位的寄存器可以进行16位数据的传送

数据段:将一组长度为N(N<=64KB)、地址连续、起始地址为16倍数的内存单元当作专门储存数据的内存空间

mov和lea的区别:

mov在寄存器或内存之间传输数据值

lea计算有效地址,将结果加载到内存器中,但不访问该地址处的内存内容

一种具有特殊的访问方式的存储空间

push ax : 将寄存器ax中的数据送入栈中

pop ax : 从栈顶取出数据送入ax

入栈和出栈操作都是以字为单位进行的

栈顶的段地址存放在段寄存器SS中,偏移地址存放在寄存器SP中,任意时刻SS:SP指向栈顶元素

push指令和pop指令执行时,CPU从SS和SP中得到栈顶的位置

栈顶超界可能原因:栈满再使用push指令入栈,或栈空使用pop指令出栈

伪指令没有对应的机器指令,最终不被CPU执行,由编译器处理

伪指令 segment说明一个段的开始,ends说明一个段的结束

assume 假设 将有特定用途的段和相关的段寄存器关联起来

源程序中最终由计算机执行、处理的指令或数据称为程序;程序先以汇编指令形式存在源程序里,经过编译、连接后转变为机器码存储在可执行文件中

源程序由一些段构成

程序返回:一个程序结束后,将CPU的控制权交还给使它运行的程序

如何返回:在程序末尾添加返回的程序段

几个结束

目的 相关指令 指令性质 指令执行者
段结束 段名 ends 伪指令 编译器
程序结束 end 伪指令 编译器
程序返回 mov ax,4c00H int 21H 汇编指令 CPU

汇编程序从写出到执行的过程:

编程→1.asm→编译→1.obj→连接→1.exe→加载→内存中的程序→运行

and指令:相同得1,不同得0 ;or指令:有1得1

小写的ASCII码比大写的ASCII码值大20H

[bx+idata]

表示一个内存单元,偏移地址为(bx)+idata

bx中给出了从起始偏移地址开始的相对地址

立即数:在立即寻址方式指令中给出的数

si和di是和bx功能相近的寄存器,不能分成两个8位寄存器来使用

用ds:si指向要复制的源使字符串,用ds:di指向复制的目的空间,用一个循环来完成复制

mov ax,[bx+si] 也可写成mov ax,[bx][si] 数学化描述:(ax)=((ds)*16+(bx)+(si))

[bi+si]对目标单元进行寻址

loop指令默认为循环计数器

一般来说,在需要暂存数据的时候,都应该使用栈

转移指令:call和ret

ret指令用栈中的数据,修改IP的内容,实现近转移

retf指令用栈中的数据,修改CS和IP的内容,实现远转移

执行ret指令时操作:

(IP)=((ss)*16+(sp))

(sp)=(sp)+2

相当于pop IP

执行retf指令时操作:

(IP)=((ss)*16+(sp))

(sp)=(sp)+2

(CS)=((ss)*16+(sp))

(sp)=(sp)+2

相当于pop IP

​ pop CS

call指令操作:

(1)将当前的IP或CS和IP压入栈中

(2)转移

call指令不能实现短转移

转移地址在内存中的call指令有两种格式:

(1)call word ptr 内存单元地址

(2)call dword ptr 内存单元地址

db 次数 dup (重复的字节型数据)

dw 次数 dup(重复的字型数据)

dd 次数 dup(重复的双字型数据)

inc指令:将操作数的值+1

mul:乘法指令

格式:mul reg

​ mul 内存单元

常用寄存器来存储参数和结果

当寄存器数量有限时,将批量数据放到内存中,将它们所在内存空间的首地址放在寄存器

中,传递给需要的子程序

posted @ 2025-04-29 20:58  myrrrr  阅读(14)  评论(0)    收藏  举报