菜鸟问题 eip=00000000 如何解决?

qiuafa 2006-03-31 03:27:17
程序功能:把文件一的汉语英语句子先后顺序对调后写入文件二
BUG: 第一次运行到ReadSentence 的ret处后,出现异常,eip=00000000
请教大虾怎么回事?
原始:文件一内容

En

WW

目标:文件二内容
En

WW



.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\comdlg32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\comdlg32.lib

exitWhenError MACRO
inc eax
jz exit
dec eax
ENDM

.data
ofn OPENFILENAME <0> ;打开文件对话框要用到该结构
szFileName db 256 dup(0)
szFilterString db '文本文件(*.txt)',0,'*.txt',0,0 ;文件过滤器字符串
szMyTitle db '汉-英句子调换行顺序,*.txt->*.zzy-2.txt', 0
szSuffix db '.zzy-2.txt'

.data?
ver db ?
flag dd ?
t1 dd ?
hfile dd ?
hfile2 dd ?
fname2 db 256 dup(?)
fsize dd ?
t2 dd ?
pos1 dd ?
pos2 dd ?
pos3 dd ?
pos4 dd ?
.code
GetFileNameFromDialog proc
mov ofn.lStructSize,sizeof ofn ;结构的大小
mov ofn.lpstrFilter,offset szFilterString ;文件过滤器
mov ofn.lpstrFile,offset szFileName ;文件名的存放位置
mov ofn.nMaxFile,256 ;文件名的最大长度
mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_LONGNAMES
mov ofn.lpstrTitle,offset szMyTitle ;“打开”对话框的标题
invoke GetOpenFileName,addr ofn ;显示打开对话框
ret
GetFileNameFromDialog endp

ReadSentence proc ; arg1:DWORD, arg2:DWORD
mov flag, 0
mov pos1, 0
mov pos2, 0

invoke SetFilePointer, hfile, 0, 0, FILE_CURRENT
mov pos1, eax
;读取一个字符
readagain:

;是否读到结尾
invoke SetFilePointer, hfile, 0, 0, FILE_CURRENT
cmp eax, fsize
je readend

invoke ReadFile, hfile, offset ver, 1, offset t1, NULL
cmp eax, 1
jne readend

;忽略'\r','\n',' ',0~9
;isalpha:
cmp ver, 0Dh
je readagain
cmp ver, 0Ah
je readagain
cmp ver, 20h
je readagain
cmp ver, 30h
jb notspec
cmp ver, 39h
ja notspec
jmp readagain

notspec:
;判断ver是否为英文, IsDBCSLeadByte()=false 为英文
invoke IsDBCSLeadByte, ver
cmp eax, 0
je yingwen

;hanzi:
cmp flag, 1
je readagain
cmp flag, 0
jne readend
mov flag, 1
jmp readagain

yingwen:
cmp flag, 2
je readagain
cmp flag, 0
jne readend
mov flag, 2
jmp readagain

readend:
invoke SetFilePointer, hfile, -1, 0, FILE_CURRENT
mov pos2, eax
ret 0
ReadSentence endp

WriteSentence proc arg1:DWORD, arg2:DWORD
mov eax, arg1
mov ebx, arg2
cmp eax, 0
jb writeend
cmp eax, ebx
jbe writeend
invoke SetFilePointer, hfile, arg1, 0, FILE_BEGIN
mov ecx, arg2
sub ecx, arg1
writeagain:
invoke ReadFile, hfile, offset ver, 1, offset t1, NULL
invoke WriteFile, hfile2, offset ver, 1, offset t1, NULL
dec ecx
cmp ecx, 0
jne writeagain
writeend:
ret
WriteSentence endp

start:
call GetFileNameFromDialog
cmp eax, 0
je exit2

;打开文件
invoke CreateFile, offset szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hfile, eax
exitWhenError

invoke SetFilePointer, hfile, 0, 0, FILE_END
mov fsize, eax
invoke SetFilePointer, hfile, 0, 0, FILE_BEGIN

invoke lstrcpy, offset fname2, offset szFileName
invoke lstrcat, offset fname2, offset szSuffix
invoke CreateFile, offset fname2, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
mov hfile2, eax
exitWhenError

readwrite:
invoke ReadSentence
cmp flag, 0
je exit
cmp flag, 1
je rw1
cmp flag, 2
je rw2
jmp exit

rw1:
mov eax, pos1
mov ebx, pos2
mov pos3, eax
mov pos4, ebx
jmp readwrite
rw2:
invoke WriteSentence, pos1, pos2
invoke WriteSentence, pos3, pos4
invoke SetFilePointer, hfile, pos2, 0, FILE_BEGIN
jmp readwrite

exit:
;关闭文件
invoke CloseHandle, hfile
invoke CloseHandle, hfile2

exit2:
;退出
invoke ExitProcess, 0

end start

...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leomaxking 2006-04-03
  • 打赏
  • 举报
回复
顶个
qiuafa 2006-04-03
  • 打赏
  • 举报
回复
invoke 是只管调用而不必管堆栈吗?
为什么 invoke SetFilePointer, hfile, -1, 0, FILE_CURRENT 不用保存esp呢?
fhb13 2006-04-03
  • 打赏
  • 举报
回复
一楼的高手已经说了为什么,如下:

因为 ver 是字节变量,在 push byte 时导致堆栈指针平衡异常,所以最后 ret 时出错。
大熊猫侯佩 2006-03-31
  • 打赏
  • 举报
回复
you can do this:

...

mov tesp,esp

invoke IsDBCSLeadByte, ver

mov esp,tesp

...
大熊猫侯佩 2006-03-31
  • 打赏
  • 举报
回复
invoke IsDBCSLeadByte, ver

因为 ver 是字节变量,在 push byte 时导致堆栈指针平衡异常,所以最后 ret 时出错。
大熊猫侯佩 2006-03-31
  • 打赏
  • 举报
回复
try do this:

ReadSentence proc ; arg1:DWORD, arg2:DWORD
pushad

mov flag, 0
mov pos1, 0
mov pos2, 0

invoke SetFilePointer, hfile, 0, 0, FILE_CURRENT
mov pos1, eax
;读取一个字符
readagain:

;是否读到结尾
invoke SetFilePointer, hfile, 0, 0, FILE_CURRENT
cmp eax, fsize
je readend

invoke ReadFile, hfile, offset ver, 1, offset t1, NULL
cmp eax, 1
jne readend

;忽略'\r','\n',' ',0~9
;isalpha:
cmp ver, 0Dh
je readagain
cmp ver, 0Ah
je readagain
cmp ver, 20h
je readagain
cmp ver, 30h
jb notspec
cmp ver, 39h
ja notspec
jmp readagain

notspec:
;判断ver是否为英文, IsDBCSLeadByte()=false 为英文
invoke IsDBCSLeadByte, ver
cmp eax, 0
je yingwen

;hanzi:
cmp flag, 1
je readagain
cmp flag, 0
jne readend
mov flag, 1
jmp readagain

yingwen:
cmp flag, 2
je readagain
cmp flag, 0
jne readend
mov flag, 2
jmp readagain

readend:
invoke SetFilePointer, hfile, -1, 0, FILE_CURRENT
mov pos2, eax
popad
ret
ReadSentence endp

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧