基础汇编--宏定义和call方法实现一个二进制数的奇偶校验
来源:互联网 发布:window8 ftp yum 源 编辑:程序博客网 时间:2024/06/11 16:54
写在前面:本文通过宏定义计算二进制的八位中的奇偶(即八位0、1中1的个数),通过call方法计算另外的八位,实现最后计算十六位二进制数奇偶校验!
本文使用的编译器为emu8086,下载地址
怎么计算八位二进制中的1的个数呢?
我这里用的方法是通过一个二进制数与一个二进制数 ,形如 0000 0001,即可实现掩码操作,获取某一位上二进制的值,将这些1累加起来,就可以得到二进制数中的1的个数,即可实现奇偶校验的结果!
以下为对0000 1001 进行二进制奇偶校验 ,获取值的操作为循环右移shr
利用宏实现前八位的计算
简单说一下宏调用和子程序的区别:
子程序在程序执行期间调用,只占用自身大小的一段空间。
(必须到子程序的IP,好处是节省内存,效率高,但是因为要保存返回地址,转向地址,时间长,适合长代码,频繁调用的)
宏调用,在汇编期间被展开,调用一次展开一次。
宏汇编通常使用 macro 、endm这一对宏汇编伪指令来做到,格式如下:
宏名 macro [形参表]
宏定义体
endm
宏名在同一源程序中,保持唯一,宏可以带形式参数表;可选的形参表给出了宏定义中用到的形式参数(哑元,简称为形参),之间用逗号相隔。
宏定义中的注释如果是用;;分割的,则后边宏展开不再出现该注释。
宏调用的格式为:
伪指令格式:宏名[实参表]
本例中计算ah中的代码如下:
countah macro ;使用 push dx push cx mov ch, 8h mov cl, 0h mov bh, 00000001 loopa: mov dh, ah and dh, bh shr dh, cl adc bl, dh rol bh, 1 inc cl dec ch jnz loopa pop cx pop dxendm
使用call方法计算al中的二进制奇偶
由于call方法之前进行过简述,此处不再多讲。
代码如下:
countal:proc push dx push cx mov ch, 8h mov cl, 0h mov bh, 00000001 loopb: mov dh, al and dh, bh shr dh, cl adc bl, dh rol bh, 1 inc cl dec ch jnz loopb pop cx pop dx ret endp
整体代码如下:
; multi-segment executable file template.data segment ; add your data here! data1 db 0h num db 00000001 pkey db "The number of 1 in ax is " count dw 0h db " .","$"endsstack segment dw 128 dup(0)endscode segment countah macro ;使用 push dx push cx mov ch, 8h mov cl, 0h mov bh, 00000001 loopa: mov dh, ah and dh, bh shr dh, cl adc bl, dh rol bh, 1 inc cl dec ch jnz loopa pop cx pop dxendm start:; set segment registers: mov ax, data mov ds, ax mov es, ax ; add your code here mov bl, 0 countah call countal mov al, bl mov ah, al and ax, 0f00fH mov cl, 4 shr ah, cl or ax, 3030H xchg ah,al mov count, ax lea dx, pkey mov ah, 9 int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h mov ax, 4c00h ; exit to operating system. int 21h endscountal:proc push dx push cx mov ch, 8h mov cl, 0h mov bh, 00000001 loopb: mov dh, al and dh, bh shr dh, cl adc bl, dh rol bh, 1 inc cl dec ch jnz loopb pop cx pop dx ret endp end start ; set entry point and stop the assembler.
本例中只进行了计算ax中的二进制奇偶性,可以自行拓展为输入变量,计算其二进制奇偶性。
0 0
- 基础汇编--宏定义和call方法实现一个二进制数的奇偶校验
- 引用和宏定义的汇编实现
- 2^N位二进制数的奇偶校验算法
- 用汇编实现格雷码与二进制数的转换
- 汇编基础:二进制和十六进制
- 汇编的一个小笔记(call和ret)
- 基础汇编--call方法与函数(两个ASCLL码数相加并输出)
- 输出一个数的二进制数的奇数序列和偶数序列(三种方法)
- RS232奇偶校验的定义说明
- 定义方法求一个数的平方
- 用宏实现将一个十进制数对应的二进制数的奇偶位交换
- 计算一个数的二进制表示中0和1个数的方法
- 用递归和非递归的方法把一个十进制数转换为二进制序列
- C语言 定义一个宏,用于交换一个二进制序列的奇数位和偶数位
- 统计一个二进制数有几个1的方法
- 把一个十进制数转化为二进制的方法
- 求一个数的二进制表示方法(1305 P102)
- 【C语言】宏定义交换二进制数的奇偶位
- c++新人,结构化程序设计与面向对象程序设计的比较(1)
- JS操作iframe里的DOM || contentWindow,contentDocument
- 加载图片显示时的图片变形问题(UIImageView)
- Java获取项目当前路径代码
- 安装python
- 基础汇编--宏定义和call方法实现一个二进制数的奇偶校验
- 55.按之字形顺序打印二叉树
- Linux系统调用--getrlimit()与setrlimit()函数详解
- 怎么理解Condition,同步锁
- Vulkan in 30 minutes
- 小钢的架构思考:什么是架构
- How to define One-Many and One-One relationships
- 8 reasons why SPIR-V makes a big difference
- xib创建ViewController