data segment
temp dw ?
data ends
decihex segment
assume cs:decihex,ds:data
main proc far
nexts:
call decibin
mov temp,bx
call decibin
mov ax,temp
add bx,ax
call hexibin
call crlf
call binihex
call crlf
jmp nexts
main endp
hexibin proc near
mov ax,bx
mov cx,1h
xor bx,bx
loop2:mov dl,10d
div dl
mov dl,ah
xor ah,ah
cbw
mov temp,ax
xor ax,ax
mov al,dl
cbw
mul cx
add bx,ax
mov ax,cx
mov dx,10h
mul dx
mov cx,ax
mov ax,temp
cmp ax,0d
je exit2
jne loop2
exit2:
ret
hexibin endp
binihex proc near
mov ch,4
rotate: mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al, 7h
printit: mov dl, al
mov ah, 2
int 21h
dec ch
jnz rotate
ret
binihex endp
decibin proc near
mov bx,0
newchar:mov ah,1
int 21h
sub al,30h
jl exit
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit: ret
decibin endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
decihex ends
end main
那你能不能写一个简单的汇编语言就是键盘输入的十进制加法结果输出也是十进制,也逐句翻译一下
追答;无论多简单,也是N多行。。。
;在原来程序基础上做了修改,重写了转换输出部分。
;不能处理大于65535的数
data segment ;数据段
temp dw ? ;定义一个字,保存输入的第一个数
sum db 0DH,0AH,5 dup (" "),0DH,0AH,'$' ;定义结果输出串,其中0DH,0AH相当于回车换行
data ends
decihex segment ;代码段
assume cs:decihex,ds:data
main proc far ;主程序开始
mov ax,data
mov ds,ax
push ds
pop es
nexts:
call decibin ;调用输入子程序,输入第一个加数,结果在BX中
mov temp,bx ;保存输入的第一个数
call decibin ;调用输入子程序,输入第二个加数,结果在BX中
mov ax,temp ;将第一个加数放入AX
add bx,ax ;将两个数相加,结果在BX中
call print_c ;调用显示结果子程序
jmp nexts ;继续做下一个加法。。。
main endp ;主程序结束
;=====================
print_c proc near ;显示结果子程序. 将和转换成10进制数并显示。
;实质是将存放和的BX依次除以10000、1000、100、10,然后依次显示其商及最后的余数
mov di,offset sum ;存放10进制显示串的起始地址
mov ax,bx ;BX是和,也就是要转换的被除数,放入AX
mov bx,10000 ;10000是第一个除数,因为AX的最大值是65535
mov dx,0 ;当除数是16位的BX时,被除数是DX:AX,所以DX必须置0
div_again:
div bx ;DX:AX/BX
cmp bx,10 ;当BX=10时结束转换
jnz save
add al,30h ;10位
mov [di],al
inc di
add dl,30h
mov [di],dl ;个位
jmp disp ;转显示
save:
add al,30h
mov [di],al ;保存商位
inc di
push dx ;余数继续除
mov dx,0
mov ax,bx
mov bx,10 ;需将除数依次缩小10倍(即:10000、1000、100、10),所以每次要要除10
div bx
mov bx,ax
pop ax
xor dx,dx
jmp div_again
disp:
mov ah,9 ;显示结果
mov dx,offset sum
int 21h
ret
print_c endp
;======================
decibin proc near
;因字数限制,此段子程序省略。。。
decibin endp
;====================
decihex ends
end main