内容简介:堆栈的学习类似生活中的一瓶糖水,一瓶盐水,现在需要交换两个瓶子的液体。使用“堆栈”这个容器进行了一个中转。程序功能把内存单元的ffff:0 ~ffff:b单元的内容复制到0:200~0:20b内存单元中。
堆栈的学习
assume cs:codesg codesg segment mov ax,2000h ;地址2000h赋值给ax mov ss,ax ;ax的值传递给段寄存器ss mov sp,0 ;堆栈指针sp赋初值0 pop ax ;出栈到ax pop bx ;出栈到bx push ax ;ax入栈 push bx ;bx入栈 pop ax ;出栈到ax pop bx ;出栈到bx mov ax,4c00h int 21h codesg ends end
首先观察代码段的前256字节称为PSP的内容
通过debug观察各个寄存器的值,通过现象学习堆栈的 后进先出 的操作规则。
可以看到进行
出栈出栈
入栈入栈
再出栈出栈
之后
ax和bx寄存器的值进行了交换。
类似生活中的一瓶糖水,一瓶盐水,现在需要交换两个瓶子的液体。使用“堆栈”这个容器进行了一个中转。
第六个程序
程序功能把内存单元的ffff:0 ~ffff:b单元的内容复制到0:200~0:20b内存单元中。
assume cs:code code segment mov ax,0ffffh ;通过ax中转给段寄存器ds赋初值FFFFH mov ds,ax mov ax,0020h ;通过ax中转给段寄存器es赋初值20H mov es,ax mov bx,0 ;bx置零 mov cx,12 ;循环12次 s: mov dl,[bx] ;循环体s 开始循环12次 mov es:[bx],dl ;通过dl中转把ds:0-ds:b中的内容复制到es:0-es:b inc bx ;b自增一 loop ;循环 mov ax,4c00h int 21h code ends end
总结:此程序类似 C语言 中的循环,通过段寄存器DS和ES、BX自加、 以及循环,达到复制内存的目的。其中bx的作用就相当于C语言中的自加量i的作用。C代码如下
char i; for(i = 0; i < 12; i++) { ds[i] = es[i]; i++; }
包含多个段的程序
在计算机运行程序时,程序和数据都是以二进制形式加载到内存中,实际上程序段和数据段对于计算机来说并没有任何不同。但是对于编程人员来说并不是一件好事,我们希望程序和数据以及堆栈分开存放。那么就需要对程序进行分块了。
第七个程序
交换内存中数据段前两个双字单元的数据
assume cs:code,ds:data,ss:stack data segment ;定义数据段 dw 0123h,0456h,0798h,0abch,0defh,0fdeh,0cbah,0987h data ends stack segment ;定义栈段 dw 0,0,0,0,0,0,0,0 stack ends code segment ;定义代码段 start: mov ax,data ;数据段地址给到ds mov ds,ax mov ax,stack ;栈段地址给到ss mov ss,ax mov sp,16 ;栈段指针指向栈底 push ds:[0] ;把数据段的ds:[0]单元的双字内容 压入栈 push ds:[2] ;把数据段的ds:[2]单元的双字内容 压入栈 pop ds:[0] ;出栈到ds:[0]单元 pop ds:[2] ;出栈到ds:[2]单元 mov ax,4c00h int 21h code ends end start
通过
debug调试器
可以即将运行的代码看到
date段
的地址为
0b36h
,通过
d命令
查看内存
0b36
处的内容,正是在程序中定义的数据段
0123h,0456h,···,0987h
栈段地址为0b37h,在内存中 0b36:0010
单元处即为在程序中定义的全0的栈段。
经过两次入栈和出栈之后,可以看出date段的前两个双字节中的数据已经交换了位置。
以上所述就是小编给大家介绍的《汇编基本语法实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- iOS汇编入门教程(一)ARM64汇编基础
- iOS 汇编入门教程(一):ARM64 汇编基础
- iOS汇编入门教程(三)汇编中的 Section 与数据存取
- iOS汇编入门教程(二)在Xcode工程中嵌入汇编代码
- 汇编语言8086笔记
- python编程(反汇编)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。