高分求汇编语言两个程序合并成一个,一个是另一个的子程序

排序的汇编代码如下
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

;试试看:
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
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 ;输入字符串并送入缓冲区.
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 ;显示键入的字符串.

ok:
mov dx, offset crlf
mov ah, 9
int 21h
mov dx, offset msg2
mov ah, 9
int 21h
;-----------------------
MOV CX, 15

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
;-----------------------
mov byte ptr [si+1], 24h
mov dx, offset CHARS
mov ah, 9
int 21h

mov ah, 4ch
int 21h
code ends
end start追问

排序要用子程序实现,就是主程序里的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

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
方面的。
假设楼主规定的10位数,是在AX的低10位中。 80x86汇编语言程序如下:
start:
MOV BX, 0
MOV CX, 10
NEXT:
SHR AX, 1 ;AX右移一位,末位进入CF
JNB NNNN ;CF为0转移.
INC BX ;CF为1则加一.
NNNN:
LOOP NEXT ;CX减一,非零转移.
MOV CX, BX ;把统计个数,送到题目指定的寄存器.
HLT ;停止.
END
----------
经过百度Hi交流,题目中,实际上是16位数字,不是10位数。
那么把:MOV CX, 10 中的10,改成16即可。本回答被提问者采纳
第2个回答  2011-04-18
;用MASM5.0编译通过,以下是运行结果
;E:\masm1> t0418
;sdgdfhfd
;
;Before sort:sdgdfhfd
;After sort :dddffghs

DATA SEGMENT
msg1 db 0dh,0ah,'Before sort:$'
crlf db 0dh,0ah,'$'
msg2 db 0dh,0ah,'After sort :$'
;buff db 16 dup (0)
BUFSIZE DB 50 ; 最多可键入50个字符
ACTLEN DB ? ;实际键入的字符数
CHARS DB 50 DUP(20H) ;实际键入的字符从此开始存放
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
main proc far
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BUFSIZE ;键入缓冲区起始偏移地址送DX
MOV AH,0AH
INT 21H ; 输入字符串并送入缓冲区

call sort

MOV AH,4CH ;调用返回DOS功能
INT 21H ;返回DOS

main endp

;========================
sort proc near
mov dx,offset crlf
mov ah,9
int 21h

mov dx,offset msg1
mov ah,9
int 21h

mov ch,0
mov cl, ACTLEN

mov di,offset CHARS
n1:
mov dl,[di]
mov ah,2
int 21h
inc di
loop n1

mov dx,offset msg2
mov ah,9
int 21h

mov ch,0
mov cl, ACTLEN

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

mov byte ptr [si+1],24h
mov dx,offset CHARS
inc dx
mov ah,9
int 21h
ret

sort 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

相似回答