汇编学习-11使用汇编语言写程序
liuian 2024-12-01 00:54 58 浏览
汇编语言写程序
- 通过dos窗口写汇编指令,不方便保存,不方便写复杂逻辑的代码,所以需要将汇编代码写入到文件中,然后转换成执行程序
- 汇编语言到程序的转换过程,先通过编译的方式由汇编语言转换成机器码,然后再进行链接转换成exe可执行文件
- 汇编文件中引入了伪指令的概念,伪指令最大的作用就是方便程序员书写
汇编代码转换成程序的过程
汇编源码转换成机器语言
- 文件格式由asm转换为ob,这里使用老师提供工具包里的masm命令,需要在dosbox环境下运行
- 编译过程会对汇编代码的书写格式和基本逻辑进行预检查,编译报错会提示
- 执行完毕后生成出的文件
机器语言转换成exe文件
- 文件格式由obj转换成exe,使用link命令进行关联,如果汇编代码中没有指定栈部分的内容会提示没有栈定义(不碍事)
- 生成的文件
运行exe文件
- 这个exe文件无法直接在用户电脑环境运行,也需要在dosbox中运行
- 默认运行什么输出都没有,因为没有打印输出,只有一些寄存器的数值变化
- 这种情况可以使用debug跟踪调试就可以观察寄存器的变化了
备注:测试发现稍微改动了asm文件,挂载路径无法感知,需要重新挂载才能加载新的数据部分。
汇编代码文件的解析
- 汇编代码文件的后缀为asm
- 汇编代码的样例,assume(假设)是伪指令,code是指定的cs对应的段地址,data和stack分别是数据段地址和栈段地址。data segment也是伪指令,意思是这个区域是定义数据的,定义数据时需要指定数据类型(后面会讲数据类型),data ends表示这个段落结束。同理stack segment和code segment。因为数据自带长度,所以后续汇编指令中只需要指定ds和ss的值就行,stack和data中包含系统分配的内存段地址。程序退出是固定格式(后面才会将各种退出指令,这里仅以正常退出为例)。最后的end代表程序结束。汇编语言中;代表注释。
- 这个程序从code段+0偏移地址开始运行(后面偏移地址根据代码内容变化),从data中读取数据段复制给ax寄存器,然后ax寄存器再赋值给ds,有ds后就可以通过ds+偏移地址读取数据。同样将stack赋值给ax,然后ax赋值给ss,这个时候栈段也有了,栈针会根据入栈出栈自动变化。
备注:汇编指令中数据后面加进制符号会报错,汇编代码文件中测试不会报错,程序退出码一定要加16进制的符号,不然编译报错。
汇编程序样例
- 2的3次方样例
- 使用masm,link工具编译成exe文件
- 然后使用debug工具观察寄存器的变化状态,这个是初始状态。本次代码中只涉及代码段,数据部分直接由寄存器临时保存了,也没设置栈段,所以很容易理解。这里我们只需要记住ip和ax的数值即可。
- 后续可以使用t命令或者p(process)命令进行单步执行。ax等于2了,ip等于3了,ip等于3是因为mov ax,2占三个字节。
- 继续t单独执行,ax等于4,ip等于5,add ax,ax占两个字节。
- 继续运行ax等于8,ip等于7
- 后面两步是固定的退出指令
- 以上代码中只涉及了code部分,所以我们可以直接定位到code那一段的内存,查看它写入的数据跟我们编写的代码是否一致
汇编工具的使用
- 汇编工具推荐使用vscode,编译、链接、运行、一步到位。推荐下载下图的插件,编译报错可以直接提示你哪里出错了。
- 插件的配置截图,目前我使用的是默认配置,我看网上有人调整过这里的参数,不过能用我就不改了
- 执行效果如下,老师的课件里用的工具很古老,感觉用着不方便(效率低而且编译报错不提示,中文名字的文件编译也无法编译)。建议就用vscode如果需要使用debug跟踪exe文件再考虑用老师的工具生成exe文件进行单步调试。
相关推荐
- 数据标注接单平台(数据标注接单平台哪个挣得多一点)
-
数据标注员在家可以通过以下方式接单:1.在线平台:有许多数据标注平台允许数据标注员在家完成标注任务,例如标注客、标注助手、数据堂等。这些平台提供了在线标注工具和API接口,让数据标注员可以在家里使用...
- 电脑垃圾怎么清理系统垃圾(电脑垃圾怎么清理干净)
-
电脑清理c盘空间只留系统的操作方法如下。1、打开电脑,找到我的电脑,双击我的电脑,找到盘符C的系统盘。2、找到“属性”菜单。3、点击“属性”后,系统会出现一个新的界面,在新的界面,我们找到“磁盘清理”...
- 显卡推荐性价比2025(显卡2020性价比)
-
2021年买1000块钱的这种显卡性价比最好的还是小米的显卡比较好,因为小米的电子产品呢是比较好的一款它的质量是比较好的,也是比较靠谱的,尤其是1000块钱以内买的这种显卡呢他的内存是比较大的,所以价...
- thinkpad原厂系统重装方法(thinkpad如何重新装系统)
-
若需重装原装系统,需备份系统数据,制作启动盘或将原装系统镜像刻录至光盘或USB。进入BIOS设置,启动优先选项设定为启动盘,重启电脑。按提示选择新系统安装位置。安装完成后更新系统和驱动程序。最后恢复数...
- 安装系统教程win10(安装系统教程win7)
-
正确安装win10系统的步骤如下:1.确认电脑是否满足win10系统的最低配置要求,如CPU、内存、硬盘空间等。2.下载win10系统镜像文件,可以通过微软官网或第三方下载网站获取。3.制作U盘...
- pps影音手机版下载官网(pps影音百科)
-
区别:1,爱奇艺主打网页播放,PPS主打客户端播放器;2,爱奇艺视频正版高清,PPS不全是高清,有部分盗版;3,爱奇艺在线播放比较好,PPS的P2P加载技术打开视频较快。1、爱奇艺PPS影音其实是爱...
- 百度官方下载安装免费(百度官网免费下载)
-
你好!有两种方法可以免费下载!第一:加入百度文库VIP看百度文库的说明,只要加入百度文库的VIP即可免费下载,不过不推荐这种还是需要花钱的方式第二:下载冰点下载器那这种方法该如何免费下载呢?下面我详细...
-
- windows10更新文件在哪里(win10系统更新文件在哪个文件夹)
-
win10自动更新下载的文件位于C:\Windows\SoftwareDistribution\Download文件夹中。当然我们要找到哪个文件夹确切到哪个补丁并不是那么容易的,因为命名的文件夹都是长长的一段代号,一般我们要删除更新文件的...
-
2026-01-02 03:55 liuian
- 扫描仪怎么安装(信鸽扫描仪怎么安装)
-
扫描仪的安装步骤可能会略有不同,具体取决于您所使用的扫描仪品牌和型号。一般而言,您可以按照以下基本步骤来安装扫描仪:确认您的计算机系统符合扫描仪的最低系统要求。在计算机上插入扫描仪的安装光盘,或从制造...
- u盘怎么启动重装系统(u盘启动重装系统哪个好)
-
1.下载好系统之家U盘以后在电脑上插入U盘并打开软件,软件会自,动配置用户的电脑信息,点击制作U盘启动盘。2.接着就进入了选择系统的界面,在这里选择需要安装的系统版本,然后点击开始制作。3.弹出提示窗...
- photoshopcs6哪一年的(pscs6版本好用吗)
-
pscs6的发行时间是2012年4月24日,该软件是是AdobePhotoshop的第13代,具有多种功能,包括内容识别修补、Mercury图形引擎/3D性能提升/3D控制功能/改良的设计工具/全新的...
- 电脑如何设置自动关机win10(win10系统电脑怎么设置自动关机)
-
windows10自动关机设置方法如下1、打开电脑管家主界面,点击右下角的“工具箱”;2、在工具箱的其他分类中选择打开“健康小助手”;3、健康小助手中有三项功能,护眼配色、定时休息和定时关机,点击定时...
- wan口未连接是欠费吗(wan口未连接是怎么回事)
-
网费欠费了路由器WAN指示灯常亮不闪烁,一个灯亮。路由器正常工作的话,电源指示灯是常亮状态,SYS系统指示灯和WAN指示灯会闪亮,尤其是WAN指示灯的状态有些复杂:如果WAN指示灯不亮,说明网络连接有...
- 如何用手机修复sd卡(如何用手机修复sd卡受损)
-
第一步:将要修复的内存卡,用读卡器连接到电脑上,然后下载失易得数据恢复软件。 第二步:运行软件,选择要恢复的“u盘/储存卡”功能。注:在恢复数据之...
- 惠普台式机bios设置(惠普台式机bios设置核显内存)
-
1、按电源键启动电脑,在屏幕刚亮时,不停点击F10按键,就可以进入BIOS界面;2、如果F10没反应,则在启动时不停点击ESC键;3、这个时候会进入到启动菜单选项,F10BIOSSetup就是BI...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
