排序的汇编代码如下
assume cs:code,ds:data
data segment
msg1 db 'Before sort:$'
crlf db 0dh,0ah,'$'
msg2 db 'After sort :$'
buff db 16 dup (0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov dx,offset msg1
mov ah,9
int 21h
mov cx,0
mov di,offset buff
input:
mov ah,1
int 21h
cmp al,0dh
jz ok
mov [di],al
inc di
inc cx
cmp cx,16
jz ok
jmp input
ok:
mov dx,offset crlf
mov ah,9
int 21h
mov dx,offset msg2
mov ah,9
int 21h
dec cx
mov si,offset buff
s:
push cx
mov di,si
inc di
s1:
mov al,[si]
cmp al,[di]
jb jx
xchg al,[di]
mov [si],al
jx:
inc di
loop s1
inc si
pop cx
loop s
mov byte ptr [si+1],24h
mov dx,offset buff
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
输入显示的代码如下
DATA SEGMENT
BUFSIZE DB 50 ; 最多可键入50个字符
ACTLEN DB ? ;实际键入的字符数
CHARS DB 50 DUP(20H) ;实际键入的字符从此开始存放
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BUFSIZE ;键入缓冲区起始偏移地址送DX
MOV AH,0AH
INT 21H ; 输入字符串并送入缓冲区
XOR CX,CX
MOV CL,ACTLEN ;取得输入的字符数
MOV DX,OFFSET CHARS ;输入的字符串起始地址送DX
MOV BX,DX ;将字符串首地址送BX
ADD BX,CX ;取到字符串尾地址
MOV BYTE PRT[BX],'$' ;在字符串尾插$
MOV AH,09H ;字符串显示功能
INT 21H ;显示键入的字符串
MOV AH,4CH ;调用返回DOS功能
INT 21H ;返回DOS
CODE ENDS
END START
要求排序的是子程序,第二个输入的是主程序,输入一串字符,显示出输入,并显示出排序后的结果。
先给50,能执行另加100
排序要用子程序实现,就是主程序里的CALL调用子程序。你的回答好像没有用到子程序。帮帮忙,谢谢。
追答;已经改成 主程序 调用 子程序 的形式如下。
assume cs:code, ds:data
data segment
msg1 db 'Before sort:$'
crlf db 0dh, 0ah, '$'
msg2 db 'After sort :$'
;----------------------------------
BUFSIZE DB 50 ;最多可键入50个字符.
ACTLEN DB ? ;实际键入的字符数.
CHARS DB 50 DUP(20H) ;实际键入的字符从此开始存放.
data ends
;-------------------------
code segment
MAIN PROC FAR ;主程序
start:
mov ax, data
mov ds, ax
mov dx, offset msg1
mov ah, 9
int 21h
MOV DX, OFFSET BUFSIZE ;键入缓冲区起始偏移地址送DX
MOV AH, 0AH
INT 21H ;输入字符串并送入缓冲区.
ok:
mov dx, offset crlf
mov ah, 9
int 21h
mov dx, offset msg2
mov ah, 9
int 21h
;-----------------------
CALL SSS ;调用排序子程序.
;-----------------------
XOR CX, CX
MOV CL, ACTLEN ;取得输入的字符数.
MOV DX, OFFSET CHARS ;输入的字符串起始地址送DX
MOV BX, DX ;将字符串首地址送BX
ADD BX, CX ;取到字符串尾地址.
MOV BYTE PTR [BX], '$' ;在字符串尾插$
MOV AH, 09H ;字符串显示功能
INT 21H ;显示键入的字符串
mov ah, 4ch
int 21h ;返回DOS
MAIN ENDP ;主程序末尾
;---------------------------------
SSS PROC ;排序子程序.
XOR CX, CX
MOV CL, ACTLEN ;取得输入的字符数.
DEC CX
mov si, offset CHARS
s:
push cx
mov di, si
inc di
s1:
mov al, [si]
cmp al, [di]
jb jx
xchg al, [di]
mov [si], al
jx:
inc di
loop s1
inc si
pop cx
loop s
RET ;子程序返回主程序.
SSS ENDP
;---------------------------------
code ends
end start
E:\masm1> t0418
t0418是什么?
t0418是可执行文件,全名是 t0418.exe
汇编及连接后的文件名如下:
E:\masm1>dir t0418.*
Volume in drive E is DISK1_VOL3
Volume Serial Number is 6E41-CA4C
Directory of E:\masm1
2011-04-18 12:23 1,383 t0418.asm
2011-04-18 12:23 709 T0418.EXE
2011-04-18 12:23 312 T0418.OBJ
3 File(s) 2,404 bytes
0 Dir(s) 11,553,464,320 bytes free