汇编语言学习(一)

这篇博客是作者学习王爽《汇编语言》前三章的心得,主要介绍了字节单元和字单元的概念,包括它们在内存中的存储方式。此外,还详细阐述了段地址的组成,如数据段、代码段和栈段,并解释了栈段的工作原理,特别是push和pop操作。最后,通过练习题加深了对栈段长度和栈操作的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天学了王爽的《汇编语言》前三章,总结一下我觉得有点意思的几点。

1.字节单元和字单元

一个内存单元就是一个字节单元,有8位。

一个字单元相等于两个字节单元,有16位。

字单元在内存当中的存储,举个例子比如2345,6789的存储:

地址数据
20000h45h
20001h23h
20002h89h
20003h67h

2345h中高位是23h,存在地址大的单元。低位是45h,存在地址小的单元。

一般来说字单元在读取的时候,都是两个两个的读取。比如2345h这个数,在把它放到寄存器的时候,一般采用以下几种语法:

mov ax,2345h

直接存进16位寄存器。

mov ax,[0000]

在段地址为ds的情况下,根据偏移地址存进去一个字单元,两个字节。

如果动歪脑筋,也可以存进去8923h。

mov ax,[0001]

如果只想存一个字节怎么办呢?

mov ah,[0000]

只将一个字节存入寄存器的高位部分ah,当然存入al低位部分也可以。

2.段地址

根据需要,可以将一段内存定义为一个段,可以是数据段、代码段和栈段。

1.数据段

数据段的段地址放在ds中。

每次执行访问内存单元的指令,如mov ax,[0000]时,CPU就会访问ds:[0000]

2.代码段

代码段的段地址放在cs中,偏移地址放在ip中。

CPU每次都会从cs:ip的位置开始执行指令。

3.栈段

栈段的段地址放在ss中,偏移地址放在sp中。

每次进行push、pop操作时,CPU就会遵循先入后出的原则执行命令。

这些段从哪里开始,到哪里结束,都是由人为规定的。尤其是栈段,CPU其实只提供了一个指针,一定要清楚自己安排空间的范围。否则会发生栈溢出或者栈下溢,从而出现覆盖原内容或者其它情况。

3.关于栈段
1.pushpop

这两个命令还是很有意思的。

push操作意味着什么呢?

假如想在栈中放入第n个元素,那么初始时sp指针指向的是第n-1个元素。

进行push ax 操作后,首先sp = sp - 2,然后把ax中的值放入sp目前指向的地址中去。

pop操作就代表着,首先把目前字单元中的值赋给寄存器,然后sp = sp + 2

一定要记住,栈是从高地址低地址生长的。

2.关于push和pop的练习题

书上有一个不错的题目,帮助理解了这两个操作的过程:

在10000h处写入字型数据2266h,不能使用mov 内存单元,寄存器这样的命令。说白了就是要用栈的方法做。

mov ax,1000
mov ss,ax
mov sp,2
mov ax,2266
push ax

有意思的地方就在于一开始sp需要指向2而不是0。因为push操作中sp会往上移两个位置,正好在10000h处存入数据。
如果是要pop出10000h位置的数据,mov sp,0即可。

3.关于栈段长度的练习题

1.如果将10000h~1FFFFh这段空间看作栈段,初始栈是空的,SS=1000h,SP=?

sp = 0

这个其实很好理解,sp - 2等于FFFEh,理解了这个就好了。

2.一个栈段最大可以设为多少?

对于SP和IP,取值范围为0~FFFFh

对于一个栈段,栈满时就会发生环绕,所以最大容量为64KB。

感觉其它段的取值范围也不会超过64KB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值