汇编笔记(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 内存单元
常用寄存器来存储参数和结果
当寄存器数量有限时,将批量数据放到内存中,将它们所在内存空间的首地址放在寄存器
中,传递给需要的子程序
浙公网安备 33010602011771号