X86汇编6.编写汇编语言程序

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。

1.程序从写入到执行的过程
(1)编写汇编程序代码===>输出程序文件,helloworld.asm 或 helloword.s(一般linux下用.S命名汇编文件)
(2)对代程序代码进行编译和链接
编译就是: 源码文件---编译--->目标文件
链接就是: 目标文件---链接--->可执行程序
可执行程序包含两部分:(1)代码(汇编指令翻译过来的机器码)和数据(程序中定义的数据),前面说过,无论是代码还是数据,都是二进制的(2)相关的描述信息,如:程序多大,占用多少内存空间,哪里是代码,哪里是数据
(3)执行可执行程序,操作系统依照可执行程序文件中的描述信息,将可执行程序的机器码和数据加载如内存,并进行初始化(如:CS:IP指向第一条要执行的指令),然后CPU开始执行程序。

2.程序
汇编指令:有对应机器码的指令,可以被编译为机器指令
伪指令:不被CPU执行,没有对应的机器指令,是由编译器来执行的指令,编译器根据伪指令来进行相关的编译操作。
示例:
assume cs:codesg
codesg segment
mov ax, 0123H
mov bx, 0456H
add ax, bx
mov ax,4c00H
int 21H
codesg ends
end
(1)伪指令segment...ends
格式:
XXX segment ;定义一个一个段开始,名称为XXX
XXX ends ;定义一个段结尾,名称为XXX
释义:segment...ends指令对,定义一个段XXX。
(2)end
end是一个汇编程序结束的标志。
(3)assume
表示假设,它假设某一段寄存器和程序中的某一个sgment...ends定义的段相关联,上面示例assume cs:codesg就是将代码段codesg和CPU中的段寄存器cs联系起来。

标号:代表一个地址,最终被链接器处理为一个段的段地址
程序结构:段、汇编指令,段和cs关联,程序返回,程序结束标志

编译(linux环境): nasm -felf64 hello.asm
链接(linux环境): ld -o hello hello.o

3.程序运行环境
在dos环境下,CPU是实时模式运行的,我们的汇编代码可以写入任何地址。
在非dos环境下,如:windows 2000/xp/7/8/10下,CPU是保护模式运行,即使是汇编代码也不允许访问一些严格保护的内存单元。

4.模块化程序设计
call与ret共同支持了汇编语言的模块化设计,也就是函数。用寄存器来存储参数和结果是最常使用的方法。对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反:调用者将参数送入参数寄存器,从结果寄存器中取到返回值,子程序从参数寄存器中取到参数,将返回值送入结果寄存器。
多个参数的传递:将参数存入一段内存地址,然后将段地址传到寄存器,传给程序。类似于C语言传指针,但本质是用栈存参数。

原文地址:https://blog.51cto.com/14207158/2473568

时间: 2024-08-08 22:27:12

X86汇编6.编写汇编语言程序的相关文章

linux平台学x86汇编(四):从“hello world!”开始

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 汇编语言程序由定义好的段构成,每个段有各自的目的.三个最常用的的段如下:数据段.bss段.文本段.文本段是可执行程序内声明指令码的地方,所有汇编程序都必须有文本段,数据段和bss段是可选的,但是在程序中经常使用.数据段声明带有初始值的变量,bss段声明使用0值初始化的数据元素,这些元素常用作汇编程序的缓冲区.下图为汇编语言程序的布局. GNU汇编器使用.section命令语句

8086汇编基础 8086汇编语言用什么软件写?

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 有的同学问我,8086汇编语言用什么写呀? 那我就在这里说一下,其实我也就只是学了十几天的汇编语言,说的东西可能不太全面,还望包涵. 1 dosbox (我自己拿VB6.0做的快捷方式存储小程序) 效果是这样的, 我进入的是debug界面,debug是用来调试已经写好的asm的.输入q退出,deb

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首先我们知道32位汇编是可以调用Windows API的,那么今天我们就调用windowsAPI来写一个窗口程序 如果你有windows开发知识,那么就很理解了,如果没有,那么跟着我写,跟着步骤去写,那么也可以写出来 首先我们要编写一个窗口程序(使用SDKAPI编写)有几个步骤 1.设计窗口类 2.注

AT&T x86_32 汇编_001_一个示例程序.md

这一节先写一个简单的汇编程序. 输出cpu的出产厂商. 不对语法, 寄存器等内容进行深入讨论, 只是整体上先有个认知印象. 1. 一些基础知识 简单来说, Linux下的可执行程序文件中, 最重要的三个部分是: 数据段, 代码段, bss段. 关于可执行文件, 以及目标文件的内容构成, 其实这是一个十分复杂的话题, 这里不进行深入讨论, 你可以简单的理解为: 可执行文件由段(section)组成. 每个可执行文件中存在多个段. 段是一种划分可执行二进制程序内容的手段 其中最重要的三个段: 数据段

linux平台学x86汇编(十四):函数的使用

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 和高级语言一样,汇编语言在多个项目之间可能会编写相同的过程和处理,如果使用函数的话就可以不必每次需要时都重复编写实用程序代码,从而在需要它的时候调用它. 函数包含完成特定功能所需的代码,数据从主程序传递给函数,然后结果返回给主程序.调用函数时,程序执行路径被改变,切换到函数代码的第一条指令.处理器从这个位置开始执行指令,直到函数表明它可以把控制返回到主程序中的原始位置. 在汇

对X86汇编的理解与入门

本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理解了本文后,基本可以无障碍地阅读绝大部分标准X86汇编程序.当然,更复杂的指令请参阅Intel相关文档. 1 寄存器. 主要寄存器如下图所示: X86处理器中有8个32位的通用寄存器.由于历史的原因,EAX通常用于计算,ECX通常用于循环变量计数.ESP和EBP有专门用途,ESP指示栈指针(用于指示

linux平台学x86汇编(五):使用gdb调试汇编程序

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 正如C语言一样,编写所有语言程序一样会出现一些一些错误,发生错误时,我们可以使用调试器一步一步运行程序以监视数据是如何被处理的.本节使用GNU调试器检查上一节hello程序,监视处理过程中寄存器和内存的值的变化.要调试汇编语言程序,在编译时,需要使用-gstabs参数重新汇编源代码,使用了该参数编译出来的可执行文件要比之前稍大一些,因为添加了附加信息.上一节程序不使用-gst

linux平台学x86汇编(三):相关开发工具

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 类似于其它高级语言,编写汇编语言,必须有一个开发环境,那么也就需要适当的工具了.搭建汇编语言至少应该有下面这些工具:汇编器.链接器.调试器.下下面看看在汇编语言开发环境中如何使用它们. 汇编器 汇编器用于把汇编语言源代码转换为处理器指令码.选择的汇编器必须能够生成所在系统的处理器系列指令码.汇编语言源代码程序有3个部分:操作码助记符.数据段.命令.但是每种汇编器对于每个部分使

X86汇编快速入门

本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理解了本文后,基本可以无障碍地阅读绝大部分标准X86汇编程序.当然,更复杂的指令请参阅Intel相关文档. 1 寄存器. 主要寄存器如下图所示: X86处理器中有8个32位的通用寄存器.由于历史的原因,EAX通常用于计算,ECX通常用于循环变量计数.ESP和EBP有专门用途,ESP指示栈指针(用于指示