谁能把下面的汇编语言用通俗的语言注释一下,越详细越好!急用!!!

s1 segment stack;定义堆栈段
dw 100h dup(?)
top label word
s1 ends
s2 segment
h1 db 'the positive number is:','$' ;db:在数据段定义要显示的字符串
h2 db 'the negative number is:','$'
crlf db 0dh,0ah,24h
array dw 50h,-11h,61h,-22h,72h,-33h,73h,-41h,74h,51h,67h,-90h,73h,77h,-1h,-89h,-11h,61h,-22h,20h,'$' ;利用功能调用显示信息
s2 ends
s3 segment
assume cs:s3,ds:s2,ss:s3 ;段寄存器,向汇编程序指示当前各段所用的段寄存器,设定段寄存器与段间的对应关系
main proc far ;过程定义伪指令
mov ax,s1
mov ss,ax
lea sp,top
mov ax,s2
mov ds,ax
mov bx,0
mov si,0
l: mov dx,array[si]
cmp dx,0
jl addlow ;有符号数比较用jl
add si,2
cmp si,40
jz exit
jmp l
addlow: inc bx ;Inc,加一指令
add si,2
cmp si,40
jz exit ;jz,如果si-40为零,跳转到exit
jmp l ;jz,如果si-40不为零,跳转到l
exit: lea dx,h2
mov ah,9
int 21h
mov ax,bx
call print

lea dx,crlf
mov ah,9
int 21h
mov ax,20
sub ax,bx
call print
jmp atend
print proc near ;打印数字字符的子程序
mov cl,10
mov si,0
repeat:div cl
mov dl,ah
add dl,30h
mov dh,0
push dx
inc si
mov ah,0
cmp al,0
jnz repeat
l2: pop dx
mov ah,2
int 21h
dec si
cmp si,0
jnz l2

ret
print endp
atend:mov ah,4ch
int 21H
main endp
s3 ends
end main

第1个回答  推荐于2016-05-28
exit: lea dx,h2 ;h2字符串地址放到dx中
mov ah,9
int 21h ;调用dos的9号功能,显示ds:dx处的字符串
mov ax,bx
call print

lea dx,crlf
mov ah,9
int 21h ;显示回车换行
mov ax,20
sub ax,bx
call print ;调用子程序print,显示字符
jmp atend
print proc near ;打印数字字符的子程序
mov cl,10
mov si,0
repeat:div cl ;除法指令
mov dl,ah
add dl,30h ;数字变成字符ascii码
mov dh,0
push dx ;压入堆栈,dx保存
inc si
mov ah,0
cmp al,0
jnz repeat ;重复
l2: pop dx ;弹出dx
mov ah,2
int 21h ;显示一个字符
dec si
cmp si,0 ;判断si是否零
jnz l2 ;不为零转

ret
print endp
atend:mov ah,4ch
int 21H ;结束程序,返回dos追问

能说一下程序的流程,也就是每部分之间的联系及作用!

追答

你把几个跳转语句和call分析一下就行了

追问

子程序print 看不懂!div除法指令怎么就一个操作数?cmp al,0里al没定义怎么比较?

追答

div的被除数 默认放在 ax 或 dx 和 ax 中, 如果除数为 8 位, 被除数则为 16 位, 默认在 ax 中存放; 如果除数为 16 位, 被除数则为 32 位, 在 dx 和 ax 中存放, dx 存放高 16 位, ax 存放低 16 位.

你的程序中div cl,实际上是被除数ax除以cl,计算结果商在al中,余数在ah中。
al是除法计算的结果,所以不需要再定义了。

本回答被提问者和网友采纳
相似回答