汇编语言学习笔记
文章平均质量分 67
轩落_翼
字节跳动大数据引擎
展开
-
在64位机下运行debug和masm等程序总结
最近正在学习汇编语言,原创 2014-11-24 14:49:43 · 2184 阅读 · 0 评论 -
汇编语言不带冒号标号的用法
汇编语言中,有一种编程方法:直接定址表这种方法和高级语言,C语言中的数组有类似的思想,就是将参数编排在一起,然后通过数组名的调用,得到需要的数值汇编语言中,带冒号的标号在程序中可以知道代码的位置,而不带冒号的标号可以在程序中找到代码位置的同时知道所表示的参数的大小比如说:table db 0,这里的table就是一个不带冒号的标号,如果定位到原创 2015-02-10 18:33:44 · 2168 阅读 · 0 评论 -
汇编语言中参数调用问题
在模块化编程的过程中,用子函数的方式是很常见的一种方式,汇编语言中必然会存在这样的方式在模块化编程中必不可少的的当然是传入的参数和返回的参数在这里先总结一下:1、是单参数的传递和但参数的返回这种传递方式的基本原则就是用寄存器来传递参数,基本格式:主函数将参数送入参数寄存器,子函数从参数寄存器中读取数据;子函数将得到的结果送入结果寄存器中,主函数将结果寄存器中的数据取出来使用原创 2015-01-02 20:42:11 · 808 阅读 · 0 评论 -
汇编语言中编写子程序的标准框架及简单运用举例
为了避免主函数中使用的寄存器和在子函数中使用的寄存器相互干扰,就有了一种方法去解决这个问题这种方法是用栈来实现的主函数中,用到了很多的寄存器,但是寄存器的数量有限,而且功能很有限制,在调用子函数之前应该把这个子函数中需要用到的寄存器先进行入栈操作,那么就相当于把主函数中用到的寄存器保存在栈中了,等子函数操作结束后,再进行出栈操作,这样一来一回就不会相互干扰了所以有了通式:子程序开始原创 2015-01-02 21:14:41 · 1643 阅读 · 1 评论 -
汇编语言中的call指令
在汇编语言中,call指令和ret,retf指令联合起来使用是模块化编程的基本方法,下面就介绍一下个人总结的call指令的用法call指令有多种使用格式:这里先看看所有的用法,然后来总结一下:1、call + 标号这个指令是先将call + 标号的下一条语句的IP放入栈中,然后使当前的IP+16位位移看到上面的解释会让你想到什么?会想到jmp指令吧,jmp有个指令格式是:jmp原创 2015-01-01 11:00:40 · 44194 阅读 · 0 评论 -
汇编语言中将代码段的代码复制到指定地址的方法
将代码段的一段代码复制到指定地址,这是非常很重要的一个过程,在这里介绍一种通用的方法一说到复制。第一个想到的就是循环,然而一说到循环第一个想到的就是loop(至少我是这样的)因为代码翻译成机器和人之间的交流通道,就是一串串的16进制数,那么就有一种更好的指令去完成,就是串传输指令movsb不管是loop指令还是movsb指令,都需要给cx赋值,让cx来说明循环的次数,所以问题就变为怎么原创 2015-01-21 10:04:20 · 4313 阅读 · 0 评论 -
王爽《汇编语言》(第三版)实验8解析
先贴出来代码:assume cs:codecode segment mov ax, 4C00H int 21H start: mov ax, 0 s: nop nop mov di, offset s mov si, offset s2 mov ax, cs:[si] mov cs:[di], ax原创 2014-12-31 14:24:59 · 4623 阅读 · 2 评论 -
汇编语言中的串传送指令
串传送指令是movsb和movsw这个两个指令的区别就是movsb是按字节传送的,movsw是按字传送的,所以下面以movsb举例movsb就是:将ds:[si]为首地址所指的字符串移动到es:[di]为首地址所指的空间中,就是说:mov es:[di], ds:[si] 然后就是判断标志位的DF标志,如果是0,那么需要进行:inc si原创 2015-01-12 13:41:27 · 4544 阅读 · 0 评论 -
汇编语言子函数——将字符串的小写字母转换为大写字母
这里利用汇编标志位,和cmp比较指令实现对大小写的转换下面是一段代码,主要的功能就是写一个子函数,可以实现对字符串的小写字母转换为大写字母如下:assume cs:code, ds:datadata segment db "Welcome to masm!", 0data endscode segment start: mov ax, data原创 2015-01-12 13:11:07 · 4204 阅读 · 0 评论 -
汇编语言中的外中断——键盘事件
汇编语言中的外中断和内中断差不多1、取中断类型码n2、标致寄存器入栈,IF=0,TF=02、CS、IP入栈3、(IP)=(n*4),(CS)=(n*4+2)但是外中断和内中断的中断类型码的来源不同,所以第一步肯定是不一样的,其他相同下面来讲一下键盘事件下的处理方式只要有键盘事件发生,就会触发int 9,这个int 9是硬件扫描过程,其实就是CPU对按键的IO口进行扫原创 2015-01-29 18:30:54 · 3338 阅读 · 0 评论 -
汇编语言子函数——64位减法运算
这个大数据的减法运算用到的指令是sbb指令,这个指令和大数据的加法指令adc有着相似的用法sbb = sub - CF大数据减法:mov ax, 0A8785428mov bx, 0E5846628sbb bx, 254584598sbb ax, 087E7892F当然如果用上面的这种写法的话,必须要在之前将CF置零,用sub ax, ax将CF位置零,另外一种不需要先置零原创 2015-01-10 14:01:43 · 2975 阅读 · 0 评论 -
汇编语言子函数——128位的加法运算
之前的那篇博文,讲到了大数据的加法运算,这里像之前那样编写一个子函数,以后调用方便根据上一次的公式有下面的解决办法,(功能写在代码中),如下:;实现的是:将data中的0~15的数和16~31的数加起来,将结果放在32~47assume cs:code, ds:data;这里的128位在data空间中是逆序放置的,就是从低位到高位排列的data segment dw 0A452原创 2015-01-09 20:48:38 · 4308 阅读 · 0 评论 -
汇编语言中用端口的读取与运用
任务:显示当前的年月日以及时分秒在8086CPU中,有一个芯片CMOS RAM,这个芯片中可以得到当前的时间,但是这里的数据是以BCD码给出的,要进行显示,必须要先将BCD码转换为ASCII才能在DOS中显示出来,然而在转换的过程中需要用到两个比较重要的运算,就是左移运算和右移运算左移运算:shl,这里默认的只能移动一位,要想移动多位,就需要将移动的位数放在cl中右移运算:shr,sh原创 2015-01-29 17:29:34 · 1223 阅读 · 0 评论 -
汇编语言子函数——延时函数
在汇编语言中,延时子函数用的也较多,在这里同样要编写一个子函数CPU在执行语句的时候也是需要耗时的,只是CPU运行速度太快,我们没办法看清楚,所以如果CPU执行语句越多,所需要的时间就越多,根据这个原理,就可以通过让CPU随便执行语句,起到延时的效果,这被称为“软件延时”,CPU执行一条指令耗时近似1us,就可以通过这种办法加上循环就可以实现延时效果这里可以用一个大数字减法和循环的办法来实原创 2015-01-29 17:56:45 · 20477 阅读 · 0 评论 -
汇编语言中的大数据加法
在8086CPU中一切数据寄存器都是16位的,在其中需要实现大于16位的加法运算时,就需要拆开计算先简述一下步骤:1、首先是将一个大数据拆成多个16位的数据,比如说是48B5A2EF001H,可以拆成048BH,5A2EH,F001H2、最低位的16位数先进行add运算:add 相加的第一个数的低16位(寄存器),相加的第二个数的低16位3、用adc指令对之后的每16位进行运算:a原创 2015-01-09 16:28:29 · 1818 阅读 · 1 评论 -
汇编语言子函数——除法溢出问题
在进行除法运算时,会遇到溢出的问题,在16位寄存器中用多加寄存器的方法来解决这个问题对于除法运算的溢出有如下公式:将溢出除法转换为多个不溢出的除法的计算公式先将一个32位的数放在两个寄存器中,假设高位在dx中,低位在ax中,除数放在cx中得到的结果的 商的高位= dx/cx结果的商 商的低位=原创 2015-01-06 20:41:02 · 888 阅读 · 0 评论 -
汇编语言子函数——显示字符串
在汇编语言中,字符串的显示是很重要的,也是经常要被调用的,所以最好写一个通用的显示子函数,下面我提供一个自己写的显示的子函数assume cs:code, ds:datadata segment db 'ok!', 0data endscode segment start: mov dh, 8 ;行数 mov原创 2015-01-06 18:48:19 · 1398 阅读 · 0 评论 -
汇编语言子函数——将数字转换为字符串并显示
对于机器来说,它是看不懂我们认为定义的数字的,必须要先转换为人与机器的转换协议,就是ASCII码,所以需要先转换再显示这里将用到之前两节中用到的子函数代码如下:assume cs:code, ds:datadata segment db 10 dup(0) dd 197514data endscode segment start: mov bx, data原创 2015-01-06 20:56:22 · 4195 阅读 · 0 评论 -
汇编语言模拟出入栈
在用到栈空间时,因为在写子函数时,需要将寄存器入栈,但是子函数中需要用到栈,那么就会改变sp的值,那么就不能再用push和pop了,需要模拟push和pop指令push:原创 2015-10-20 00:18:35 · 753 阅读 · 0 评论