关于汇编的程序 希望高手给解释一下 这里面的loop $是什么意思,最好能给我的这个程序在重要的地方加上注

4楼

CODE SEGMENT
ASSUME CS:CODE,DS:CODE
start: MOV AX,CODE
MOV DS,AX
mov ax,0b800h
MOV ES,AX
cld
AGAIN: MOV AX,3
INT 10H
lea dx,MENU ;主菜单
mov ah,9
int 21h
input:
mov ah,0
int 16h
cmp al,'1'
jnz cp2
call sub01 ;输入一个字符串
jmp input
cp2:cmp al,'2'
jnz cp3
call sub02 ;字符串左右移动
jmp AGAIN ;返回到主菜单
cp3:cmp al,'3' ;返回DOS
jnz input
lea dx,MESG
mov ah,9
int 21h
mov ah,1
int 21h
MOV AH,4CH
INT 21H

DELAY PROC
PUSH CX
PUSH DX
MOV DX,800
D1:MOV CX,0ffffh
LOOP $
DEC DX
JNZ D1
POP DX
POP CX
RET
DELAY ENDP

sub01:
mov ax,0e0dh
int 10h
mov al,0ah
int 10h
lea dx,str
mov ah,0ah
int 21h ;输入一个字符串
mov ax,0e0ah
int 10h
ret

sub02:
cmp buf,0dh
jz quit
call line ;画矩形框
lea si,str
inc si
mov dx,si
mov al,' '
xchg al,[si]
cbw
mov bx,ax
inc bx
mov byte ptr [bx+si],' '
inc bx
push bx
shl bx,1
sub right,bx
pop bx
mov bp,left
show:
mov si,dx
mov cx,bx
mov di,bp
next:
movsb
mov al,2
stosb
loop next
mov ah,1
int 16h
jnz quit ;按任意键,返回主菜单
call delay
add bp,num
cmp bp,right
jb t1
mov num,-2
jmp here
t1:cmp bp,left
ja here
mov num,2
here: jmp show
sss:mov buf,0dh
quit: xor di,di
mov cx,80*25
mov ax,720h
rep stosw ;清全屏
ret

line: ;矩形框
mov di,(18*80+10)*2
mov al,201 ;左上角
mov ah,4
stosw
mov cx,60-2
mov al,205 ;横框
rep stosw
mov al,187 ;右上角
stosw
add di,20*2
mov al,186 ;竖框
stosw
mov left,di
mov cx,60-2
mov al,20H ;空格
rep stosw
mov right,di
mov al,186 ;竖框
stosw
add di,20*2
mov al,200 ;左下角
stosw
mov cx,60-2
mov al,205 ;横框
rep stosw
mov al,188 ;右下角
stosw
ret

MENU DB 5 DUP(0AH)
DB 31 DUP(' '),'MAIN MENU',0DH,0AH
DB 25 DUP(' '),201,21 DUP(205),187,0DH,0AH
DB 25 DUP(' '),186,' 1.Input a String ...',186,0DH,0AH
DB 25 DUP(' '),186,' 2.Display Model ... ',186,0DH,0AH
DB 25 DUP(' '),186,' 3.Return to DOS ... ',186,0DH,0AH
DB 25 DUP(' '),200,21 DUP(205),188,0DH,0AH
DB 28 DUP(' '),'Choice(1,2,3):$'
MESG DB 0dh,0ah,0dh,0ah,9,'Press any key to exit ...$'
num dw 2
left dw 0
right dw 0
str db 21
db 0
buf db 0dh,20 dup(0)

CODE ENDS
END start
这个里面的延迟程序用来干什么的
我主要是下面的不懂
DELAY PROC
PUSH CX
PUSH DX
MOV DX,800
D1:MOV CX,0ffffh
LOOP $
DEC DX
JNZ D1
POP DX
POP CX
RET
DELAY ENDP

程序每条指令的执行是耗时间的,该子程序执行空循环的次数为0ffffH*800=52428000次,其延迟的时间与计算机的主频有关。事实上,该子程序就是通过不断的空循环来耗时以此实现程序的暂停执行,即延迟
DELAY PROC
PUSH CX
PUSH DX;保护现场
MOV DX,800;第二轮循环次数
D1:MOV CX,0ffffh;第一轮循环次数
LOOP $;若CX不等于零,跳转至当前代码地址的指令($=该指令在该代码段的偏移地址)
DEC DX;DX减1
JNZ D1
POP DX
POP CX;现场还原
RET;返回主程序
DELAY ENDP
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-02
$代表当前位置吧,相当于从当前位置开始循环。$在汇编中用得还是挺多的。好久没接触汇编了,程序太长也没看懂。延时程序用处很多的,比如计时、便于显示观看等,不过没仔细看在哪儿用了……