汇编语言学习(一)

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

1.字节单元和字单元

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

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

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

地址 数据
20000h 45h
20001h 23h
20002h 89h
20003h 67h

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。

猜你喜欢

转载自blog.csdn.net/LJFYYJ/article/details/81114895