[汇编语言笔记篇]五:顺序程序结构

往期:

 

[汇编语言笔记篇]0:(我的第一个汇编程序)

[汇编语言笔记篇]二:数据的表示

[汇编语言笔记篇]三:数据寻址

[汇编语言笔记篇]四:通用数据处理指令

 

目录

顺序程序结构

移位实现乘法

移位操作

64位数据的移位操作

自然数求和

求和过程

处理器厂商字符串


 

顺序程序结构

移位实现乘法

移位操作

左移一位相当于数值乘以2

右移移位相当于数值除以2(余数在CF中)

  • 逻辑右移一位时无符号数除以2
  • 算术右移一位时有符号数除以2

[汇编语言笔记篇]五:顺序程序结构_第1张图片

 

移位实现乘法程序一  

; 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位数据的移位操作

[汇编语言笔记篇]五:顺序程序结构_第2张图片

64位数据的逻辑右移实现步骤:

[汇编语言笔记篇]五:顺序程序结构_第3张图片

 举例:

[汇编语言笔记篇]五:顺序程序结构_第4张图片

[汇编语言笔记篇]五:顺序程序结构_第5张图片

[汇编语言笔记篇]五:顺序程序结构_第6张图片

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位数据算术右移:

[汇编语言笔记篇]五:顺序程序结构_第7张图片

64位数据逻辑或者算术左移

[汇编语言笔记篇]五:顺序程序结构_第8张图片

自然数求和

求和过程

利用等差数列求和公式:

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

分析:

处理器厂商字符串

[汇编语言笔记篇]五:顺序程序结构_第9张图片

 

; 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平台汇编语言程序设计课程

你可能感兴趣的:(汇编语言篇)