汇编语言-010(循环移位ROL,ROR 、进位循环进位RCL,RCR 、有符号数溢出 、双精度移位SHLD,SHRD、SHL和ADD计算 、位运算应用)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                汇编语言-010(循环移位ROL,ROR 、进位循环进位RCL,RCR 、有符号数溢出 、双精度移位SHLD,SHRD、SHL和ADD计算 、位运算应用)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                1 :循環(huán)移位ROL,ROR,帶進位循環(huán)進位RCL,RCR
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC;循環(huán)左移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;位組交換,向任意方向循環(huán)4位就可以高低字節(jié)交換mov al,26h rol al,4 ;AL = 62h;循環(huán)右移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;帶進位循環(huán)左移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 ;恢復該數(shù)原值;帶進位循環(huán)右移stc ;將進位標志位置為1 CF = 1mov ah,10h ;AH = 00010000b ,CF =1rcr ah,1 ;AH = 10001000b ,CF =0INVOKE ExitProcess,0 main ENDP END main2 :有符號數(shù)溢出
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC;如果有符號數(shù)循環(huán)移動一位生成的結果超過了目的操作數(shù)的有符號范圍;溢出就為1,換句話說:即該數(shù)的符號位取反了mov al,+127 ;AL = 01111111brol al,1 ;OF = 1,AL = 11111110bmov al,-128 ;10000000Bshr al,1 ;OF = 1,AL = 01000000b;如果循環(huán)移動次數(shù)大于1,則溢出標志無定義mov al,-128 ;10000000Bshr al,1 ;OF = 0,AL = 00100000bINVOKE ExitProcess,0 main ENDP END main3:雙精度移位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 main4 : 雙精度移位例子,將一個雙字數(shù)組右移4位
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 648B2165h,8C943A29h,6DFA4B86h,91F76C04h,8BAF9857h.code main PROCmov bl,4 ;移動次數(shù)mov esi,OFFSET array ;數(shù)組偏移量mov ecx,(LENGTHOF array) -1 ;數(shù)組元素個數(shù) L1:push ecxmov eax,[esi + TYPE DWORD]mov cl,bl ;移動次數(shù)shrd [esi],eax,cl ;EAX移入[ESI]的高位add esi,TYPE DWORD ;指向下一對雙字pop ecxloop L1shr DWORD PTR[esi],4 ;最后一個雙字進行移位INVOKE ExitProcess,0 main ENDP END main5 :不用使用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 main6:利用循環(huán)將EAX的每一位移入進位標志位,計算進位標志位置的1次數(shù),計算32位數(shù)奇偶性
.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 ;奇數(shù)jmp quit L3:mov edx,1 ;偶數(shù)quit:INVOKE ExitProcess,0 main ENDP END main7:使用shr與rcr 將 字節(jié)數(shù)組右移一位
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data ArraySize = 3 array BYTE ArraySize DUP(99h) ;每半個字節(jié)都是1001.code main PROCmov esi,0shr array[esi+2],1 ;高字節(jié)rcr array[esi+1],1 ;中間字節(jié),包括進位標志位rcr array[esi],1 ;低字節(jié),包含進位標志位INVOKE ExitProcess,0 main ENDP END main8:將無符號整數(shù)乘法,轉換成使用SHL和ADD計算
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC;123 * 36 可以使用以下位運算替換;36 = 00100100;乘數(shù)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 main9:將32位二進制整數(shù)轉換為ASCII碼的二進制形式
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCINVOKE ExitProcess,0 main ENDP;將32位二進制整數(shù)轉換為ASCII碼的二進制形式 ;接收:EAX = 二進制整數(shù),ESI 為緩沖區(qū)指針 ;返回包含ASCII碼二進制數(shù)字的緩沖區(qū) BinToAsc PROCpush ecxpush esimov ecx,32 ;EAX中的位數(shù) L1:shl eax,1 ;最高位移入進位標志位mov BYTE PTR[esi],'0' ;選擇0作為默認數(shù)字jnc L2 ;如果進位標志位為0,就跳到L2mov BYTE PTR[esi],'1' ;否則將1送往緩沖區(qū) L2:inc esiloop L1pop esipop ecxret BinToAsc ENDPEND main10:位運算應用,在實地址模式下取文件日期
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data day BYTE ? month BYTE ? year WORD ?.code main PROC;在實地址模式下,MS_DOS函數(shù)57h 用DX返回文件的日期戳,(該文件最后被修改的日期);位0到位4表示是1到31內的日期,位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總結
以上是生活随笔為你收集整理的汇编语言-010(循环移位ROL,ROR 、进位循环进位RCL,RCR 、有符号数溢出 、双精度移位SHLD,SHRD、SHL和ADD计算 、位运算应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 《咏双燕诗》第十一句是什么
- 下一篇: 提示丢失libgcc_s_dw2-1.d
