汇编语言-010(循环移位ROL,ROR 、进位循环进位RCL,RCR 、有符号数溢出 、双精度移位SHLD,SHRD、SHL和ADD计算 、位运算应用)

1 :循环移位ROL,ROR,带进位循环进位RCL,RCR

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC;循环左移mov al,40h  ;AL = 010000000brol al,1    ;AL = 100000000b ,CF = 0rol al,1    ;AL = 000000001b ,CF = 1rol al,1    ;AL = 000000010b ,CF = 0mov al,00100000brol al,3    ;CF = 1,AL = 00000001b;位组交换,向任意方向循环4位就可以高低字节交换mov al,26h  rol al,4  ;AL = 62h;循环右移mov al,01h   ;AL = 00000001bror al,1     ;AL = 10000000b ,CF = 1ror al,1     ;AL = 01000000b ,CF = 0mov al,00000100bror al,3     ;AL = 10000000b,CF = 1;带进位循环左移clc   ;清除进位标志位 CF = 0mov bl,88h ;CF = 0, BL = 10001000brcl bl,1   ;CF = 1, BL = 00010000brcl bl,1   ;CF = 0, BL = 00100001b;从进位标志位恢复位shr bl,1 ;将最低位移入进位标志位rcl bl,1 ;恢复该数原值;带进位循环右移stc ;将进位标志位置为1 CF = 1mov ah,10h   ;AH = 00010000b ,CF =1rcr ah,1     ;AH = 10001000b ,CF =0INVOKE ExitProcess,0
main ENDP
END main

2 :有符号数溢出

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC;如果有符号数循环移动一位生成的结果超过了目的操作数的有符号范围;溢出就为1,换句话说:即该数的符号位取反了mov al,+127  ;AL = 01111111brol al,1  ;OF = 1,AL = 11111110bmov al,-128   ;10000000Bshr al,1      ;OF = 1,AL = 01000000b;如果循环移动次数大于1,则溢出标志无定义mov al,-128   ;10000000Bshr al,1      ;OF = 0,AL = 00100000bINVOKE ExitProcess,0
main ENDP
END main

3:双精度移位SHLD,SHRD

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
wval WORD 9BA6h.code
main PROC;双精度左移,将AX的高4位复制到wval的低4位mov ax,0AC36hshld wval,ax,4  ;wval = BA6Ah  ,ax = AX36h;双精度右移,将dx的低4位复制到ax的高4位mov ax,234Bhmov dx,7654hshrd ax,dx,4    ;ax = 4234INVOKE ExitProcess,0
main ENDP
END main

4 : 双精度移位例子,将一个双字数组右移4位

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
array DWORD 648B2165h,8C943A29h,6DFA4B86h,91F76C04h,8BAF9857h.code
main PROCmov bl,4    ;移动次数mov esi,OFFSET array ;数组偏移量mov ecx,(LENGTHOF array) -1 ;数组元素个数
L1:push ecxmov eax,[esi + TYPE DWORD]mov cl,bl   ;移动次数shrd [esi],eax,cl  ;EAX移入[ESI]的高位add esi,TYPE DWORD ;指向下一对双字pop ecxloop L1shr DWORD PTR[esi],4  ;最后一个双字进行移位INVOKE ExitProcess,0
main ENDP
END main

5 :不用使用SHRD指令将AX的最低移入BX的最高位,再使用SHRD指令移入

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC;不使用SHRD指令,将AX的最低位移入BX的最高位mov ax,1111111111111111bmov bx,0011111111111111bmov si,axshr si,1rcr bx,1;使用SHRD指令,将AX的最低位移入BX的最高位mov ax,1111111111111111bmov bx,0011111111111111bshrd bx,ax,1INVOKE ExitProcess,0
main ENDP
END main

6:利用循环将EAX的每一位移入进位标志位,计算进位标志位置的1次数,计算32位数奇偶性

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCmov ebx,0mov ecx,32mov eax,89ABCDEFh
L1:ror eax,1jnc L2inc ebx
L2:loop L1and ebx,1jz L3mov edx,0  ;奇数jmp quit
L3:mov edx,1  ;偶数quit:INVOKE ExitProcess,0
main ENDP
END main

7:使用shr与rcr 将 字节数组右移一位

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
ArraySize = 3
array BYTE ArraySize DUP(99h)  ;每半个字节都是1001.code
main PROCmov esi,0shr array[esi+2],1  ;高字节rcr array[esi+1],1  ;中间字节,包括进位标志位rcr array[esi],1    ;低字节,包含进位标志位INVOKE ExitProcess,0
main ENDP
END main

8:将无符号整数乘法,转换成使用SHL和ADD计算

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC;123 * 36 可以使用以下位运算替换;36 = 00100100;乘数36的位2和位5都是1,所以下面123左移5位和2位相加mov eax,123mov ebx,eaxshl eax,5   ;shl ebx,2add eax,ebx ;乘积相加INVOKE ExitProcess,0
main ENDP
END main

9:将32位二进制整数转换为ASCII码的二进制形式

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDP;32位二进制整数转换为ASCII码的二进制形式
;接收:EAX = 二进制整数,ESI 为缓冲区指针
;返回包含ASCII码二进制数字的缓冲区
BinToAsc PROCpush ecxpush esimov ecx,32  ;EAX中的位数
L1:shl eax,1   ;最高位移入进位标志位mov BYTE PTR[esi],'0'  ;选择0作为默认数字jnc L2                 ;如果进位标志位为0,就跳到L2mov BYTE PTR[esi],'1'  ;否则将1送往缓冲区
L2:inc esiloop L1pop esipop ecxret
BinToAsc ENDPEND main

10:位运算应用,在实地址模式下取文件日期

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
day BYTE ?
month BYTE ?
year WORD ?.code
main PROC;在实地址模式下,MS_DOS函数57h 用DX返回文件的日期戳,(该文件最后被修改的日期);0到位4表示是131内的日期,位5到位8表示是月份,位9到位15表示年份mov dx,0010011001101010b;取日期mov al,dl  ;复制DLand al,00011111b;清除位5到位7mov day,al;取月份mov ax,dxshr ax,5     ;右移5位and al,00001111b  ;清除位4到位7mov month,al   ;取年份mov al,dhshr al,1mov ah,0add ax,1980 ;年份以1980为基点mov year,axINVOKE ExitProcess,0
main ENDP
END main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Z]POJ 计算几何入门题目推荐[转PKKJ]

http://www.cnblogs.com/eric-blog/archive/2011/05/31/2064785.html http://hi.baidu.com/novosbirsk/blog/item/723a9727a9ab8804918f9dca.html其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中。之所以推荐计算几何…

2013年 833c语言程序 江南大学 (A卷)

1.编写程序实现求两个整数最大公约数和最小公倍数. 方法一:辗转相除法 算法思路:两个整数a,b,其中a>b,求其最大公约数和最小公倍数 步骤① a%bc,其中c为余数 步骤② 若余数c为0,即a可以把b给整除,也就是说这里的b就是其最大公…

二十几岁失败的原因

1.缺乏人生目标。在研究过的人们中,9.98%的人没有"人生目标",这恐怕是人们失败的最大原因。  2.自学能力不足。历史上所谓掌握最高教育的人,几乎都是"自学型"的。所谓"有教育"的人,不能只看成是有…

C程序生成一定范围内的随机数

Random numbers just numbers that lie within a range and any of the numbers can occur. 随机数只是在一个范围内的数字,任何数字都可能出现。 In programming, we come through a lot of scenarios where we need to generate random numbers. Like for dice g…

提示丢失libgcc_s_dw2-1.dll问题

QT使用MinGW编译器编译中的的执行文件,执行问题 将qt中安装的mingw编码器的路径添加到环境变量path (D:\Qt\Qt5.10.1\5.10.1\mingw53_32\bin)

第1章 数据库系统概述

第1章 数据库系统概述 1.1 数据库系统简介 数据库技术的发展历史 人工管理阶段文件系统阶段数据库系统阶段

浅谈多线程和异步

最近很忙,因此拿出时间来写博客也算是忙里偷闲了,继承前面的一贯风格,继续浅谈胡侃。  最近在项目中遇到了Socket异步网络传输的问题,所以沉下心来整理下。于是,先问了下度娘,结果找到了园友志良的一篇文…

查看Sql Server的log文件大小

SELECT DB_NAME(database_id) AS DatabaseName,Name AS Logical_Name,Physical_Name, (size*8)/1024 SizeMBFROM sys.master_filesWHERE DB_NAME(database_id) AdventureWorksGO 转载于:https://www.cnblogs.com/top5/archive/2010/03/02/1676776.html

python调用带参函数_Python | 带有示例的函数调用类型

python调用带参函数There are following types of function calls in python: python中有以下类型的函数调用: Call by value 按价值致电 Call by reference 通过参考电话 1)按价值致电 (1) Call by value ) When, we call a function with the values i.e. pass …

ffmpeg 命令添加文字水印

使用ffplay 预览一下效果: ffplay -i cctvhttp.flv -vf “drawtextfontsize100:fontfileArial.ttf:tex t‘hello world’:x20:y20:fontcolorblue:alpha0.5” -x 640 -y 480 使用ffmpeg保存为文件 : ffmpeg -i cctvhttp.flv -vf “drawtextfontsize10…

jquery弹出层

这是一个弹出层的插件&#xff0c;有时候做东西的&#xff0c;经常会用到了&#xff0c;所以在次发一下&#xff0c;和大家分享一下&#xff01; [task]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/x…

MUL与IMUL区别(微机原理与接口技术 第2版)课后习题3.14、P123

MUL与IMUL的详细区别 乘数位数隐含的被乘数乘积的存放位置举例8位ALAX中MUL BL16位AXDX与AX中&#xff08;DX存放高16位、AX存放低16位&#xff09;MUL BX 课本P97例题 一&#xff09;、将以下指令中的立即数看作是无符号数实现相乘: MOV AL,0B4H ;ALB4H180 解释以下&…

SDL_main导致main找不到入口

SDL main的错误 引用SDL.h就会报这个错误 因为SDL 将main 宏定义为 SDL_main,所以会找不到main入口 可以使用#undef main取消这个宏定义

Java MathContext类| hashCode()方法与示例

MathContext类的hashCode()方法 (MathContext Class hashCode() method) hashCode() method is available in java.math package. hashCode()方法在java.math包中可用。 hashCode() method is used to get the hash code value of this MathContext. hashCode()方法用于获取此M…

实验8 SQL Server 的存储过程

实验8 SQL Server 的存储过程一、实验目的 1.掌握使用T-SQL编程的方法 2.掌握使用T-SQL语句创建一个存储过程并验证 3.掌握创建和执行带参数的存储过程 4.熟练使用系统存储过程、系统函数 二、实验要求 1.创建一个不带参数的存储过程。 2.创建一个带参数的存储过程p_count。 三…

Oracle ——如何确定性能差的 SQL

http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/TSQ7/Default.aspx 本文主要说明在应用程序内书写和调优 SQL 语句。假设&#xff0c;你已经知道你应用程序中的哪些 SQL 语句需要注意。事实上&#xff0c;这不太容易。那么&#xff0c;我们如何…

C#中的委托和事件(续)

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 欢迎浏览本文的后续文章&#xff1a; C#中的委托和事件(续)PDF 浏览&#xff1a;http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdf文中代码在VS2005下通过&#xff0c;由于VS2003(.Ne…

Java LocalDate类| minusYears()方法与示例

LocalDate类minusYears()方法 (LocalDate Class minusYears() method) minusYears() method is available in java.time package. minusYears()方法在java.time包中可用。 minusYears() method is used to subtract the given years from this LocalDate and return the LocalD…

ffmpeg 命令添加图片水印

使用ffplay预览一下&#xff1a; ffplay -i cctvhttp.flv -vf “moviewatermark.png[watermark];[in][watermark]overlay x10:y10[out]” -x 640 -y 480 参数&#xff1a; 有两个过滤器movie\overlay movie&#xff1a;读取watermark.png输出 [watermark]可以理解自定义的的变…

实验9 SQL Server 的触发器

实验9 SQL Server 的触发器一、实验目的 1.了解触发器的触发过程和类型 2.通过执行SQL脚本&#xff0c;掌握创建触发器并测试触发器 3.掌握通过使用触发器维护数据完整性的方法。 二、实验要求 1.按指定要求创建触发器。 三、实验步骤 1.创建一个名为tr_age的触发器&#xff0…