汇编语言笔记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 ———————————————————————————————————————— ...
随机推荐
- SQLServer之创建不可重复读
创建不可重复读注意事项 语法:set transaction isolation level repeatable read. 指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都 ...
- SQL实验一
一.实验目的: 了解数据库的结构特点.领会数据库中三种类型的文件特点 学会创建和管理数据库的方法 了解SQL SERVER的基本数据类型 了解表结构的特点,学会创建和管理表的方法 学会使用T-SQL语 ...
- 隐写术之steghide的使用
steghide不是一个软件,所以下载之后解压缩就可以在命令行中使用. win+R,cmd,回车->进入到steghide.exe所在的文件夹,使用隐藏或者解锁的相应命令,即可隐藏或者解锁. 这 ...
- redis 安装时候遇到 jemalloc 问题记录
https://www.cnblogs.com/lovemdx/p/3199886.html https://blog.csdn.net/yfkiss/article/details/7035579 ...
- Ubuntu通过apt-get安装指定版本和查询软件源有多少个版本
一.通过apt-get安装指定版本 apt-get install <<package name>>=<<version>> 二.查询指定软件有多少个版 ...
- Var的用法解析
C#关键字是伴随着.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当一个变量是局部变量(不包括类级别的变量),并且在声明的时候初始化,是使用var关键字的 ...
- JS 设计模式八 -- 发布订阅者模式
概念 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多(一个发布,多个观察)的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 优点 1 ...
- photoshop实例实战(入门级)教程
PS对街拍女孩照片增加质感(2019-03-19 17:57) PS制作水火相溶特效文字图片(2019-03-19 17:49) PS制作简洁漂亮的立体抽丝文字(2019-03-19 17:16) P ...
- [转帖]Ansible管理windows集群
Ansible管理windows集群 http://www.cnblogs.com/Dev0ps/p/10026908.html 写的挺好的 我关注点还是不够好呢 最近公司新项目需要安装400+win ...
- P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...