当前位置:网站首页>汇编语言学习(一)
汇编语言学习(一)
2022-08-09 13:30:00 【目标是技术宅】
这两天学了王爽的《汇编语言》前三章,总结一下我觉得有点意思的几点。
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.push和pop
这两个命令还是很有意思的。
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。
边栏推荐
猜你喜欢
随机推荐
C语言 指针的解引用详解
C语言,if循环 for 循环 while循环 switch循环 do...while()循环
pyautogui的简单操作(2)-弹窗操作
markdown学习1
目标检测类间不平衡问题
Jetpack Compose——Button(按钮)的使用
Zero Basic Learning CANoe Panel Design Catalog
vivo手机上的系统级消息推送平台的架构设计实践
(PC+WAP)带手机端pbootcms模板农业种植类网站
华为ensp静态路由、DHCP
12.cuBLAS开发指南中文版--cuBLAS中的Level-1函数asum()和axpy()
C语言 猜数字游戏 (含代码并详细注释)
ttemp
理解redis,一篇就够
11.cuBLAS开发指南中文版--cuBLAS中的Level-1函数amax()和amin()
微信小程序getPhoneNumber接口code=40013
spark单机版安装
The use of Jetpack Compose - Button (Button)
元气森林“0糖”背后的百亿推手
C语言中的运算符(超全超详细)









