把这个汇编语言逐句翻译下

2024-12-03 19:37:57
推荐回答(2个)
回答(1):

这是一个并不十分规范的汇编程序
其功能是对输入的两个十进制数求和,并显示结果。程序没有按正常方式返回,但可以用CTRL+C结束。
“逐句翻译”实在没有必要,简要说明如下:
程序中含一弯正高个主程序(main proc far)和4个子程序(hexibin proc near ;binihex proc near ;decibin proc near;crlf proc near)

data segment ;数据段
temp dw ? ;定义一个字,保存输入的第一个数
data ends

decihex segment ;代码段
assume cs:decihex,ds:data
main proc far ;主程序开始
nexts:
call decibin ;调用输入子程序,输入第一个加数,结果在BX中
mov temp,bx ;保存输入的第一个数
call decibin ;调用输入子程序,输入第二个加数,结果在BX中
mov ax,temp ;将第一个加数放入AX
add bx,ax ;将两个数相加,结果在BX中
call hexibin ;调用将16进制数转换成10进制表示的数子程序
call crlf ;调用回车换行子程序
call binihex ;调用输出子程序
call crlf ;调用回车换行子程序
jmp nexts ;继续做下一个加法。。。
main endp ;主程序结束
;=====================
hexibin proc near ;将和转换成16进制表示的10进制数,如:13+24=37 在BX中表示的和为25(H),通过该子程序调用后,BX=0037(H). 该子程序主要算法是除10取余,但代

码太繁琐。。。 晕!
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 ;输出子程序。将BX中16进制表示的10进制数按10进制位逐位输出。 假如:BX=1234H
mov ch,4 ;循环数4次
rotate: mov cl,4 ;移位数
rol bx,cl ;BX循环左移4位,BX:1234H ==>> 2341H
mov al,bl ;将BL送AL,即:将41H送AL
and al,0fh ;只保留AL低4位 即:AL=01H
add al,30h ;转换成ASCII码以便输出 AL=31H
cmp al,3ah
jl printit
add al, 7h
printit: mov dl, al
mov ah, 2 ;调用DOS 2号功能输出一个字符 ,4次循环依次输出1 2 3 4
int 21h
dec ch ;减一次循环计数
jnz rotate ;转循环
ret
binihex endp
;======================
decibin proc near ;输入子程序,输入的最终数埋尺保存在BX中
mov bx,0 ;置BX初值位0
newchar:mov ah,1 ;调用DOS 1号功能输入一个字符,输入的结果在AL中
int 21h
sub al,30h ;将输入的ASCII码转换成数字
jl exit ;如果输入字符的ASCII码小于“0”则直接返回(主程序),如:"+ - / " 空格 等字符
cbw ;将AL的8位值扩展到16位的清誉AX
xchg ax,bx ;将AX与BX交换,交换的目的是需将已输入的数(在BX中,且初值为0)进位(乘以10),而执行乘法时要用到AX寄存器
mov cx,10d ;执行BX*10 结果在 DX:AX中
mul cx
xchg ax,bx ;此指令完全多余!
add bx,ax ;将乘以10以后的值再加上这次的数。 比如:第一次输入2,第二次输入8,结果是2*10+8=18;若再输入3,则结果是18*10+3=183.
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

回答(2):

数据纳液棚段
  临时dw吗?
  数据结束
  decihex段
  假定cs:decihex,ds:数据
  主要过程远
  nexts:
  叫decibin
  埋迟mov临时雇员、bx
  叫decibin
  mov斧,临时
  添加bx、斧
  叫hexibin
  叫crlf
  叫binihex
  叫crlf
  nexts该科通过就业选配计划
  主要endp
  附近hexibin触发
  mov斧,bx
  mov cx、1 h
  xor bx、bx
  loop2:mov dl、10 d
  师dl
 洞则 
  mov黎宇光,呵呵
  xor呀,
  生化
  mov临时雇员、斧
  
  xor斧,ax
  mov铝、dl
  生化
  cx度