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
能说一下程序的流程,也就是每部分之间的联系及作用!
追答你把几个跳转语句和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是除法计算的结果,所以不需要再定义了。