汇编 编写程序能够实现两个大整数相乘
答案:3 悬赏:70 手机版
解决时间 2021-11-15 16:23
- 提问者网友:沉默菋噵
- 2021-11-14 17:14
汇编 编写程序能够实现两个大整数相乘
最佳答案
- 五星知识达人网友:平生事
- 2021-11-14 17:52
;
;HiHi_a:HiLo_a:LoHi_a:LoLo_a/HiHi_b:HiLo_b:LoHi_b:LoLo_b
;result: ebp:ebx:edx:eax
;remainder:HiHi_r:HiLo_r:LoHi_r:LoLo_r
;
.data
LoLo_a dd ?
LoHi_a dd ?
HiLo_a dd ?
HiHi_a dd ?
LoLo_b dd ?
LoHi_b dd ?
HiLo_b dd ?
HiHi_b dd ?
LoLo_r dd ?
LoHi_r dd ?
HiLo_r dd ?
HiHi_r dd ?
.code
...
xor eax,eax
mov HiHi_r,eax
mov HiLo_r,eax
mov LoHi_r,eax
mov LoLo_r,eax
mov eax,LoLo_a
mov edx,LoHi_a
mov ebx,HiLo_a
mov ebp,HiHi_a
mov ecx,80h
looptop:
shl eax,1
rcl edx,1
rcl ebx,1
rcl ebp,1
rcl LoLo_r,1
rcl LoHi_r,1
rcl HiLo_r,1
rcl HiHi_r,1
mov esi,HiHi_r
cmp esi,HiHi_b
jb skip
ja subtract
mov esi,HiLo_r
cmp esi,HiLo_b
jb skip
ja subtract
mov esi,LoHi_r
cmp esi,LoHi_b
jb skip
ja subtract
mov esi,LoLo_r
cmp esi,LoLo_b
jb skip
subtract:
mov esi,LoLo_b
sub LoLo_r,esi
mov esi,LoHi_b
sbb LoHi_r,esi
mov esi,HiLo_b
sbb HiLo_r,esi
mov esi,HiHi_b
sbb HiHi_r,esi
inc eax
skip:
loop looptop
;HiHi_a:HiLo_a:LoHi_a:LoLo_a/HiHi_b:HiLo_b:LoHi_b:LoLo_b
;result: ebp:ebx:edx:eax
;remainder:HiHi_r:HiLo_r:LoHi_r:LoLo_r
;
.data
LoLo_a dd ?
LoHi_a dd ?
HiLo_a dd ?
HiHi_a dd ?
LoLo_b dd ?
LoHi_b dd ?
HiLo_b dd ?
HiHi_b dd ?
LoLo_r dd ?
LoHi_r dd ?
HiLo_r dd ?
HiHi_r dd ?
.code
...
xor eax,eax
mov HiHi_r,eax
mov HiLo_r,eax
mov LoHi_r,eax
mov LoLo_r,eax
mov eax,LoLo_a
mov edx,LoHi_a
mov ebx,HiLo_a
mov ebp,HiHi_a
mov ecx,80h
looptop:
shl eax,1
rcl edx,1
rcl ebx,1
rcl ebp,1
rcl LoLo_r,1
rcl LoHi_r,1
rcl HiLo_r,1
rcl HiHi_r,1
mov esi,HiHi_r
cmp esi,HiHi_b
jb skip
ja subtract
mov esi,HiLo_r
cmp esi,HiLo_b
jb skip
ja subtract
mov esi,LoHi_r
cmp esi,LoHi_b
jb skip
ja subtract
mov esi,LoLo_r
cmp esi,LoLo_b
jb skip
subtract:
mov esi,LoLo_b
sub LoLo_r,esi
mov esi,LoHi_b
sbb LoHi_r,esi
mov esi,HiLo_b
sbb HiLo_r,esi
mov esi,HiHi_b
sbb HiHi_r,esi
inc eax
skip:
loop looptop
全部回答
- 1楼网友:千杯敬自由
- 2021-11-14 19:38
这个核心代码就是用BCD码的乘法和加法调整.
算法很好写吧.
别说10位了,100位都一样.
大致可以分为从键盘取数、判断数位、指针定位、计算并调整、显示输出五部分。
想想挺麻烦的,代码就不写了,想信你能做到。
算法很好写吧.
别说10位了,100位都一样.
大致可以分为从键盘取数、判断数位、指针定位、计算并调整、显示输出五部分。
想想挺麻烦的,代码就不写了,想信你能做到。
- 2楼网友:洒脱疯子
- 2021-11-14 19:29
data SEGMENT
data1 DB ' 56789',10,13,'*',' ',' ',' ',' '
data2 DB '4',10,13
db '------',10,13,'$'
data3 DB 6 DUP(?),'$'
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start: MOV AX,data
MOV DS,AX
MOV BL,data2
SUB BL,30h
LEA SI,data1+5
xor ax,ax
LEA DI,data3
MOV CX,5
l1: MOV AL,[SI]
SUB AL,30h
MUL BL
AAM
ADD AL,[DI]
AAA
MOV [DI],AX
DEC SI
inc DI
LOOP l1
LEA DX,DATA1
MOV AH,9
INT 21h
MOV CX,6
CMP BYTE PTR[DI],0h
JNZ l2
DEC DI
DEC CX
l2: ADD BYTE PTR[DI],30h
MOV DL,[DI]
MOV AH,02h
INT 21h
DEC DI
LOOP l2
MOV AH,4ch
INT 21h
code ENDS
END start
data1 DB ' 56789',10,13,'*',' ',' ',' ',' '
data2 DB '4',10,13
db '------',10,13,'$'
data3 DB 6 DUP(?),'$'
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start: MOV AX,data
MOV DS,AX
MOV BL,data2
SUB BL,30h
LEA SI,data1+5
xor ax,ax
LEA DI,data3
MOV CX,5
l1: MOV AL,[SI]
SUB AL,30h
MUL BL
AAM
ADD AL,[DI]
AAA
MOV [DI],AX
DEC SI
inc DI
LOOP l1
LEA DX,DATA1
MOV AH,9
INT 21h
MOV CX,6
CMP BYTE PTR[DI],0h
JNZ l2
DEC DI
DEC CX
l2: ADD BYTE PTR[DI],30h
MOV DL,[DI]
MOV AH,02h
INT 21h
DEC DI
LOOP l2
MOV AH,4ch
INT 21h
code ENDS
END start
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯