zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

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