汇编语言问题,菜鸟请求高手

来源:百度知道 编辑:UC知道 时间:2024/06/06 19:07:48
DATA SEGMENT
BUF EQU 80
aa DB BUF
DB 0
DB BUF DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
LEA DX,AA
MOV AH,0aH
INT 21H
lea si,aa
add si,5
mov byte ptr [si],'$'
sub ch,ch
mov cl,aa+1
lea si,aa
mov word ptr [si], 0a0dh
add si, 2
add si, cx
mov byte ptr [si],'$'
mov ah,09h
int 21h
ret
MAIN endp
CODE ENDS
END MAIN

上面是代码,现在的问题是,想输出所有输入的字符串,但是现在只是输出前3个,高手指点,谢谢

dos功能调用9号功能:显示以ds:dx开始的字符串,当遇到一个$时,结束显示。楼主程序中,
lea si,aa
add si,5
mov byte ptr [si],'$'
把字符串中第4个字符改为:$,致使显示前3个字符之后,结束显示,这是导致“只是输出前3个”的症结所在。把这三条指令的后两条删掉即可。

下面,我就从lea si,aa 指令开始,直至显示完整字符串,给出优化的程序段,指令全部用大写字符。
LEA SI,aa
MOV CL,[SI+1]
XOR CH,CH
MOV WORD PTR [SI],0D0AH
ADD SI,CX
INC SI
INC SI
MOV BYTE PTR [SI],'$'
MOV AH,9
INT 21H

DATA SEGMENT
Str db 'Please Input a string: $'
BUF db 80,0,80 dup(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
start:
mov ax,data
mov ds,ax
lea dx,Str
mov ah,9
int 21h
call CRLF
LEA DX,BUF
MOV AH,0aH
INT 21H
call CRLF
lea si,BUF
cld
mov cl,[si+1]
mov ch,0
or cx,cx
jz exit
add si,2
lop:lodsb
mov ah,0eh
int 10h
loop lop
exit:
MOV AH,0
int 16H
mov ah,4ch
int 21h

CRLF: