asm 计算一个数(8bit)乘以2的n次方(n<128)
计算 一个 lt ASM 128 次方
2023-09-11 14:22:54 时间
用汇编计算一个数(8bit)乘以2的n次方(n<128)
TITLE shifting_number
include irvine32.inc
.data
value dword 4 DUP(0) ;128位
n_2 byte 0 ;0-128
nt_2 byte 0 ;临时变量
result dword 8 DUP(0) ;256位
str0 byte "用移位做一个数乘以2的n次方",0
str1 byte "[该数由128位二进制数组成(已预设);2的次方数在0到128之间]",0
str2 byte "请输入2的次方数:",0
str3 byte "*2^",0
str4 byte "2的次方数输入有误导致结果溢出",0
bo byte 0 ;溢出标志
.code
input proc
;设置value的值
mov eax,12345678h
mov dword ptr value,eax
mov eax,0fea99321h
mov dword ptr value+4,eax
mov eax,12345678h
mov dword ptr value+8,eax
mov eax,0fea99321h
mov dword ptr value+12,eax
;==============
mov edx,offset str0
call writestring
call crlf
mov edx,offset str1
call writestring
call crlf
mov edx,offset str2
call writestring
call readint
mov n_2,al
mov nt_2,al
ret
input endp
;====================
calculate proc
mov al,n_2
;=====================
cmp al,32 ;大于32位时跳后
ja NEXT_1
;=============================
mov ebx,dword ptr value+12
mov edx,0 ;每次使用时都将edx清零
mov cl,nt_2
shld edx,ebx,cl ;每次edx都"不会被"清0后再进行移动,且每次移动后"后面的寄存器"值不变
shl ebx,cl
add dword ptr result+16,edx
add dword ptr result+12,ebx
mov ebx,dword ptr value+8
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+12,edx
add dword ptr result+8,ebx
mov ebx,dword ptr value+4
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+8,edx
add dword ptr result+4,ebx
mov ebx,dword ptr value
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+4,edx
add dword ptr result,ebx
;================================
jmp OVER
NEXT_1:
cmp al,64 ;大于64跳
ja NEXT_2
mov bl,32
sub nt_2,bl
;===============================
mov ebx,dword ptr value+12
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+20,edx
add dword ptr result+16,ebx
mov ebx,dword ptr value+8
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+16,edx
add dword ptr result+12,ebx
mov ebx,dword ptr value+4
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+12,edx
add dword ptr result+8,ebx
mov ebx,dword ptr value
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+8,edx
add dword ptr result+4,ebx
;===============================
jmp OVER
NEXT_2:
cmp al,96 ;大于96跳
ja NEXT_3
mov bl,64
sub nt_2,bl
;================================
mov ebx,dword ptr value+12
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+24,edx
add dword ptr result+20,ebx
mov ebx,dword ptr value+8
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+20,edx
add dword ptr result+16,ebx
mov ebx,dword ptr value+4
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+16,edx
add dword ptr result+12,ebx
mov ebx,dword ptr value
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+12,edx
add dword ptr result+8,ebx
;===========================
jmp OVER
NEXT_3:
cmp al,128 ;大于128跳
jae NEXT_4
mov bl,96
sub nt_2,bl
;===========================
mov ebx,dword ptr value+12
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+28,edx
add dword ptr result+24,ebx
mov ebx,dword ptr value+8
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+24,edx
add dword ptr result+20,ebx
mov ebx,dword ptr value+4
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+20,edx
add dword ptr result+16,ebx
mov ebx,dword ptr value
mov edx,0
mov cl,nt_2
shld edx,ebx,cl
shl ebx,cl
add dword ptr result+16,edx
add dword ptr result+12,ebx
;============================
jmp OVER
NEXT_4:
cmp al,128 ;等于128跳
jne NEXT_5
mov eax,dword ptr value+12
mov dword ptr result+28,eax
mov eax,dword ptr value+8
mov dword ptr result+24,eax
mov eax,dword ptr value+4
mov dword ptr result+20,eax
mov eax,dword ptr value
mov dword ptr result+16,eax
;===========================
jmp OVER
NEXT_5:
;========================
mov bl,1 ;溢出标志为1,表示输入有误
mov bo,bl
OVER:
ret
calculate endp
;====================
output proc;输出函数
mov bl,bo
cmp bl,0
jnz NEXT2_1
mov eax,dword ptr value+12
call writeHex
mov eax,dword ptr value+8
call writeHex
mov eax,dword ptr value+4
call writeHex
mov eax,dword ptr value
call writeHex
mov edx,offset str3
call writestring
movzx eax,n_2
call writedec
mov al,"="
call writechar
call crlf
mov eax,dword ptr result+28
call writeHex
mov eax,dword ptr result+24
call writeHex
mov eax,dword ptr result+20
call writeHex
mov eax,dword ptr result+16
call writeHex
mov eax,dword ptr result+12
call writeHex
mov eax,dword ptr result+8
call writeHex
mov eax,dword ptr result+4
call writeHex
mov eax,dword ptr result
call writeHex
jmp NEXT2_2
NEXT2_1:
mov edx,offset str4
call writestring
NEXT2_2:
call crlf
call readchar
ret
output endp
;====================
main proc
call input
call calculate
call output
exit
main endp
end main
相关文章
- 一个比较精确计算cpu主频的程序
- 编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
- javascript 计算文件MD5 浏览器 javascript读取文件内容
- 使用函数计算自定义运行时快速部署一个 SpringBoot 项目 | 文末有礼
- Python 手工计算x的算术平方根,一个中国古代的数学成就
- Image数据数值计算处理的一个小问题
- 普通Java对象怎么计算大小(字节长度)?
- ABAP并发计算的一个实例
- element ui table表格计算最后一列的合计数demo效果(整理)
- AI公开课:19.05.15施尧耘-达摩院量子实验室主任《量子计算:前景与挑战》课堂笔记以及个人感悟
- Serverless,引领云计算下一个阶段
- 习题 12.5 写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle、Square、Rectangle、Tarpezoid、Triangle。用虚函数分别计算几种图形面积,并求。。。
- Java //PP2.9 将上一题的计算过程反过来编写一个程序。也就是读入一个以秒为单位的时间长度,然后换算成小时、分和秒的组合表达方式并打印输出结果(例如,9999秒等于2小时46分39秒)
- 习题6.13 定义一个Student类,包含如下内容:成员变量:学号,姓名,性别,班干部否,数学,语文,外语 成员方法:输入,总分,平均分 编程实现这个类,并调用相应的方法输入数据,计算总分和平均分。
- 解答私信@呵,搞笑、、、 //C 定义一个结构体变量(包括年、月、日),输入年份和第几天,反过来计算该日在本年中是几月几号。注意闰年的问题。
- 一脸懵逼学习Storm---(一个开源的分布式实时计算系统)
- 华为HCIE云计算之FA桌面云业务发放
- 华为HCIE云计算之FC添加ipsan数据存储
- NA 去掉删除多余的na 向量是否存在两个以及两个以上等于0的值 na NA 如何计算R中向量中大于某个值的元素数量 R如何按条件查找数据并删除符合条件的数据所在的行 判定一个向量是否包含0这个元素
- ResNeXt——与 ResNet 相比,相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半
- 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度
- 云计算|OpenStack|社区版OpenStack安装部署文档(二---OpenStack运行环境搭建)