80x86汇编—汇编程序基本框架

本文介绍了汇编语言的基础概念,包括FirstProgram示例中的指令系统、伪指令的使用,以及如何通过编译、链接和debug工具进行程序调试。重点讲解了int21中断的功能及其在HelloWorld程序中的应用。

通过一个基本框架解释各个指令和用处,方便复习。所以我认为最好的学习顺序就是先看一段完整的汇编代码程序,然后给你逐个逐个的解释每一个代码是干嘛用的。然后剩下的还有很多指令或者伪指令会在以后用到的时候再根据具体上下文使用,我认为汇编就是实战出来的,很多指令根本不用记忆,需求出来了,你用了后就知道是怎个事了。

First Program

经典Hello Word!
代码如下:

stack segment
	db 10 dup(00)
	topSP equ this word ;栈顶指针地址标号
stack ends
datas segment
	string db 'Hello Word!', 0Dh, 0AH, '$'
	db 10 dup (?)
datas ends
code segment
assume cs:code,ss:stack,ds:datas  
start:
	mov ax, datas
	mov ds, ax
	mov dx, offset string
	mov ah, 09h
	int 21h	
	mov ax, 4c00h
	int 21h
code ends
end start


编译->链接->运行,经过三个步骤就能够使用debug对生成的exe文件调试了
编译命令:masm 名.asm;
链接命令:link 名.obj; (obj文件是在masm后自动生成的)
运行命令:名.exe(exe文件是在link后自动生成的)
debug调试exe命令:debug 名.exe

在这里插入图片描述

指令系统

点击复习指令系统

伪指令

伪指令都不占程序空间,因为在编译过程中,你的伪指令全部帮你翻译好了,然后变成机器指令后就只能按照机器指令, 机器指令没有伪指令,伪指令是方便人类阅读代码的,可以通过汇编编译器翻译对应的计算机能够执行的机器指令,比如:fun我把他作为一个函数入口地址,我们编译器翻译的时候不会再fun这一处存fun的地址空间,而是假设你有用到fun这个函数入口地址的话,在你使用该标号的位置处将该标号翻译成fun的入口地址就是fun的下一条指令。

  • 标号(他不是伪指令,是一个不占空间但又不是伪指令的东西)
    可以理解为变量名,变量的名字可以随便起,这个和下面介绍的名字指令差不多。
    标号后一定要接了一个冒号:,表示这个标号可以作为一个地址,地址和下一个指令地址一样。(虽然不是伪指令,但是他也不占程序空间,用来标记程序中某些位置的)

    随便名标号:
    mov ax ,bx
    loop 随便名标号
    ...
    
  • 名字(就是程序中Stack 或者 datas这些,可以随便命名)
    可以理解为变量名,用来记录当前位置的下一条指令或者数据的地址,所以利用这个特点我们就可以用它来定位是一件十分轻松的事情,因为他不占空间地址,写一条指令上去后就可以直接用这个指令的名字来表示地址了,很方便。(这里我程序里面也用到了我给栈顶指针起了个名字topSP ,最显著的特点就是用来当栈顶指针,妈妈再也不用担心我计算指针位置错误了!又因为他不占空间,有了这个标志就直接用就可以找到栈顶指针,不会影响后面的代码位置关系)

    随便名字段 segment 
    随便名字段 ends
    随便名字段 db 'hello'
    ...
    
  • ASSUME
    翻译就是:假设、设想
    在汇编中是指明段寄存器的段名,格式为:assume 段寄存器:随便名字段
    随便名字段是段地址,是段地址,是段地址!!
    assume可以放在开头也行,不一样放在数据段定义的后面,因为assume是伪指令,汇编编译过程中会帮你翻译好。
    很明显这个是给自己编写的段一个归属,比如我datas段就是专门给ds段的,所以在assume中就是ds:datas,这就将我们的datas段数据连接到了数据段了,说到连接,那其实assume的本质就是为了汇编在link的时候将自己写的段设置到正确的段位置。
    注意事项:assume是 给自己定义的数据块指明回家的路,回到自己的段内,意思是DS冒号后面你的数据段属于DS段,那你要是用你他的时候就需要在DS里面访问(这里是一个坑,下面我接着说很重要的一点)
    还有一点很重要:我们assume定义完成后希望在code代码里面使用这段数据的话,其实代码里面还需要自己将DS段设置为随便名字段对应的段地址,我们的随便名字段就是段地址。
    因此正确使用我们定义的数据段因该是:

    assume cs:随便名字段,ds:datas, ss:随便名字段3
    mov ax, datas
    mov ds, ax 
    

    将datas段地址给到我们的ds段,由于前面设置了ds:datas,所以编译器看得懂你这段datas数据,否则定义在其他段了你又在ds使用的话就会出问题。datas可以随便起名字

  • OFFSET 标号或者名字 / SEG 标号或者名字
    offset是返回标号在他自己的段的偏移地址
    seg是返回标号所在的段地址
    一般用法:

    mov ax, offset string 
    mov ax
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值