我需要写一个汇编程序,它会在数据txt文件中搜索一个字符串,并将其替换为第二个字符串。在结果txt文件中,我需要接收相同的txt文件,但字符串必须被替换。在我写的程序中,一切正常,直到TextManipulations部分,我不明白我应该做什么。
.MODEL small
.STACK 256
.DATA
help db "Hello,", 10, 13, "provide arguments like in the example: program.exe data.txt abcd EFG res.txt", 10, 13, "$"
FileProblem db "Provided file wasn't found.", 10, 13, "Provide arguments like in the example: program.exe data.txt abcd EFG res.txt", 10, 13, "$"
input db 255 dup(0)
inputFD dw, ?
string1 db 255 dup(0)
string2 db 255 dup(0)
output db 255 dup(0)
outputFD dw, ?
buffer db 50000 dup(?)
tempBuf db 255 dup(?)
.CODE
Start:
mov ax, @data
mov ds, ax
xor cx, cx
xor ah, ah
mov cl, [es:0080h]
cmp cx, 4
jbe Helpmsg
jne SkipHelp
SkipHelp:
xor di, di
mov bx, 82h
mov si, offset input
call SaveArgument
mov si, offset string1
call SaveArgument
mov si, offset string2
call SaveArgument
mov si, offset output
call SaveArgument
xor ax, ax
mov ah, 3Dh
mov al, 00
mov dx, offset input
int 21h
jc MissingFile
mov inputFD, ax
mov ah, 3Fh
mov bx, inputFD
mov cx, 200
mov dx, offset buffer
int 21h
mov ah, 3Ch
mov cx, 0
mov dx, offset output
int 21h
mov outputFD, ax
call TextManipulations
mov ah, 3Eh
mov bx, outputFD
int 21h
Final:
mov ah, 4Ch
int 21h
Helpmsg:
mov ah, 09h
mov dx, offset help
int 21h
JMP Final
MissingFile:
mov ah, 09h
mov dx, offset FileProblem
int 21h
jmp Final
SaveArgument PROC
Begin:
mov dx, [es:bx]
inc bx
cmp dl, 20h
je StopSpace
cmp dl, 13
je StopEnter
mov byte ptr [si], dl
inc si
jmp Begin
StopSpace:
inc di
ret
StopEnter:
cmp di, 3
jb Helpme
ret
Helpme:
mov ah, 09h
mov dx, offset help
int 21h
mov ah, 4Ch
int 21h
ret
SaveArgument ENDP
TextManipulations PROC
mov si, offset buffer
mov di, offset string1
xor cx, cx
push cx
Read:
mov ah, 3Fh
mov bx, inputFD
mov cx, 1
mov dx, si
int 21h
cmp byte ptr [si], 0
je Return
mov al, byte ptr [si]
mov ah, byte ptr [di]
cmp al, ah
je CheckForString
mov al, 0
mov ah, 40h
mov bx, outputFD
mov dx, offset tempBuf
mov cx, 1
int 21h
mov cx, 1
mov dx, si
int 21h
inc si
mov di, offset string1
pop cx
xor cx, cx
push cx
jmp Read
CheckForString:
pop cx
inc cx
inc di
cmp byte ptr [di], 0
je PrintString
push di
mov di, offset tempBuf
mov byte ptr [di], al
pop di
inc si
push cx
jmp Read
PrintString:
pop cx
mov ah, 40h
mov bx, outputFD
mov cx, 1
mov dx, offset string2
int 21h
inc si
xor cx, cx
push cx
jmp Read
Return:
ret
TextManipulations ENDP
END Start
字符串
我已经尝试了很多不同的方法来比较和改变这些字符串,但是每次它是两个中的一个,它改变了字符串,但没有打印所有的符号或不完全工作。
1条答案
按热度按时间ux6nzvsh1#
更新:
好吧,我写了这个proc
TextManipulations
。我认为它是工作。正确的值是在缓冲区,但问题是这一部分:字符串
filesize
是从文件data.txt
读取的字节数。字符串操作程序后,应使用ah = 40h, int 21h
从缓冲区写入相同数量的字节到文件res.txt
。编译器显示所有寄存器中的良好值,但在int 21 h后,res.txt慡硡䙅G扸扢
中出现随机字符。如果程序写入超过9个字节,则在文件res.txt中存在随机字符。如果小于或等于9,则文件包含良好值(12个中的9个)。
如果我将输出从文件更改为控制台
mov bx, 2
程序显示正确的字符串。我不知道该怎么做,所以我使用标准输出来显示最终结果。
第一个答案
我在调试器里检查过了。是的,问题出在
TextManipulations
里面。例如
data.txt
包含以下字符aaaxabcdxbbb
。buffer = aaaxabcdxbbb
string1 = abcd
第一次比较就OK了
型
CheckForString
将di
移动到string1
中的下一个位置。字符保存到tmpBuffer
,程序跳转到检查下一个字符。现在我们有
a
和b
,所以这是不匹配的。mov ah, 40h
从tmpBuffer
向res.txt
写入1个字符(cx = 1)。下一部分停止调试器,返回系统。
型
如果我把input改为
abaxabcdxbbb
,输出里面只有b
。字符总是存储在tmpBuffer
的同一个地方,因为di
总是等于offset tempBuf
。产品代码:
型