往期:
目录
顺序程序结构
移位实现乘法
移位操作
左移一位相当于数值乘以2
右移移位相当于数值除以2(余数在CF中)
- 逻辑右移一位时无符号数除以2
- 算术右移一位时有符号数除以2
移位实现乘法程序一
; eg0308.asm in Windows Console
include io32.inc
.data
wvar word 34000
.code
start:
xor eax,eax ;EAX=0
mov ax,wvar ;AX=要乘以10的无符号数
shl eax,1 ;左移一位等于乘2
mov ebx,eax ;EBX=EAX×2
shl eax,2 ;再左移2位,EAX=EAX×8
add eax,ebx ;EAX=EAX×10
call dispuid ;显示乘积
call dispcrlf ;换行
imul eax,10 ;EAX=EAX×10
call dispuid ;显示乘积
exit 0
end start
运行结果:
64位数据的移位操作
64位数据的逻辑右移实现步骤:
举例:
64位数据逻辑右移程序:
; eg0309.asm in Windows Console
include io32.inc
.data
qvar qword 1234567887654321h
ascii byte '38'
bcd byte ?
.code
start:
mov ecx,4
again: shr dword ptr qvar+4,1 ;先移动高32位
rcr dword ptr qvar,1 ;后移动低32位
loop again
;
mov al,ascii
and al,0fh ;处理低4位对应的字符
mov ah,ascii+1
shl ah,4 ;处理高4位对应的字符
or al,ah ;组合形成压缩BCD码
mov bcd,al
exit 0
end start
64位数据算术右移:
64位数据逻辑或者算术左移
自然数求和
求和过程
利用等差数列求和公式:
1 + 2 + 3 + ... +N =(1+N)× N ÷ 2
自然数求和程序
; eg0401.asm in Windows Console
include io32.inc
.data
num dword 3456 ;假设一个N值(小于2^32-1)
sum qword ?
.code
start:
mov eax,num ;EAX=N
add eax,1 ;EAX=N+1
imul num ;EDX.EAX=(1+N)×N
shr edx,1 ;64位逻辑右移一位,相当于除以2
rcr eax,1 ;EDX.EAX= EDX.EAX÷2
mov dword ptr sum,eax
mov dword ptr sum+4,edx ;按小端方式保存
exit 0
end start
分析:
处理器厂商字符串
; eg0402.asm in Windows Console
include io32.inc
.data
buffer byte 'The processor vendor ID is ',12 dup(0),0
;预留12字节空间,存放厂商字符串
bufsize = sizeof buffer
;获得整个缓冲区长度
.code
start:
mov eax,0
cpuid ;执行处理器识别指令
mov dword ptr buffer+bufsize-13,ebx ;12位预留空间+'0'
mov dword ptr buffer+bufsize-9,edx
mov dword ptr buffer+bufsize-5,ecx
mov eax,offset buffer ;显示信息
call dispmsg
exit 0
end start
参考文献:中国大学mooc平台汇编语言程序设计课程