汇编语言笔记v1.0

时间:2023-01-01 08:46:16

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

差不多就这样,想起来再补充

汇编语言笔记v1.0的更多相关文章

  1. Find security bugs学习笔记V1.0

    Find security bugs学习笔记V1.0 http://www.docin.com/p-779309481.html

  2. PHP代码安全学习笔记V1.0

    PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html

  3. Java安全防御学习笔记V1.0

    Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html

  4. 【转】寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) (v1.0) (

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b57.html 寻找最好的笔记软件:三强篇(EverNote.Mybase.Surfulater) ...

  5. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  6. 【转】寻找最好的笔记软件&colon;海选篇 &lpar;v1&period;0&rpar;

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html   序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...

  7. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群&plus;Istio v1&period;0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

  8. ApacheCN 人工智能知识树 v1&period;0

    贡献者:飞龙 版本:v1.0 最近总是有人问我,把 ApacheCN 这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间.但我觉得这是非常麻烦的,因为每本书的内容大部分是重复的, ...

  9. Git异常:fatal&colon; V1&period;0 cannot be resolved to branch&period;

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

随机推荐

  1. JS-安全检测JavaScript基本数据类型和内置对象的方法

    前言:在前端开发中经常会需要用到检测变量数据类型的需求,比如:判断一个变量是否为undefined或者null来进行下一步的操作,今天在阅读“编写高质量代码-改善JavaScript程序的188个建议 ...

  2. MINA系列学习-IoBuffer

    在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacement ...

  3. 【C&num;】第3章学习要点(二)自定义类和结构

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五*规划教材)<C#程序设计及应用教程>(第3版) 一.要点概述 别人提供的类都是为了简化你的工作量用的,可是 ...

  4. Jenkins&lowbar;获取源码编译并启动服务(一)

    一.安装Jenkins插件(可以手动安装,使用推荐安装容易卡死) 系统管理-->插件管理-->可选插件 Folders Plugin OWASP Markup Formatter Plug ...

  5. &lbrack;转&rsqb;ASP&period;NET会话(Session)保存模式

    本文转自:http://blog.csdn.net/cityhunter172/article/details/727743 作者:寒羽枫(cityhunter172) 大家好,已有四个多月没写东东啦 ...

  6. UML工具选择

    今天在考虑UML工具的选择,个人要求比较简单:能够画用例图,时序图,活动图即可. 选择的工具主要有以下三个: 1.Enterprise Architect 2.Power Designer 15 3. ...

  7. Qt 框架的图形性能高(OpenGL上的系统效率高),网络性能低,开发效率高,Quick是可以走硬件加速——Qt中分为好几套图形系统,差不多代表了2D描画的发展史。最经典的软描画系统

    -----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层 ...

  8. Linux学习之traceroute命令

    通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一 ...

  9. PAMIE模块安装

    PAMIE2.0适用于python2.0.x,PAMIE3.0适用于python3.0.x. 这里记录安装PAMIE2.0方法: 一.安装PAMIE2.0 1.下载PAMIE20压缩包:https:/ ...

  10. nginx异常处理

    1.nginx不转发消息头header问题 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_se ...