汇编语言笔记v1.0
1.loop的用法
loop指令的格式是:loop标号,cpu执行loop指令的时候,要进行两步操作
1:(cx)=(cx)-1
2:判断cx中的值,不为零则转至标号处执行,如果为零,则向下执行
这里有几点需要注意:
1.loop虽然是一种循环的格式,但是和高级语言中的for或者while不同,它本身并没有达成循环的作用,只是提供一个循环中可以用到的判断。要实现循环,依然需要搭配程序段以及程序段中的jmp实现
2.loop是“先减再判断”,这一点在设置cx的值时要特别注意。例如,如果需要循环十次,那么cx中的值应该设置为11.因为除了循环10次之外,最后一次要跳出循环时是cx-1==0,这里的cx依然需要保持为1
2.emu8086与debug
就我本人而言,我更倾向于在学习汇编语言时使用emu8086,IDE的存在可以减少重复劳动、提高学习效率,但是emu8086作为一款模拟软件,并没有支持8086所有的伪指令和宏指令。目前我个人已经发现emu8086不支持的操作有如下:
不支持宏嵌套
不能识别宏中的IF,ELSE语句
DUP不支持无定义的字节变量(DB ?),支持(DW ?),但是初始化时初始化为0(xx DB )
不支持size length伪指令 ORG 和SEG伪指令align
不支持structure
所以,在这种情况下,我们只能使用debug进行调试。但是要注意debug只能用来调试.exe文件时才能出现你所编写的代码,如果直接调试.asm文件将出现难以理解的代码。
常用的debug命令如下:
名称 解释 格式
a (Assemble) 逐行汇编 a [address]
c (Compare) 比较两内存块 c range address
d (Dump) 内存16进制显示 d [address]或 d [range]
e (Enter) 修改内存字节 e address [list]
f (fin) 预置一段内存 f range list
g (Go) 执行程序 g [=address][address...]
h (Hexavithmetic) 制算术运算 h value value
i (Input) 从指定端口地址输入 i pataddress
l (Load) 读盘 l [address [driver seetor>
m (Move) 内存块传送 m range address
n (Name) 置文件名 n filespec [filespec...]
o (Output) 从指定端口地址输出 o portadress byte
q (Quit) 结束 q
r (Register) 显示和修改寄存器 r [register name]
s (Search) 查找字节串 s range list
t (Trace) 跟踪执行 t [=address] [value]
u (Unassemble) 反汇编 u [address ]或range
w (Write) 存盘 w [address[driver sector secnum>
? 联机帮助 ?
3.struc的使用
struc的结构预置语句应该放在数据段中,作为数据的一部分。而对于结构的定义也即struc段应该放在各段之外单独成段。注意,对于数据段中的结构预置语句,如果不给与初始化值,一定要用逗号隔开,否则会出现初始化错误
4.键盘输入输出
总结一下常用的键盘输入输出方式:
4.1.1 输入字符
ah=1,字符的ASCII码传入al中
4.1.2 输入字符串
字符串的输入按照结构要求,需要预先在数据段中准备好以下结构:
maxlen db ;字符串的最大长度,需要初始化
actlen db ?;实际输入的字符串长度,这个可以初始化也可以不做初始化
string db dup(?);用于存放字符的串,长度用dup确定下来
4.2.1 输入字符
ah=2,将字符的ASCII码存放在dl中
4.2.2 输出字符串
ah=9, 将字符串的偏移量用offset的形式传入dx中。注意,字符串要人为在最后加上结束符,如果要回车(0dh)换行(0ah),也要人为加在结束符之前
eg.
string db 'hello',0dh,0ah,'$'
mov dx,offset string
mov ah,
int 21h
5.堆栈
在调用子程序时,如果是远调用(call a; a proc far),会在堆栈中依次压入cs和ip,而如果是近调用(call a; a proc near)只会压入ip。在使用ret返回主程序时,要务必保证堆栈顶是ip,否则会返回到错误的位置去执行
另外,在子程序的开头,我们需要保存子程序中要用到的寄存器的原有的值以便主程序继续使用,保存的方法就是压入堆栈。如果我们没有自定义堆栈段,那么程序会自动将数据段作为堆栈段,但是是从数据填入的反方向开始填入堆栈段数据
6.运算
有一些需要记住的运算
6.1 乘法运算
乘法运算只传递一个参数。如果传入8位寄存器,则与AL相乘,结果保存在AX中;如果传入16位寄存器,则与AX相乘,结果保存在DX:AX中。即对于乘法,两个数的位数是相同的。
6.2 除法运算
而除法则不然:除数、商和余数的位数都要是被除数的一半!被除数同样放在AL或者AX中,根据传入的参数的位数决定使用哪个
6.3 移位运算
下面图片里的内容都很关键
差不多就这样,想起来再补充
汇编语言笔记v1.0的更多相关文章
- Find security bugs学习笔记V1.0
Find security bugs学习笔记V1.0 http://www.docin.com/p-779309481.html
- PHP代码安全学习笔记V1.0
PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html
- Java安全防御学习笔记V1.0
Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html
- 【转】寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) (v1.0) (
原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b57.html 寻找最好的笔记软件:三强篇(EverNote.Mybase.Surfulater) ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- 【转】寻找最好的笔记软件:海选篇 (v1.0)
原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html 序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...
- 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)
部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序 在下载的Istio安装包的samples目录中包含了示例应用程序. ...
- ApacheCN 人工智能知识树 v1.0
贡献者:飞龙 版本:v1.0 最近总是有人问我,把 ApacheCN 这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间.但我觉得这是非常麻烦的,因为每本书的内容大部分是重复的, ...
- Git异常:fatal: V1.0 cannot be resolved to branch.
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
随机推荐
- go打造以太坊合约测试框架
传送门: 柏链项目学院 1 以太坊智能合约编译 以太坊智能合约编写使用solidity语言,一般情况下我们会在remix环境下进行编译测试,在线环境相对比较稳定.如果不想用在线环境,那我们就需要自己动 ...
- php中curl返回false的解决办法
本文介绍一下自己在使用curl中遇到的问题解决办法.希望可以帮助到大家. 原文地址:代码汇个人博客 http://www.codehui.net/info/37.html 首先来看一个封装的curl函 ...
- “尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。”
远程连接服务器的数据库调试WCF程序时,可以正常访问数据库,但将程序发布成站点部署在数据库所在的服务器之后,一直报错,通过try/catch捕获得到以下报错信息: System.Exception: ...
- 数据库MySQL和Redis实践
1.关于数据库设计的那些事 2.MySQL 3.Redis
- springboot文件上传下载简单使用
springboot的文件上传比较简单 一.使用默认的Resolver:StandardServletMultipartResolver controller package com.mydemo.w ...
- bound+vlan
- 如何把Office365的更新从半年通道改成月度通道
转自msdn,转发链接:www.cnblogs.com/Charltsing/p/Office365month.html 作者QQ: 564955427 建立一个Bat文件,写入 下面内容 setlo ...
- 我的工具:Db SQL Monitor
SQL Monitor 是一款界面简洁.绿色小巧的sql活动监视器,它能够帮助用户对 SQL Server 运行进程和Job进行实时监视,您可以查看当前执行的SQL/命令并终止. 工具下载地址:htt ...
- 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解
方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二 1. 方法一: 思路: 1. 新创建一个链表节点头,假设这里就叫 head3: 2. 因为另外两个链表都为单调递增,所 ...
- 搭建一个MP-demo(mybatis_plus)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 搭建一个简单的MP-demo 1.配置pom.xml ...