回 帖 发 新 帖 刷新版面

主题:TO QB45兄


可否帮我看一下,下面的问题:

http://www.hoker.org/bbs/viewthread.php?tid=236&extra=page%3D1

回复列表 (共4个回复)

沙发

[quote]
<求助>在QB中如何获得.EXE的本身文件名~


请问一下,在QB中如何获得.EXE的本身文件名~ 





 
就像C中的*argv?
/*int main (int argc, char *argv[])*/ 






C语言中的是这样没错,可我想要用的是QBASIC ...
我找了一本汇编在看,希望能找到答案 



以下的汇编代码要以实现,有人可以帮忙转为QB的吗?

cseg segment
     assume cs:cseg,ds:cseg
     org  100h
start: mov si,2ch
       lodsw
       mov ds,ax
       mov si,0
       push cs         ;exe格式需要这两句
       pop es          ;com格式 cs==ds==es 可以不要
       mov di, offset buf
       cld
loc_1: lodsb
       cmp al,0        ;0
       jnz loc_1

       lodsb
       cmp al,0        ;0
       jnz loc_1

       lodsb
       cmp al,1        ;1
       jnz loc_1

       lodsb           ;0
       
loc_2:lodsb           ;文件名开始
       cmp al,0
       jz disp_1
       
       stosb
       jmp loc_2
       
disp_1:push cs
       pop ds
       
       mov dx, offset buf
       mov ah,9
       int 21h         ;显示文件名
       
       mov ah,4ch
       int 21h         ;返回DOS
       
buf db 256 dup('$')

cseg ends
end start 

 [/quote]


我搞了一个,好象是程序的数据区,也没找到路径,不知为什么?
往高手指点??
下面是我的程序

DECLARE SUB absolute (var1%, var2%, var3%, var4%, var5%, var6%, var7%, var8%, var9%, offset%)


asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H56) 'PUSH SI------------------
asm$ = asm$ + CHR$(&H50) 'PUSH AX
     

asm$ = asm$ + CHR$(&HBE) + CHR$(&H2C)  'MOV SI,002C
asm$ = asm$ + CHR$(&HAD)  'LODSW


'asm$ = asm$ + CHR$(&H0E)'push cs   
'asm$ = asm$ + CHR$(&H1E)'push ds        
'asm$ = asm$ + CHR$(&H58)'pop ax    

  asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + CHR$(&H89) + CHR$(&H7)                           'MOV     [BX],AX

asm$ = asm$ + CHR$(&H58) 'POP AX
asm$ = asm$ + CHR$(&H5E) 'POP SI------------------
asm$ = asm$ + CHR$(&H5D) 'POP BP
'asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0) 'RETF 2
  asm$ = asm$ + CHR$(&HCA) + CHR$(&H12) + CHR$(&H0)              'RETF    0012



  DEF SEG = VARSEG(asm$)
  CALL absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, findnameoff%, 

SADD(asm$))
  DEF SEG

'
CLS


OPEN "data.txt" FOR OUTPUT AS #1

PRINT findnameoff%
DEF SEG = VARSEG(findnameoff%) '[color=FF0000]这里错了[/color]
DIM i AS INTEGER, temp AS INTEGER


i = 0
DO
  i = i + 1
  temp = PEEK(i): PRINT #1, CHR$(temp); 
  IF i > 5000 THEN GOTO end1
LOOP

end1:

DO
    '获取键盘按键
    k$ = INKEY$
LOOP UNTIL k$ = CHR$(27)

end

板凳

我修改了一下,在qb45中能找到了自己的路径
运行结果
-----------------------
D:\TDDOWN~1\QBASIC45\QB45.EXE
我换了一个目录的结果
-----------------------
E:\QB45.EXE


DECLARE SUB absolute (var1%, offset%)


asm$ = asm$ + CHR$(&H55) 'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5) 'MOV BP,SP
asm$ = asm$ + CHR$(&H56) 'PUSH SI------------------
asm$ = asm$ + CHR$(&H50) 'PUSH AX


asm$ = asm$ + CHR$(&HBE) + CHR$(&H2C)  'MOV SI,002C
asm$ = asm$ + CHR$(&HAD)  'LODSW


'asm$ = asm$ + CHR$(&H0E)'push cs
'asm$ = asm$ + CHR$(&H1E)'push ds
'asm$ = asm$ + CHR$(&H58)'pop ax

asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6)              'MOV     BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7)                           'MOV     [BX],AX

asm$ = asm$ + CHR$(&H58) 'POP AX
asm$ = asm$ + CHR$(&H5E) 'POP SI------------------
asm$ = asm$ + CHR$(&H5D) 'POP BP
'asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0) 'RETF 2
asm$ = asm$ + CHR$(&HCA) + CHR$(&H12) + CHR$(&H0)              'RETF    0012



DEF SEG = VARSEG(asm$)
CALL absolute(findnameoff%, SADD(asm$))
DEF SEG

'
CLS


OPEN "data.txt" FOR OUTPUT AS #1

findnameoff% = findnameoff%
DEF SEG = findnameoff%
DIM i AS INTEGER, temp AS INTEGER


i = 8000 '4000
DIM tempStr$
DO
  i = i + 1
  temp = PEEK(i)
  tempStr$ = tempStr$ + CHR$(temp)
  IF i > 9000 THEN GOTO end1
LOOP

end1:

'PRINT #1, tempStr$
PRINT #1, "-----------------------"
'0,0,?,5,0,0

i = 0
DIM pathStr$
DO WHILE i < LEN(tempStr$)
  i = i + 1
  i = INSTR(i, tempStr$, CHR$(4))
  IF i = 0 THEN EXIT DO
  ':print #1,i
  j = i + 1
  
  IF ASC(MID$(tempStr$, j, 1)) = 0 THEN
    j = j + 1
    
    
    IF ASC(MID$(tempStr$, j, 1)) = 0 THEN
      j = j + 1
      IF ASC(MID$(tempStr$, j, 1)) <> 0 THEN
        j = j + 1
        
        IF ASC(MID$(tempStr$, j, 1)) = 5 THEN
          j = j + 1
          
          
          IF ASC(MID$(tempStr$, j, 1)) = 0 THEN
            j = j + 1
            IF ASC(MID$(tempStr$, j, 1)) = 0 THEN
              DO
                j = j + 1
                
                IF ASC(MID$(tempStr$, j, 1)) = 0 THEN
                  EXIT DO
                ELSE
                  pathStr$ = pathStr$ + MID$(tempStr$, j, 1)
                END IF
              LOOP
            END IF
          END IF
        END IF
      END IF
      
    END IF
    
  END IF
LOOP

PRINT #1, pathStr$
PRINT pathStr$
END


3 楼


已经搞定了,没想到芦花兄弟还在帮忙试,感谢中
昨天,我已经完成了QBCH中文库的字库捆绑功能,有空看一下吧:

http://yxbasic.51.net/library/qbch.htm

4 楼

Basic没用了(只是当程序员没希望)
哪个企业老板会等你慢慢的编程
学好了QB就赶快转OOP吧,也可以转超OOP概念的JAVA
企业都是用的快速开发
用QB,不但自己不爽,老板也不爽

我来回复

您尚未登录,请登录后再回复。点此登录或注册