Aseembly(八)-汇编语言编写程序

2024-08-21 06:04

本文主要是介绍Aseembly(八)-汇编语言编写程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在该系列的第六篇文章我们主要讲述了:关于栈的寄存器:SS和SP的问题
来回一下:
对于栈指针来说,栈在被开辟的时候,首先要通过SS指针去找到开辟栈的地址空间的首地址,随后,SP指针指向该栈空间的末尾的下一个空间处.当执行push指令时,sp会-2 随后将目标压入栈中
当执行pop指令时,会先将元素弹出,随后执行sp+2
还回顾了关于不同段寄存器的作用:
ds与[] 是读取数据
cs:ip是去寻找指令
而ss:sp与栈空间有关.
详情请看我的上一篇文章

Assembly(六)–寄存器总篇章

喜欢的小伙伴点赞关注支持一下~ 博主争取日更哦~
本篇文章我们将去透彻的理解一个完整的程序.

1.1 程序从写出到被执行的过程

  1. 编写汇编源程序 用汇编语言等语言编写程序的源程序
  2. 对原程序进行编译 link
    这部分可以参照我的另一篇文章:关于C++的编译和链接的新看法
    C++
  3. 执行可执行文件中的程序,有cs:ip指向第一条要执行的指令,然后由cpu执行程序

1.2 源程序的讲解

让我们来实际的看下一段汇编的程序吧

assume cs:codesgcodesg segment mov ax,0123Hmov bx,0456Hadd ax,bxadd ax,axmov ax,4c00Hint 21H
codesg endsend

关于程序,由以下几点要说明:
伪指令

  • 程序中出现的伪指令有:xxx segment xxx ends ,这个segment与ends是成对出现的,表示定义了一个段,这个段是xxx 像是程序中的 段名叫 codesg
  • end ,.end是代表着一个汇编程序的结束标志
  • assume 用来假设程序的某一个段与某个寄存器相联系,比如 其中的 assume cs:codesg 这里就跟cs寄存器联系起来了
    一个汇编程序通常由伪指令和汇编指令组成.经过编译链接后编程可执行文件.

练习:让我们来写一个计算2的三次方的程序吧:

assume cs:cac
cac segment mov ax,2add ax,axadd ax,ax
cac ends 
end

十分简单
当我们考虑到:一个程序要有返回值时,问题就来了

1.3 程序的返回

观察之前的程序:

assume cs:codesgcodesg segment mov ax,0123Hmov bx,0456Hadd ax,bxadd ax,axmov ax,4c00Hint 21H
codesg endsend

我们不难看出有两条指令没有被提到:

mov ax,4c00H
int 21H

这两条指令所实现的功能就是程序返回
我们不必深究为什么,反转在end后面加两条指令就可以实现程序返回.

1.4 实战:

1. 在准备好的dosbox中,使用edit功能:

在这里插入图片描述
进行编辑
在这里插入图片描述
保存退出为1.asm
随后进行编译
使用masm.exe
在这里插入图片描述
这里先输入文件名,随后默认obj文件的名字 随后忽略文件生成列表和交叉引用文件
编译完成!
接下来开始链接:
使用link.exe
在这里插入图片描述
在忽略了 lib和无栈段生成后,我们成功的链接了文件.生成了exe文件
链接的作用是什么呢?
首先当程序很大的时候,可以分成多个文件来进行编译,自然链接到一起可以很方便
其次如果程序中强调了某个库文件的子程序,链接也十分必要了.

2. 编译 链接 跟踪

写文件t1.asm

assume cs:codesg
codesg segmentmov ax.2000Hmov ss,axmov sp,0add sp.10pop axpop bxpush axpush bxpop axpop bxmov ax,4c00Hint 21Hcodesg endsend

在这里插入图片描述

然后进行编译 链接后使用debug进行调试

在这里插入图片描述
可以看到目前的cs:ip是在076A:0处
此时的SS是0769 sp为0
在这里插入图片描述
执行两次命令后,成功的将ax的值赋值给了ss
接下来就是执行sp的赋值了
其实这里的pop ax就是为了让sp=sp+2
连着两次都是
在这里插入图片描述

随后进行push操作 是为了让sp=sp-2
在这里插入图片描述

这篇关于Aseembly(八)-汇编语言编写程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092322

相关文章

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

汇编语言知识基础介绍

汇编语言是一种低级编程语言,直接与计算机硬件的指令集架构(ISA)对应。它在操作系统、设备驱动程序和性能关键的应用程序中起着重要作用。以下是汇编语言的基础介绍: 1. 基本概念 指令集架构(ISA):汇编语言与特定的处理器架构(如 x86、ARM)对应,每种架构有其特定的指令集。汇编指令:汇编语言的语法是处理器指令的符号表示,通常包括操作码(opcode)和操作数。操作码指定操作的类型,操作数

汇编语言输出“Hello World!“

1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800mov ds,axmov byte [0x00],'H'mov byte [0x02],'e'mov byte [0x04],'l'mov byte [0

ARM——结构体系(处理器工作模式,CPSR,立即数,汇编语言函数调用)

1、处理器工作模式          ARM有7个基本工作模式:User:非特权模式,大部分任务执行在这种模式FIQ:当一个高优先级(fast)中断产生时将会进入这种模式IRQ:当一个低优先级(normal)中断产生时将会进入这种模式Supervisor:当复位或软中断指令执行时将会进入这种模式Abort:当存取异常时将会进入这种模式Undef:当执行未定义指令时会进入这种模式Sy

ARM下汇编语言编程

一、ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。 二、ARM汇编语言中常用的伪操作 例如: area reset,cod

编写程序:输入三个整数,然后按由大到小的顺序输出这三个数。

方法一(直接交换) #include<stdio.h>int main(){int a,b,c;scanf("%d%d%d",&a,&b,&c); //可以这么写 想办法把a换成最大的数 ,之后是b cint temp;if(a<b){temp=a;a=b;b=temp;} if(a<c){temp=a;a=c;c=temp;}if(b<c){temp=b;b=c;c=temp;}print

某学生有两门考试课程,实行百分制考核。编写程序,输入这两门课程的成绩,计算其平均成绩。

#include<stdio.h>int main(){float a,b;scanf("%f%f",&a,&b);printf("%.2f\n",(a+b)/2.0); return 0;} 这里需要注意数据类型,分数不一定是整数,可能是实数。

编写程序,读入未指定个数的整数,判断读入的整数有多少个,读入的负数有多少个

编写程序,读入未指定个数的整数,判断读入的整数有多少个,读入的负数有多少个,输入0表示程序结束,计算总和和平均值。 import java.util.Scanner; public class chapt3 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.

汇编语言05——包含多个段的程序

整理自fishcc论坛 安全的空间 通常来说,0:200~0:300这段空间是相对安全的,操作系统通常不会去占用 但这只有256个字节,当需要更多空间时,可以向操作系统申请 问题: 编程计算以下8个数据的和,结果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 程序: assume cs

汇编语言04——[BX]和loop指令

整理自fishcc论坛课件 首先展示一个新的程序: assume cs:codesg codesg segment start: mov ax,2000H mov ds,ax mov al,[0] mov bl,[1] mov cl,[2] mov dl,[3] mov ax,4C00H int 21H codesg ends end start 使用masm进行