汇编程序设计
发如雪-ty
一个工作7年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有3年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
汇编程序设计-36-在代码中安排自己定义的栈空间
利用栈,将程序中定义的数据逆序存放(0123H,0456H,…)通过前面文章的介绍,寄存器的栈顶地址由ss和sp两个寄存器的值组合。assume cs:codecode segment dw 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 start: mov ax,cs mov ss,ax mov sp,48原创 2022-01-23 15:05:21 · 338 阅读 · 0 评论 -
汇编程序设计-35-在代码中安排自定义的数据
assume cs:codecode segment dw 1,2,3,4,5,6,7,8 ;我们自己定义的数据,而不是指令,d:define w:word start: mov ax,0 ;指令开始执行的地方 mov cx,8 mov bx,0 s: add ax,cs:[bx] add bx,2 loop s mov ax,4C00H int 21Hcode ends原创 2022-01-23 13:27:32 · 250 阅读 · 0 评论 -
汇编程序设计-34-试验
向内存0:200~23F依次传送数据0-63.mov ax,20mov es,axmov bx,0mov cx,64mov dl,0mov es,bx,dlinc bxinc dl原创 2022-01-19 23:16:01 · 271 阅读 · 0 评论 -
汇编程序设计-33-ES寄存器初探
段地址*10H + 偏移地址 = 物理地址注意es寄存器这里的使用 mov es:[bx],dl ===》mov es,bx,dl原创 2022-01-19 00:01:48 · 2285 阅读 · 0 评论 -
汇编程序设计-32-使用loop指令实现31中的测试
CX中存放的是循环次数,10H也就是16每次执行循环一次CX中的值就减1.题目:用编程进行加法计算 123*236的结果存放在AX中原创 2022-01-17 23:47:35 · 286 阅读 · 0 评论 -
汇编程序设计-31-一个小测试
把inc dlinc bxmov [bx],dl执行16此就解决本题目,但后面会对改题目作一个优化原创 2022-01-16 22:13:56 · 150 阅读 · 0 评论 -
汇编程序设计-30-BX寄存器的使用
如何将CD 20放入到AX中?1.以前的方法:2.使用BX:如何将E505装入AX,从结果可以看出BX,里面装的的偏移地址。不管那种方式都是以DS中的地址为段地址。原创 2022-01-16 20:32:00 · 308 阅读 · 0 评论 -
汇编程序设计-29-关于汇编源程序
下面这句是程序返回:程序返回后,系统做一些资源回收的操作。原创 2022-01-16 17:29:47 · 105 阅读 · 0 评论 -
汇编程序设计-28-栈的作用
作用1:临时保存数据CPU执行命令的过程之前提到过,如下:注意寄存器的变化,以及CALL 001C下一行执行的命令地址:077A:000B在8086CPU中,在任意时刻将段地址寄存器SS和偏移地址寄存器SP所组合出来的内存地址当作栈顶标记,所以注意这两个寄存器的变化。由上述运行结果可以看出SP减少了2,也就是PUSH了(压栈)。从运行结果可以看出SP的地址恢复到原来的0080H.所以栈有临时保存数据的作用。作用2:用栈进行数据交换...原创 2022-01-16 12:22:50 · 450 阅读 · 0 评论 -
汇编程序设计-27-栈的设置
上图是一个栈在内存中的示意图,在cpu中栈顶指针是通过SS寄存器和SP寄存器的组合来表示栈顶指针所指地址的。在内存中,修改2000:0000的值,既然是通过SS、SP寄存器来设置栈顶指针的,那我们可以改变栈顶的指向,从而决定栈的大小。因为栈是向下生长的,如果要全部表示刚才输入的数字。那栈顶指针应该为起点2000:0000接下来修改寄存器。执行pop ax后,从运行结果可以看出sp从0000变为了0002,移动了两个内存单元。因为ax为16位。此时ax也变为0201H,满足预期结果。...原创 2022-01-14 23:11:41 · 703 阅读 · 0 评论 -
汇编程序设计-26-栈的理解
在8086CPU中,在任意时刻将段地址寄存器SS和偏移地址寄存器SP所组合出来的内存地址当作栈顶标记。push ax 修改SP寄存器中的数字 SP = SP -2将AX中的字型数据 --> SS:SP所组合出来的内存地址中 ~ 入栈pop bx SS:SP所组合出来的内存地址中的字型数据修改栈顶标记 SP = SP +2 成为新的栈顶标记 ~ 出栈从结果可以原创 2022-01-13 23:16:57 · 189 阅读 · 0 评论 -
汇编程序设计-25-数据段(编程时候一种数据安排)
原创 2022-01-12 23:51:51 · 147 阅读 · 0 评论 -
汇编程序设计-24-使用mov,add指令操作内存与寄存器练习
第一条命令执行后AX变为1000H,继续执行后面的指令,如下:使用mov ax,[n]这种格式的,一般都是从DS位置开始。举个例子:看执行结果:和预测一样,结果正确。原创 2022-01-12 23:41:11 · 350 阅读 · 0 评论 -
汇编程序设计-23-使用mov指令将内存中的数据放到寄存器
地址0,数据如下:如何将CD放入寄存器中呢?因为CD占一个字节,那么使用AL即可。那如何将一个字型数据放入到寄存器中?字型数据占2个字节,高位存高字节,低位存低字节从左到右地址是递增的。接下来看看如何将寄存器中的地址写入到内存。...原创 2022-01-11 23:40:37 · 1209 阅读 · 0 评论 -
汇编程序设计-22-debug调试工具
r修改寄存器中的内容:d指令,从某个位置开始查看使用d指令查看一段内存使用a指令在某段内存编写汇编指令但在2000:0处写的指令不会被执行,因为CS+IP并没有指向那里,如果要被执行需要修改这两个的内容。这样CPU就会从我们刚写的命令开始执行。使用t命令执行,结果如下:e指令是直接修改内存,下面演示,空格修改下一个使用d查看...原创 2022-01-09 23:42:38 · 254 阅读 · 0 评论 -
汇编程序设计-21-指令执行的过程详解
第一步,从CS+IP读取指令:第二步,修改IP内容(第一条指令为3个字节):所以IP应该加3第三步,执行缓冲器中的指令(B8 22 66 也就是 mov ax,6622H)然后回到第一步,继续读取指令(CS:2000H IP:0003H). 也就是 jmp 1000:3然后放到缓冲器中。第二步,修改IP的内容,刚取的是5个字节,那IP应该变为0008H第三步,执行缓冲器中的指令:jmp 1000:3此时会修改CS和IP寄存器中的内容在内存中他两组合的地址如下此时 a...原创 2022-01-09 17:00:47 · 1593 阅读 · 0 评论 -
汇编程序设计-20-数内存
打开DOXBox输入三条指令mov ax,1000mov bx,1000mov bl,10然后使用d命令,查看CS+IP组合的地址,可以看到为B8 00 10 也就是 MOV AX,1000的机器码B8(073F:0100) 00(073F:0101) 10(073F:0102) 也就是三个字节。那073F:0103是下一条指令的地址,请看下图:...原创 2022-01-09 15:42:08 · 325 阅读 · 0 评论 -
汇编程序设计-19-IP寄存器和指令长度的关系
一条指令可以由多个字节构成。指令的执行过程:1.CPU从当前的CS和IP指向的内存单元读取指令,然后将读取的指令进入到指令缓冲器(CPU中保存指令的地方)中。2.改变IP寄存器的内容。IP = IP +所读指令的字节数(长度),从而指向下一条指令。3.执行指令缓冲器中的内容,回到第一步。打开DOSBOX,输入三条指令如下:第一条指令为 MOV AX,1000,占3个字节(B80010),当前IP=0100,则执行完为IP=0103H下一条执行后应该是IP=0106H下一条指令占两个字.原创 2022-01-09 15:09:14 · 1302 阅读 · 0 评论 -
汇编程序设计-18-修改CS和IP寄存器的汇编指令
可以通过转移指令来修改CS和IP寄存器的汇编指令jmp 转移指令,是jump的缩写,也可以叫作跳转指令,使用方法如下:jmp 段地址:偏移地址jmp 2AE3:0003 CS = 2AE3H IP = 0003H2AE3H * 10H + 0003H = 2AE33H–cpu从这里读取指令使用a命令可以查看下一条执行的命令同时a命令也可以修改从结果可以看出下一条指令执行 JMP 2AE3:0003,注意观察CS,IP两个寄存器的值。然后使用t命令,执行。结果如下:原创 2022-01-08 22:54:36 · 2090 阅读 · 0 评论 -
汇编程序设计-17-CPU如何区分指令和数据
在内存中指令和数据是没有区别的,只有它们被读入到CPU中才会区分数据和地址。在8086CPU中,在任意时刻,CPU将段地址寄存器CS和偏移地址寄存器IP中的地址进行组合,然后CPU从这个组合出来的物理地址开始读取字节。指令从哪里来?从CS和IP所组合的地址中来1.先使用d命令,查看地址,d 2000:0,如下2.使用e命令修改2000:0开始的内存(修改完之后,按空格会跳转到下一个字节,然后继续修改)3.可以使用(U+ 地址)命令,将指定地址的内容翻译成汇编指令4.那如何让CPU执原创 2022-01-08 21:41:21 · 1204 阅读 · 0 评论 -
汇编程序设计-16-检测点
1.给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为多少?解:段地址已经固定了,偏移地址的范围为 0~FFFFH已知物理地址的计算公式为:段地址 * 16(10H)+ 偏移地址 = 物理地址0001H *10H +0 = 10H0001H *10H + FFFFH = 1000FH则范围为10H~1000FH2.有以数据存放在内存 20000H单元中,现给定段地址为SA,若想用偏地址寻找到此单元免责SA应该满足的条件是:最小为___,最大为__.SA *10H + x(偏移原创 2022-01-08 17:42:38 · 342 阅读 · 0 评论 -
汇编程序设计-15-内存地址的表示方式
073F:0100段地址:偏移地址段地址寄存器:ds,es,ss,cs且都是16位寄存器,他们的寻址能力为2的16次方。那地址范围为:0000 0000 0000 0000 --> 1111 1111 1111 1111但8086CPU有20根地址线,则该cpu的寻址能力为2的20次方。地址的范围为:0000 0000 0000 0000 0000 --> 1111 1111 1111 1111 1111但段地址地存器都是16位的,在物理上是无法表示20位地址线的。那如何表示呢.原创 2022-01-07 23:17:42 · 1750 阅读 · 0 评论 -
汇编程序设计-14-add指令
add指令是CPU用来加法计算的汇编指令。一、add命令的常规操作add 寄存器,数据解释:将数据累加到寄存器中,比如寄存器当时是1,数据为2,则结果为3,此时寄存器所保存的值就是3.1.启动dosbox,然后输入debug,r接着输入a,回车然后输入命令:mov ax,18mov ah,78add ax,8然后回车两次,输入r后回车,就可以看到下一次执行的命令为:MOV AX,0018然后使用 t (执行命令) ,回车:从结果可以看出AX变为了0018H,以及下一条要执行的命原创 2022-01-07 00:03:23 · 21578 阅读 · 3 评论 -
汇编程序设计-13-move指令
DOSBOX->debug->r,r具有查看的功能接着输入a,回车,输入:mov ax,5 回车、回车、r在这里,我们之前写的是mov ax,5但最终变为MOV AX,0005,这之间其实已经有了编译(翻译)的过程。注意:我们在使用mov指令时,要保证数据与寄存器之间,位数的一致性。16位寄存器对16位数据,8位寄存器对8位数据。接着输入t,用于执行MOV AX,0005然后使用r查看:从结果可看出AX变为0005了mov ax,5 :将’,'号右边移动到‘,’号左边接下来原创 2022-01-05 22:59:31 · 2255 阅读 · 0 评论 -
汇编程序设计-12-字节型数据和字型数据
字节数据 = 1Byte = 8bit = 8位数据==》8位寄存器字型数据 = 2 byte = 16bit = 1 word = 16位数据=>16位寄存器4E20H =》AX H:16进制原创 2022-01-05 22:06:21 · 1205 阅读 · 0 评论 -
汇编程序设计-11-AX、BX、CX、DX寄存器
AX、BX、CX、DX是通用寄存器、用于存放数据,也叫做数据寄存器。它们是16位的,所以也叫16位寄存器。保存的范围为:0000 0000 0000 0000~1111 1111 1111 11110~FFFF0~65535这4个寄存器的特殊之处就在于,它们都可以分为2个独立的8位寄存器AX 可以分为 AH和AL AX寄存器的高8位构成AH寄存器,低8位构成AL寄存器,H = High,L=LowBX 可以分为 BH和BLCX 可以分为 CH和CLDX 可以分为 DH和DL能存储8位数原创 2022-01-05 21:49:50 · 2487 阅读 · 0 评论 -
汇编程序设计-10-基础知识整理
问题1:1个CPU的寻址能力为8KB,那么他的地址总线的宽度为?解:地址的数量:8*1KB = 8 * 1024 byte = 8192个地址的范围:0~81912^13 = 8191,所以宽度为13问题2:1KB的存储器,有多少个存储单元?存储单元的编号从___到___一个存储单元是一个byte,在内存中最小的单位是byte,所以有1024个存储单元。编号为:0~1023问题3:1KB的存储器,可以存储___个bit,___个Byte1kB = 1024 Byte = 1024*8 bi原创 2022-01-05 21:32:16 · 738 阅读 · 0 评论 -
汇编程序设计-09-数据线、控制线
数据线:如果有8根数据线,则一次只能传送 8 个bit 也就是 1 byte如果有16根数据线,则一次只能传送 61个bit 也就是 2 byte可以看看我的另一篇文章计算机组成原理-02-总线原创 2022-01-02 15:49:34 · 288 阅读 · 2 评论 -
汇编程序设计-08-什么是寻址能力?
寻址能力就是寻找地址的能力,地址线的数量决定了能够寻找到的内存地址的范围,以及内存地址的数量。假设有一根地址线,则只有0、1两个地址如果有两根线,则有01,00,10,11 四个地址。总之有n根线就有2^n个地址问题1:请问内存编号(内存地址)1024至少需要几根地址线?10根地址线,能表示的范围为 00 0000 0000 -> 11 1111 1111也就是0->1023,所以至少需要11根地址线11根地址线 表示的最大值:111 1111 1111 1111 = 2047能原创 2022-01-02 15:13:03 · 1472 阅读 · 0 评论 -
汇编程序设计-07-汇编指令存放在哪?
注意:CPU中是存放了一部分指令和数据的,但绝大部分都存在内存中,也就是我们所说的内存条原创 2022-01-02 13:41:54 · 449 阅读 · 0 评论 -
汇编程序设计-06-汇编语言与2进制的关系
打开DosBox,输入U回车从上面的讲解可以看出,使用汇编指令编程总比机器指令方便很多。但是机器只能识别01,那如何将汇编指令转换到机器指令呢?其实编译器就是做这个事情的。编译器:将一套表示系统,翻译成另外一套表示系统。...原创 2022-01-02 11:50:30 · 260 阅读 · 0 评论 -
汇编程序设计-05-16进制与2进制的互相转换
一、16进制转2进制有如下数字:二、2进制转16进制从右边往左每4位划分一格,不足4位补0,有如下数字原创 2022-01-02 11:24:11 · 399 阅读 · 0 评论 -
汇编程序设计-04-10进制转16进制
方法1方法2:原创 2022-01-01 23:29:32 · 170 阅读 · 0 评论 -
汇编程序设计-03-10进制转2进制
下面是10进制的10、75转为二进制的方法方法1:方法2:10转换:75转换:原创 2022-01-01 23:03:02 · 865 阅读 · 0 评论 -
汇编程序设计-02-源代码的编译与链接
有如下代码assume cs:codecode segment mov bx,0B800H mov es,bx mov bx,160*10 + 40*2 mov word ptr es:[bx],5535H mov ax,4C00H int 21Hcode endsend可以将其保存到t1.asm,存放在D:/ASM文件夹下。然后找到如下的文件,注意“microsoft”不是所谓的Microsoft,其实打开dosbox,原创 2022-01-01 21:25:02 · 216 阅读 · 0 评论 -
汇编程序设计-01-安装DOSBOX
1.下载安装下载之后,在D盘建立ASM文件夹,然后放在里面,接着安装下面是它的连接:下载DOSBox下载Debug.exe下载后直接双击安装,安装结束之后,如下图。也就是说需要如下软件:2.路径配置:接下来打开软件,如下图接下来需要输入几条命令:mount c: d:\ASM如下:当出现Drive C is mounted as local directory d:\asm\时就成功了!接着输入 c: 然后回车继续输入 debug接着输入 u会出现如下界面:..原创 2022-01-01 18:10:15 · 432 阅读 · 0 评论