汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈

疯狂的暑假学习之  汇编入门学习笔记 (二)

参考:《汇编语言》 王爽  第三章

一、寄存器(内存访问)

1.DS和[address]

DS 数据段寄存器,用来存放数据段地址

[address] 用来表示数据段的偏移地址

同样跟CS一样,不可以通过 mov ds, 1000 给ds赋值

要通过通用寄存器ax等。

例如:

mov ax, 1000

mov ds, ax

mov al, [0]

把1000:0的内容存进al

mov bx, 1000

mov ds, bx

mov [0], al

把al写进1000:0中

因为ax、bx、cx是16为的,内存单元是8为的,所以 mov ax, [0]会一次付给ax  [1]跟[0]中的内容

例如:

如果内存情况为

10000H 11

10001H 22

10002H 33

10003H 44

........

--------------------------------

mov ax, 1000

mov ds, ax

mov ax [0]

mov bx [2]

mov cx [1]

这上面运行后 ax=2211H 、bx=4433H、cx=3322H

mov ax,1000

mov ds, ax

mov ax, 1234

mov [0], ax

这上面运行后内存内容变为

10000H 34

10001H 12

.........

2. CPU 栈

相关寄存器:

ss: 记录栈的段地址

sp:记录栈的段地址的偏移地址

相关指令:

push 入栈  如 push ax 表示将寄存器ax的内容写入栈

pop 出栈   如 pop ax 表示从栈顶取出数据送入ax

初始时,sp指向栈低的下一个单元的地址,每次push,sp减2,pop,sp加2

例如:

将10000H~1000FH这段内存当做栈来用

为了10000H~1000FH这段内存当做栈来用,要设置 ss=1000 sp=0010(栈底的下一个单元的地址)

如果内存内容如下:

---------------------------

10000H

..........

1000CH

1000DH

1000EH

1000FH

10010H   <------- sp

---------------------------

mov ax,0123

push ax

后内存内容如下:

---------------------------

10000H

..........

1000CH

1000DH

1000EH

1000FH    23  <------- sp

10010H    01

---------------------------

pop bx

后bx=0123H 内存内容如下:

---------------------------

10000H

..........

1000CH

1000DH

1000EH

1000FH

10010H   <------- sp

---------------------------

3.CPU 栈顶越界

8086CPU 保证我们对栈的操作不会越界。也就说,8086 CPU 只知道栈顶在何处,不知道栈底和栈空间的大小。

汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈

时间: 2024-10-06 11:05:57

汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈的相关文章

汇编学习笔记03(寄存器内存访问)

1. 字在内存中存储时, 要有两个地址连续的内存单元来存放. 字的低位字节存放在低地址单元中, 高位字节存放在高地址单元中. 2. DS: 存放段地址的寄存器, 这个段是存放数据的. [address]: 偏移地址 mov指令在访问内存单元时, 只给出偏移地址, 段地址默认在DS段寄存器中 3. mov ax, 1000 mov ds, ax 8086CPU不支持将数据直接送入段寄存器, 所以只能通过通用寄存器来进行中转. 4. 字的传送 80806CPU是16位结构, 有16根数据线, 所以一

汇编入门学习笔记 (十二)—— int指令、端口

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.端口 参考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 执行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS,IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 例子1:编写.安装中断7ch,实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code seg

汇编入门学习笔记 (十二)—— int指令、port

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 运行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS.IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 样例1:编写.安装中断7ch.实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code s

汇编入门学习笔记 (一)—— 基础知识、寄存器

疯狂的暑假学习之  汇编入门学习笔记 (一) 参考:<汇编语言> 王爽  第一,二章 一.基础知识 1. 用汇编语言编写程序的工作过程 汇编本质就是为了方便程序员,把二进制代码用汇编指令来表示 汇编指令---------------->  编译器  ---------------->机器码----------------> 计算机执行 mov ax, bx                                                          100

汇编入门学习笔记 (十)—— 标志寄存器

疯狂的暑假学习之  汇编入门学习笔记 (十)--  标志寄存器 参考: <汇编语言> 王爽 第11章 CPU内部有一种特殊的寄存器叫标志寄存器(flag),它与ax,bx,cx等其他寄存器不同,它不是用来存放数据的,而是用来存放状态的.flag寄存器是按位器作用的,即只有0和1. flag寄存器的结构: 15     14    13    12     11     10     9     8     7     6     5     4     3     2     1     0

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

汇编入门学习笔记 (八)—— 转移指令

疯狂的暑假学习之  汇编入门学习笔记 (八)--  转移指令 參考: <汇编语言> 王爽 第9章 能够改动ip或者同一时候改动cs和ip的指令统称为转移指令. 8086CPU转移行为分为: 段内转移:仅仅改动ip 段间转移:同一时候改动cs和ip 段内转移按ip改动的范围可分为: 短转移:ip改动范围 -128~127 近转移:ip改动范围 -32768~32767 转移指令分为: 无条件转移指令.如 jmp 条件转移指令 循环指令.如 loop 过程. 中断. 1. offset,nop指令

汇编入门学习笔记 (三) —— 第一个程序

疯狂的暑假学习之  汇编入门学习笔记 (三)-- 第一个程序 参考:<汇编语言> 王爽  第四章 1.一个源程序从写到执行的过程 第一步:编写汇编源程序 第二步:对源程序进行编译连接 第三步:在操作系统中执行 2.源程序 代码: assume cs:first first segment start: mov ax,2 add ax,ax add ax,ax mov ax,4C00H int 21H first ends end start 代码解释: assume .segment.ends

汇编入门学习笔记 (九)—— call和ret

疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据,改动IP内容,从而实现近转移 相当于: pop ip retf指令:用栈中的数据.改动CS和IP,从而实现远转移 相当于: pop ip pop cs 样例:ret assume cs:code,ss:stack stack segment db 16 dup(1) stack ends code segm