上周同学让我用汇编写一个 32位 X 32位 的程序
要求键盘输入乘数和被乘数
忙活了老半天才搞定。
下面是部分代码(与大家共同学习)
读取键盘 调用21号中断
;======================
;入口 Bx  存放读入数据
 read proc
  push cx
  push ax
  push dx
  mov dx,0
        mov ch,8
 next1: cmp ch,4
 jnz n2
 push ax
 push dx
         mov dl,' '
        mov ah,2
        int 21h
        pop dx
        pop ax
 n2: mov ah,7
 int 21h
 cmp al,13
 je  over
 push dx
 mov dl,al
 call check
 mov cl,al
 cmp cl,0
 jnz next2
 pop dx
 jmp next1
next2: mov ah,2
 int 21h
 mov al,cl
 pop dx
 cmp ch,4
 jnz full
 mov [bx],dx
 mov dx,0
 full: mov cl,4
 rol dx,cl
 add dl,al
 dec ch
 jnz next1
over: mov [bx+2],dx
 pop dx
 pop ax
 pop cx
  ret
 read endp
检查输入的子程序
;=====================
;入口Al
;出口AL
 check proc
  cmp al,30h
  jl  er
  cmp al,3ah
  jnl b1
  sub al,30h
  jmp ok
 b1: cmp al,41h
  jl  er
  cmp al,47h
  jnl b2
  sub al,37h
  jmp ok
 b2: cmp al,61
  jl er
  cmp al,67h
  jnl er
  sub al,57h
  jmp ok
 er: mov al,0h
 ok: ret
 check endp

关键的乘法部分
 ;===========相乘=========
 mult   proc
  push ax
  push bx
  push cx
  push dx
  push di
  mov ax,offset res
  mov di,ax
  mov bx,offset d1
  mov ax,[bx+6]
  mov cx,[bx+2]
  mul cx
  add [di+6],ax
  add [di+4],dx
  mov ax,[bx+4]
  mul cx
  add [di+4],ax
  adc [di+2],dx
  mov cx,[bx]
  mov ax,[bx+6]
  mul cx
  add [di+4],ax
  adc [di+2],dx
  adc word ptr[di],0
  mov ax,[bx+4]
  mul cx
  add [di+2],ax
  adc [di],dx
  pop di
  pop dx
  pop cx
  pop bx
  pop ax
  ret
  mult endp
以下是全部代码 在window 2000 下用TD编译通过(我是轻工学院的)

用汇编实现双字相乘adata segment
用汇编实现双字相乘    d1 dw 
4 dup(0)
用汇编实现双字相乘    res dw 
4 dup(0)
用汇编实现双字相乘    info  db 
' (H)','$'
用汇编实现双字相乘    info1 db 
'Input the Num1 : ','$'
用汇编实现双字相乘    info2 db 
'Input the Num2 : ','$'
用汇编实现双字相乘    info3 db 
'Num1 * Num2  =  ','$'
用汇编实现双字相乘    info4 db 0dh,0ah,
'$'
用汇编实现双字相乘adata ends
用汇编实现双字相乘astack segment para stack 
'stack'
用汇编实现双字相乘        sta dw 
100 dup(?)
用汇编实现双字相乘        
top label word
用汇编实现双字相乘astack ends
用汇编实现双字相乘acode segment
用汇编实现双字相乘        assume cs:acode,ds:adata
用汇编实现双字相乘 main   
proc far
用汇编实现双字相乘 start: mov ax,astack
用汇编实现双字相乘        mov ss,ax
用汇编实现双字相乘        mov sp,offset 
top
用汇编实现双字相乘        push ds
用汇编实现双字相乘        mov ax,
0
用汇编实现双字相乘        push ax
用汇编实现双字相乘        mov ax,adata
用汇编实现双字相乘        mov ds,ax    
用汇编实现双字相乘;
=============end init======
用汇编实现双字相乘    call en
用汇编实现双字相乘    mov dx,offset info1
用汇编实现双字相乘    mov ah,
9
用汇编实现双字相乘    
int 21h
用汇编实现双字相乘    mov bx,offset d1
用汇编实现双字相乘        call 
read
用汇编实现双字相乘        call h
用汇编实现双字相乘        call en
用汇编实现双字相乘        mov dx,offset info2
用汇编实现双字相乘    mov ah,
9
用汇编实现双字相乘    
int 21h
用汇编实现双字相乘    
add bx,4
用汇编实现双字相乘        call 
read
用汇编实现双字相乘        call h
用汇编实现双字相乘        call en
用汇编实现双字相乘        call en
用汇编实现双字相乘        mov dx,offset info3
用汇编实现双字相乘    mov ah,
9
用汇编实现双字相乘    
int 21h   
用汇编实现双字相乘;
============multiply===
用汇编实现双字相乘    call mult
用汇编实现双字相乘;
=========display result=====
用汇编实现双字相乘    mov bx,offset res
用汇编实现双字相乘    call dispall
用汇编实现双字相乘    call h
用汇编实现双字相乘    call en
用汇编实现双字相乘    call en
用汇编实现双字相乘    ret
用汇编实现双字相乘 main   endp
用汇编实现双字相乘 ;
===========相乘=========
用汇编实现双字相乘 mult   
proc
用汇编实现双字相乘    push ax
用汇编实现双字相乘    push bx
用汇编实现双字相乘    push cx
用汇编实现双字相乘    push dx
用汇编实现双字相乘    push di
用汇编实现双字相乘    mov ax,offset res
用汇编实现双字相乘    mov di,ax
用汇编实现双字相乘    mov bx,offset d1
用汇编实现双字相乘    mov ax,
[bx+6]
用汇编实现双字相乘    mov cx,
[bx+2]
用汇编实现双字相乘    mul cx
用汇编实现双字相乘    
add [di+6],ax
用汇编实现双字相乘    
add [di+4],dx
用汇编实现双字相乘    mov ax,
[bx+4]
用汇编实现双字相乘    mul cx
用汇编实现双字相乘    
add [di+4],ax
用汇编实现双字相乘    adc 
[di+2],dx
用汇编实现双字相乘    mov cx,
[bx]
用汇编实现双字相乘    mov ax,
[bx+6]
用汇编实现双字相乘    mul cx
用汇编实现双字相乘    
add [di+4],ax
用汇编实现双字相乘    adc 
[di+2],dx
用汇编实现双字相乘    adc word ptr
[di],0
用汇编实现双字相乘    mov ax,
[bx+4]
用汇编实现双字相乘    mul cx
用汇编实现双字相乘    
add [di+2],ax
用汇编实现双字相乘    adc 
[di],dx
用汇编实现双字相乘    pop di
用汇编实现双字相乘    pop dx
用汇编实现双字相乘    pop cx
用汇编实现双字相乘    pop bx
用汇编实现双字相乘    pop ax
用汇编实现双字相乘    ret
用汇编实现双字相乘  mult    endp
用汇编实现双字相乘 ;
===========enter 
用汇编实现双字相乘  en    
proc
用汇编实现双字相乘    push ax
用汇编实现双字相乘    push dx
用汇编实现双字相乘    mov dx,offset info4
用汇编实现双字相乘    mov ah,
9
用汇编实现双字相乘    
int 21h
用汇编实现双字相乘    pop dx
用汇编实现双字相乘    pop ax
用汇编实现双字相乘    ret
用汇编实现双字相乘 en    endp
用汇编实现双字相乘 ;
==============display (H)
用汇编实现双字相乘   h    
proc
用汇编实现双字相乘    push ax
用汇编实现双字相乘    push dx
用汇编实现双字相乘    mov dx,offset info
用汇编实现双字相乘    mov ah,
9
用汇编实现双字相乘    
int 21h
用汇编实现双字相乘    pop dx
用汇编实现双字相乘    pop ax
用汇编实现双字相乘    ret
用汇编实现双字相乘  h     endp
用汇编实现双字相乘;
====================================
用汇编实现双字相乘;显示入口bx
用汇编实现双字相乘 dispall 
proc
用汇编实现双字相乘    push cx
用汇编实现双字相乘    push bx
用汇编实现双字相乘    mov cx,
4
用汇编实现双字相乘l1:    push cx
用汇编实现双字相乘    mov cl,
8
用汇编实现双字相乘    mov ax,
[bx]
用汇编实现双字相乘    
add bx,2
用汇编实现双字相乘    call 
print
用汇编实现双字相乘    pop cx
用汇编实现双字相乘    loop l1
用汇编实现双字相乘    pop bx
用汇编实现双字相乘    pop cx
用汇编实现双字相乘    ret
用汇编实现双字相乘 dispall endp
用汇编实现双字相乘;
======================
用汇编实现双字相乘;入口 Bx  存放读入数据
用汇编实现双字相乘 
read    proc
用汇编实现双字相乘    push cx
用汇编实现双字相乘    push ax
用汇编实现双字相乘    push dx
用汇编实现双字相乘    mov dx,
0
用汇编实现双字相乘        mov ch,
8
用汇编实现双字相乘 next1: cmp ch,
4
用汇编实现双字相乘    jnz n2
用汇编实现双字相乘    push ax
用汇编实现双字相乘    push dx
用汇编实现双字相乘     mov dl,
' '
用汇编实现双字相乘        mov ah,
2
用汇编实现双字相乘        
int 21h
用汇编实现双字相乘        pop dx
用汇编实现双字相乘        pop ax
用汇编实现双字相乘 n2:    mov ah,
7
用汇编实现双字相乘    
int 21h
用汇编实现双字相乘    cmp al,
13
用汇编实现双字相乘    je  
over
用汇编实现双字相乘    push dx
用汇编实现双字相乘    mov dl,al
用汇编实现双字相乘    call 
check
用汇编实现双字相乘    mov cl,al
用汇编实现双字相乘    cmp cl,
0
用汇编实现双字相乘    jnz next2
用汇编实现双字相乘    pop dx
用汇编实现双字相乘    jmp next1
用汇编实现双字相乘next2:    mov ah,
2
用汇编实现双字相乘    
int 21h
用汇编实现双字相乘    mov al,cl
用汇编实现双字相乘    pop dx
用汇编实现双字相乘    cmp ch,
4
用汇编实现双字相乘    jnz 
full
用汇编实现双字相乘    mov 
[bx],dx
用汇编实现双字相乘    mov dx,
0
用汇编实现双字相乘 
full:    mov cl,4
用汇编实现双字相乘    rol dx,cl
用汇编实现双字相乘    
add dl,al
用汇编实现双字相乘    
dec ch
用汇编实现双字相乘    jnz next1
用汇编实现双字相乘
over:    mov [bx+2],dx
用汇编实现双字相乘    pop dx
用汇编实现双字相乘    pop ax
用汇编实现双字相乘    pop cx
用汇编实现双字相乘     ret
用汇编实现双字相乘 
read    endp
用汇编实现双字相乘;
=====================
用汇编实现双字相乘;入口Al
用汇编实现双字相乘;出口AL
用汇编实现双字相乘 
check    proc
用汇编实现双字相乘    cmp al,30h
用汇编实现双字相乘    jl  er
用汇编实现双字相乘    cmp al,3ah
用汇编实现双字相乘    jnl b1
用汇编实现双字相乘    sub al,30h
用汇编实现双字相乘    jmp ok
用汇编实现双字相乘 b1:    cmp al,41h
用汇编实现双字相乘    jl  er
用汇编实现双字相乘    cmp al,47h
用汇编实现双字相乘    jnl b2
用汇编实现双字相乘    sub al,37h
用汇编实现双字相乘    jmp ok
用汇编实现双字相乘 b2:    cmp al,
61
用汇编实现双字相乘    jl er
用汇编实现双字相乘    cmp al,67h
用汇编实现双字相乘    jnl er
用汇编实现双字相乘    sub al,57h
用汇编实现双字相乘    jmp ok
用汇编实现双字相乘 er:    mov al,0h
用汇编实现双字相乘 ok:    ret
用汇编实现双字相乘 
check    endp
用汇编实现双字相乘;
=====================
用汇编实现双字相乘;入口ax
用汇编实现双字相乘 
print  proc
用汇编实现双字相乘        push cx
用汇编实现双字相乘        push bx
用汇编实现双字相乘        mov bx,ax
用汇编实现双字相乘        mov ch,
4
用汇编实现双字相乘 
next:  mov cl,4
用汇编实现双字相乘        rol bx,cl
用汇编实现双字相乘        mov al,bl
用汇编实现双字相乘        
and al,0fh
用汇编实现双字相乘        
add al,30h
用汇编实现双字相乘        cmp al,3Ah
用汇编实现双字相乘        jl disp
用汇编实现双字相乘        
add al,7
用汇编实现双字相乘 disp:  mov ah,
2
用汇编实现双字相乘        mov dl,al
用汇编实现双字相乘        
int 21h
用汇编实现双字相乘        
dec ch
用汇编实现双字相乘        jnz 
next
用汇编实现双字相乘        pop bx
用汇编实现双字相乘        pop cx
用汇编实现双字相乘        mov dl,
' '
用汇编实现双字相乘        mov ah,
2
用汇编实现双字相乘        
int 21h
用汇编实现双字相乘        ret
用汇编实现双字相乘 
print  endp
用汇编实现双字相乘acode   ends
用汇编实现双字相乘        
end start
用汇编实现双字相乘

相关文章:

  • 2021-09-21
  • 2021-11-01
  • 2021-04-08
  • 2022-12-23
  • 2021-10-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-21
  • 2022-12-23
  • 2021-07-28
  • 2021-11-05
  • 2022-01-29
  • 2021-07-12
  • 2022-01-30
相关资源
相似解决方案