求一个简单的汇编程序,急需啊!!!

2024-12-05 06:20:06
推荐回答(3个)
回答1:

Code Segment
Assume CS:Code
Mov_Data_Block Proc far
; 这是一个段间调用子程序
; 功能:将源数据块复制到目的数据块
; 入口参数:SI=源数据块偏移地址,DI=目的数据块偏移地址,CX=数据块字节数
pushf ;入栈保存标志寄存器
push es ;入栈保存附加段段址
push si ;入栈保存源变址寄存器
push di ;入栈保存目的变址寄存器
push cx ;入栈保存计数寄存器
push ds
pop es ;假定源数据块与目的数据块在同一个段
cmp si,di ;源数据块偏移地址=目的数据块偏移地址?
jz @@Return ;相等,不复制,返回调用程序
cmp si,di ;源数据块偏移地址<目的数据块偏移地址?
jb @@Dec_Copy ;降序复制
cld ;变址寄存器递减
rep movsb ;升序复制
jmp @@Return
@@DEc_Copy: std ;变址寄存器递增
add si,cx
dec si
add di,cx
dec di
rep movsb ;降序复制
@@Return: pop cx
pop di
pop si
pop es
popf
ret
Mov_Data_Block EndP
Code Ends
END Mov_Data_Block ;编译到此结束

回答2:

;下面的偏移地址自己根据情况设置
DATA SEGMENT
SRC DW 1000H;源数据块偏移地址
DES DW 1010H;目的数据块偏移地址
COUNT DW 0020H;要移动的字节数
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX;假设两个数据块都在同一个段
MOV SI,SRC
MOV DI,DES
MOV CX,COUNT
CMP SI,DI
JE DONE;相等就不复制
JA L1
STD;SIADD SI,COUNT
DEC SI
ADD DI,COUNT
DEC DI
REP MOVSB
JMP DONE
L1:CLD;SI>DI就升序复制,设置DF=0
REP MOVSB
DONE:MOV AX,4C00H
INT 21H
CODE ENDS
END START

回答3:

;input code
data segment
SRC DB 'LINK:WARNING NO STACK SEGMENT',0
DST DB 100 DUP (0)
data ends
code segment
assume cs:code,ds:data
start:

;向栈中压入传入参数
MOV AX,DATA
PUSH AX
PUSH AX
;
MOV AX,OFFSET SRC
PUSH AX
MOV AX,OFFSET DST
PUSH AX
CALL MOVDATA

MOV AH,4CH
INT 21H
MOVDATA PROC
PUSH BP
MOV BP,SP
;
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH CX
PUSH AX
;从栈中取出参数
MOV AX,[BP+4]
MOV DI,AX
MOV AX,[BP+6]
MOV SI,AX
MOV AX,[BP+8]
MOV DS,AX
MOV ES,AX

PUSH SI
XCHG SI,DI
CLD
MOV AL,0
MOV CX,0FFFFH
REPNZ SCASB
NOT CX ;获取字符串的长度

XCHG SI,DI
POP SI
;
TEST SI,1
JZ PARITY

MOVSB
DEC CX
PARITY:
SHR CX,1
REP MOVSW
JCXZ OK
MOVSB
OK:
POP AX
POP CX
POP DI
POP SI
POP ES
POP DS
POP BP
RET 8
MOVDATA ENDP
code ends
end start