| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13348 人关注过本帖
标题:求助大佬,如何用32位汇编语言对64位数据进行操作,比如加法,减法,乘法, ...
只看楼主 加入收藏
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:12 
求助大佬,如何用32位汇编语言对64位数据进行操作,比如加法,减法,乘法,除法。
32位汇编语言对64位数据进行一系列操作。
1.64位+64位
2.64位*64位
3.64位-64位
4.64位无符号整数二进制转十六进制输出
主要是这四个问题,求助大佬
搜索更多相关主题的帖子: 操作 除法 位数 汇编语言 乘法 
2021-06-25 19:23
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:10 

x dq ????
y dq ????
z dq 0,0
;以上为64bit的值,dq 8bytes的定义,就像db是1byte,dd是4bytes一样.
x,y是2个运算元,z是结果

x+y
mov eax,dword ptr x    ;取64bit低位
mov edx,dword ptr x + 4 ;取64bit高位
add eax,dword ptr y    ;64bit低位加
adc edx,dword ptr y + 4 ;带进位加64bit高位,也可能再有进位
mov dword ptr ptr z,eax        ;存64bit低位
mov dword ptr ptr z + 4, edx    ;存64bit高位
adc dword ptr ptr z + 8, 0     ;带进位加(若有进位,此值为1)

x-y
方法同上,带进位减用sbb

x * y
乘法,就是笔算的乘法,比如

 12
x34
___

相当于 4x2 + 4*10 + 30*2 + 30*10
楼主可以先想想....




输出16进制,本论坛多的是,楼主可以自己找找




[此贴子已经被作者于2021-6-25 21:34编辑过]

2021-06-25 21:32
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
回复 2楼 Valenciax
谢谢大佬解答,加法和减法没什么问题了,但是乘法还是没有实现出来
2021-06-28 15:22
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:20 
回复 3楼 Sky_
;用32bit暂存器模拟64相乘
;以下代码就是笔算化为相应动作

程序代码:


.386
.model flat,stdcall
.data

 first dd ?,?  ;第1乘数,低位在前,高位在后
 second dd ?,? ;第2乘数,低位在前,高位在后
 result dd 0,0,0,0 ;结果,低位在前,高位在后
 fLsL dd ?,? ;first低位*second低位的暂存结果
 fHsL dd ?,? ;first高位*second低位的暂存结果
 fLsH dd ?,? ;first低位*second高位的暂存结果      
 fHsH dd ?,? ;first高位*second高位的暂存结果

.code
main proc

 mov eax,[first+0]      ;获取first低位
 mov ebx,[second+0]     ;获取second低位
 mul ebx        ;相乘    
 mov [fLsL+0],eax    ;存取低位*低位的结果低位
 mov [fLsL+4],edx     ;存取低位*低位的结果高位
 mov eax,[first+4] 

 mov ebx,[second+0]

 mul ebx        ;以下解释同上
 mov [fHsL+0],eax

 mov [fHsL+4],edx     

 mov eax,[first+0] 

 mov ebx,[second+4]

 mul ebx

 mov [fLsH+0],eax

 mov [fLsH+4],edx 

 mov eax,[first+4]

 mov ebx,[second+4] 

 mul ebx

 mov [fHsH+0],eax

 mov [fHsH+4],edx 
;            ;至此相乘结束,以下结果相加
 mov eax,[fLsL+0]

 mov [result+0],eax     ;结果的低位
 mov eax,[fLsL+4]

 add eax,[fHsL+0]

 adc dword ptr [result+8],0    ;若有进位加前一位
 add eax,[fLsH+0]

 adc dword ptr [result+8],0

 mov [result+4],eax

 mov eax,[fHsL+4]

 add eax,[fLsH+4]

 adc dword ptr [result+12],0

 add eax,[fHsH+0]

 adc dword ptr [result+12],0

 add eax,[result+8]         

 adc dword ptr [result+12],0

 mov [result+8],eax

 mov eax,[fHsH+4]

 add eax,[result+12]

 mov [result+12],eax

 .exit
end main


[此贴子已经被作者于2021-6-28 21:16编辑过]

2021-06-28 19:31
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
好像出了一点问题,不管输入什么数,答案都一样,这是什么情况啊,我是用masm32编译运行的。求大佬再辛苦看看。
2021-06-28 21:03
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
回复 4楼 Valenciax
刚才好像回复错地方了,问题在5楼。
2021-06-28 21:05
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:20 
好像没有问题,做了2个测试
测试1
 first dd 12345678h,87654321h  ;第1乘数,低位在前,高位在后
 second dd 0ABCDABCDH,11223344H ;第2乘数,低位在前,高位在后
 8765432112345678 x 11223344ABCDABCD
相乘结果(用小算盘) =  9FA3422FEFC36618h
见图,红色是first,紫色是second,蓝色是结果,低位在前,高位在后,就是9FA3422FEFC36618h
图片附件: 游客没有浏览图片的权限,请 登录注册


测试2
 first dd 11111111h,22222222h  ;第1乘数,低位在前,高位在后
 second dd 33333333H,44444444H ;第2乘数,低位在前,高位在后
 2222222211111111 x 4444444433333333
相乘结果(用小算盘) =  4D5E6F80962FC963h
见图,红色是first,紫色是second,蓝色是结果,低位在前,高位在后,就是4D5E6F80962FC963h
图片附件: 游客没有浏览图片的权限,请 登录注册





[此贴子已经被作者于2021-6-28 22:01编辑过]

2021-06-28 21:56
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
回复 7楼 Valenciax
啊,谢谢大佬,那我再看看
2021-06-29 09:19
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
回复 7楼 Valenciax
源代码在我这里运行有点问题,就改了一点点,然后结果不太一样
程序代码:
.386
include io32.inc
;.model flat,stdcall
.data


 first dd 12345678h,87654321h  ;第1乘数,低位在前,高位在后
 second dd 0abcdabcdh,11223344h ;第2乘数,低位在前,高位在后
 result dd 0,0,0,0 ;结果,低位在前,高位在后
 fLsL dd ?,? ;first低位*second低位的暂存结果
 fHsL dd ?,? ;first高位*second低位的暂存结果
 fLsH dd ?,? ;first低位*second高位的暂存结果      
 fHsH dd ?,? ;first高位*second高位的暂存结果
;data ends

.code
;main proc
start:

 mov eax,[first+0]      ;獲取first低位
 mov ebx,[second+0]     ;獲取second低位
 mul ebx        ;相乘    
 mov [fLsL+0],eax    ;存取低位*低位的結果低位
 mov [fLsL+2],edx     ;存取低位*低位的結果高位
 mov eax,[first+2] 


 mov ebx,[second+0]


 mul ebx        ;以下解釋同上
 mov [fHsL+0],eax


 mov [fHsL+2],edx     


 mov eax,[first+0] 


 mov ebx,[second+2]


 mul ebx


 mov [fLsH+0],eax


 mov [fLsH+2],edx 


 mov eax,[first+2]


 mov ebx,[second+2] 


 mul ebx


 mov [fHsH+0],eax


 mov [fHsH+2],edx 
;            ;至此相乘結束,以下結果相加
 mov eax,[fLsL+0]


 mov [result+0],eax     ;結果的低位
 mov eax,[fLsL+2]


 add eax,[fHsL+0]


 adc dword ptr [result+4],0    ;若有進位加前一位
 add eax,[fLsH+0]


 adc dword ptr [result+4],0


 mov [result+2],eax


 mov eax,[fHsL+2]


 add eax,[fLsH+2]


 adc dword ptr [result+6],0


 add eax,[fHsH+0]


 adc dword ptr [result+6],0


 add eax,[result+4]         


 adc dword ptr [result+6],0


 mov [result+4],eax


 mov eax,[fHsH+2]


 add eax,[result+6]


 mov [result+6],eax


exit 0
end start

图片附件: 游客没有浏览图片的权限,请 登录注册

求助求助
2021-06-30 16:44
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 9楼 Sky_
之前4楼代码曾修改的,须重新抓下来
2021-06-30 17:10
快速回复:求助大佬,如何用32位汇编语言对64位数据进行操作,比如加法,减法,乘 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027401 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved