![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
汇编语言
文章平均质量分 88
林小果呀
主要记录个人的学习笔记,有空也会发发技术分享类文章
展开
-
标志寄存器
如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。由于flag的DF位决定着串传送指令执行后,si和di改变的方向,所以CPU应该提供相应的指令来对DF位进行设置,从而使程序员能够决定传送的方向。在执行 adc 指令的时候加上的 CF 的值的含义,由 adc指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。flag的第10位是DF,方向标志位。原创 2024-04-17 22:13:20 · 1076 阅读 · 0 评论 -
Call 和 Ret 指令
call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。因为子程序中要计算 N×N×N ,可以使用多个 mul 指令,为了方便,可将结果放到 dx 和 ax中。mul是乘法指令,使用 mul 做乘法的时候,相乘的两个数:要么都是8位,要么都是16位。我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。子程序可以依次读取每个字符进行检测,如果不是0,就进行大写的转化,如果是0,就结束处理。执行后,(CS)=0,(IP)=0123H,(sp)=0CH。原创 2024-04-08 15:58:32 · 1041 阅读 · 0 评论 -
转移指令的原理
jmp short 标号,jmp near ptr 标号,jcxz 标号,loop 标号等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。而loop s的机器码中包含的是转移的位移,就不存在这个问题了,因为,无论 s处的指令的实际地址是多少,loop指令的转移位移是不变的。根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。原创 2024-03-31 15:29:02 · 1194 阅读 · 0 评论 -
数据处理的两个基本问题
1)立即数(idata):对于直接包含在机器指令中的数据(执行前在cPu 的指令缓冲器中),在汇编语言中称为:立即数(idata ) ,在汇编指令中直接给出。例如:mov ax,1。在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是很必要的,否则,CPU无法得知所要访问的单元是字单元,还是字节单元。db 3 dup (0,1,2) :定义了9个字节,它们是0、1、2、0、1、2、0、1、2,相当于 db 0,1,2,0,1,2,0,1,2。原创 2024-03-30 16:52:39 · 349 阅读 · 0 评论 -
更灵活的定位内存地址的方法
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中。我们需要用到二重循环,应该在每次开始内层循环的时候,将外层循环的cx中的数值保存起来,在执行外层循环的loop指令前,再恢复外层循环的cx数值。将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。一个字母,不管它原来是大写还是小写,将它的第5位置0,它就必将变为大写字母;原创 2024-03-26 09:42:36 · 1145 阅读 · 0 评论 -
包含多个段的程序
考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。我们在编程的时候要注意何处是数据,何处是栈,何处是代码。我们用和定义代码段一样的方法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间。原创 2024-03-24 11:30:47 · 617 阅读 · 0 评论 -
[BX]和loop指令
在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:200~0:2FF( 0:200h~0:2FFh)的256 个字节的空间。这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀。因源单元ffff:X和目标单元0020:X 相距大于64KB,在不同的64KB段里,程序中,每次循环要设置两次ds。计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中。表示将ds:0处的数据送入al中。原创 2024-03-19 21:49:22 · 911 阅读 · 0 评论 -
第一个汇编程序
在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2 ,将 P1 从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;Debug 可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU 的控制,这样,我们就可以使用Debug 的相关命令来单步执行程序 ,查看每条指令指令的执行结果。4)codesg:作为一个标号指代了一个地址,放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。原创 2024-03-17 14:40:07 · 942 阅读 · 0 评论 -
masm下载和配置
2)解压masm32v11r.zip,点击install.exe安装(一直下一步即可)。5)将要编译的文件放到masm目录下即可用DOSBox编译连接。官网下载地址选择Austrlia 1。3)安装完成后得到一个masm文件夹。在文件末尾填入一下两行后保存关闭。文件夹路径【根据自己实际情况决定】。在DOSBox安装路径:双击。原创 2024-03-17 14:01:32 · 1362 阅读 · 0 评论 -
寄存器(内存访问)
CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。在0地址处开始存放20000(4E20H):上图内存中字的存储元可以看作一个起始地址为0的字单元(存放一个字的内存单元,由0、1两个字节单元组成)。原创 2024-03-14 17:30:03 · 1375 阅读 · 1 评论 -
寄存器(CPU工作原理)
可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。原创 2024-03-08 11:06:56 · 2568 阅读 · 1 评论 -
汇编语言基础知识
机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。早期的程序员们将 0、1 数字编程的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。原创 2024-03-06 15:19:03 · 502 阅读 · 3 评论