汇编语言32位乘法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
assume cs:code,ds:data
data segment
NA dw 0F321H,09AFCH
NB dw 08818H,0301DH
;-------第一个字是等待相乘的数的高16位,第二个是低十六位
T1 dw 0,0,0
T2 dw 0,0,0
;-------32位数乘以16位数不可能大于48位,所以分配3个字
R dw 0,0,0,0
;-------32位数乘以32位数不可能大于64位,所以为结果分配4个字
data ends
code segment
start:mov ax,data
mov ds,ax
;-------初始化段寄存器
Step1:mov ax,NA+2
mov bx,NB+2
mul bx
mov T1+4,ax
mov cx,dx
;-------Number A的低16位乘以Number B 的低十六位,结果存入T1+4 ;进位存入CX
mov ax,NA
mov bx,NB+2
mul bx
mov T1+2,ax
add T1+2,cx
adc T1,dx
;-------Number A的高16位乘以Number B 的低十六位,结果存入T1+4 ;结果存入T1+2,将T1+2与上一次相乘的进位相加存入T1+2
;将第二次相乘的进位带符号相加入T1(前一位的相加可能产生进位) Step2:mov ax,NA+2
mov bx,NB
mul bx
mov T2+4,ax
mov cx,dx
;-------同理
mov ax,NA
mov bx,NB
mul bx
mov T2+2,ax
add T2+2,cx
adc T2,dx
;-------同理
SUM:mov ax,T1+4
mov R+6,ax
mov ax,T2+4
add T1+2,ax
mov ax,T1+2
mov R+4,ax
mov ax,T2+2
adc T1,ax
mov ax,T1
mov R+2,ax
mov ax,T2
adc R,ax
;-------错位相加
mov ax,4C00H
int 21H
code ends
end start
原理图:
NA NA+2
×NB NB+2
——————————————————
T1 T1+2 T1+4
+T2 T2+2 T2+4
——————————————————
R R+2 R+4 R+6
编写一个程序,从键盘上连续输入多个字符,遇到“$”时终止,然后以与输入相反的顺序将该字符串以大写的形式在屏幕上显示出来
要求:用“先进后出”的设计思路,使用堆栈技术,结合DOS的中断调用,实现输入字符串的倒序显示
CODE SEGMENT ;作业
ASSUME CS:CODE,ds:code
org 100h
START:
push cs
pop ds
cld
lea dx,msg
mov ah,9
int 21h ;提示
xor cx,cx
t0:mov ah,1
int 21h ;接收数据
cmp al,'$' ;'$'结束程序
jz show
cmp al,'a'
jb y1
cmp al,'z'
ja y1
sub al,20h ;小写转大写
y1:inc cx
push ax
jmp t0
jcxz quit
show:
mov al,0dh
inc cx
push ax
mov al,0ah
inc cx
push ax ;字符串倒序输出mov cx,cx
next:
pop dx
mov ah,2
int 21h
loop next
quit:
mov ah,1
int 21h ;等待
MOV AX,4C00H
INT 21H
msg db 09,'Input a string...',0dh,0ah,'$'
CODE ENDS
END START