DCU編程
1. 編程問題怎麼解決
你的第七行中的文件丟失。
2. 小弟在delphi6.0編程中出現[Fatal Error] Unit1.pas(9): File not found: 'RzTray.dcu'錯誤,如何解決,謝
這個沒有什麽好的辦法!!
1:如果這個只是一個form,就把它拿掉
2:重新創建這個文件
3. Delphi 7.0 編程
Save All,然後會出現提示框,要求項目文件和單元文件不要重名,再次打開時打開項目文件,dpr是項目文件後綴,pas是單元文件後綴,dfm是窗口文件後綴,dcu是中間編譯單元。
4. 用delphi7做編程時需要關閉瑞星殺毒軟體嗎
你的Delphi中毒了 一種叫Delphi夢魘的毒
Delphi夢魘」就開始檢驗系統中是否有Delphi環境。它通過循環檢測注冊表鍵值的方法查找dephi的安裝目錄,如果找到dephi這個冤大頭,就將惡意代碼前排插入SysConst.pas文件,這個文件編譯的時候,會生成SysConst.dcu,而這個文件會被添加到每個新的dephi工程中。
以下是解決的辦法
1、使用殺軟掃描所有的Delphi編寫的可執行文件並清除病毒。(或直接刪除所有Delphi編寫的可執行文件,包括從網上下載的)
2、將文件 %DelphiInstallPath%\Lib\SysConst.dcu 刪掉,然後執行步驟4 或 步驟5和6。
3、將文件 %DelphiInstallPath%\Lib\SysConst.bak 改名為 SysConst.dcu,結束。
4、調用 DCC32.exe 編譯出新的 SysConst.dcu ,編譯命令如下: %DelphiInstallPath%\bin\DCC32.exe "%DelphiInstallPath%\\Source\Rtl\Sys\SysConst.pas"
5、將新編譯的SysConst.dcu(在%DelphiInstallPath%\\Source\Rtl\Sys\目錄下)文件復制到 %DelphiInstallPath%\Lib\ 目錄,結束。
找個專殺殺一遍
5. 如何使用arm匯編指令實現結構化編程
ARM匯編程序特點:
l 所有運算處理都是發生通用寄存器(一般是R0~R14)的之中.所有存儲器空間(如C語言變數的本質就是一個存儲器空間上的幾個BYTE).的值的處理,都是要傳送到通用寄存器來完成.因此代碼中大量看到LDR,STR指令來傳送值.
l ARM匯編語句中.當前語句很多時候要隱含的使用上一句的執行結果.而且上一句的執行結果,是放在CPSR寄存器里,(比如說進位,為0,為負…)
CMP R0,R1
BNE NoMatch
比如上一句,BNE隱含的使用的上一句CMP執行結果.NE後綴表示使用Z標志位.兩句合起來的意思就是,如果R0,R1的值不相等,就跳轉到NoMatch處執行.
注意,PC=R15,CPSR=R16,
ARM偽指令不是必須的,但是一個完整沒有偽指令幾乎很難寫出來.
n 比如一個程序至少包含READONLY AREA和ENTRY,否則CPU都無法知道從哪裡開始運行
l ARM的屬於RISC,指令並不多,但是可以帶後綴表示擴展出不同用法,這里與X86匯編完全不同風格
n 如BNE實際上是B指令的變種,本質還同一類指令.只是多一個對CPSR的Z標志位的判斷。
ARM常用指令,偽指令
ARM常用指令並不太多,因此使用閱讀ARM匯編代碼,並不太困難.以下是使用頻率最高的指令和偽指令,並不是完整的指令集的教材。詳細指令參見參考資料。
l B,BL
l MOV,MVN
l LDR,STR
l ADD,SUB,ADC,SBC,MUL
l AND,ORR,XOR,TST,BIC
l CMP
l LDM/STM
l nop
1. 跳轉語句 B,BL
程序流程的跳轉,在 ARM 程序中有兩種方法可以實現程序流程的跳轉指令用於實現
l 使用專門的跳轉指令 B
l 直接向程序計數器PC 寫入跳轉地址值
n 這是幾乎是任何一種CPU必備的機器,PC表示CPU當前執行語句位置,改變PC的值,相當於實現程序跳轉
n 如實現類似C語言的Return 語句,就是用MOV PC,LR
n 這里可以在任意4G的空間進行跳轉
B指令(Branch)表示無條件跳轉.
B main ;跳轉到標號為main地代碼處
BL指令(Branch with Link)表示帶返回值的跳轉.
BL比B多做一步,在跳轉前,BL會把當前位置保存在R14(即LR寄存器),當跳轉代碼結束後,用MOV PC,LR指令跳回來,這實際上就是C語言執行函數的用法,
匯編里調子程序都用BL,執行完子函數後,可以用MOV PC,LR跳回來.
BL delay ;執行子函數或代碼段delay ,delay可以為C函數.
與MOV PC,XXX能在4G空間跳轉不同,B語句只能32M空間跳轉,(因為偏移量是一個有符號26bit的數值=32M)
2. 傳輸數據指令MOV,MVN
n MOV(MOVE)指令可完成從另一個寄存器、被移位的寄存器或將一個立即數載入到目的寄存器
MOV R0,R1 ; 把R1的值傳到R0
MOV R3,#3 ;把常數3傳給R3,MOV中用#表示常數,這個值不能超過
n MVN( MOVE Negative)取反後再傳值,比MOV多了一步取反
MVN R0, #0 ;把0取反(即-1)傳給R0
MVN R1,R2 ;把R2的值取反傳給R1
3. 載入/存儲指令,LDR,STR
n LDR,STR是用於寄存器和外部存儲器交換數據指令,注意與MOV的區別,後面只在寄存器或常數交換.
u LDR/STR可以採用多種定址方式,以下只舉出使用頻率最高幾種用法
n LDR(load)用於把一個32Bit的WORD數據從外部存儲空間裝入到寄存器中
LDR R0,[R1]; R1的值當成地址,再從這個地址裝入數據到R0 (R0=*R1)
LDR R1,=0x30008000 ; 把地址0x30008000的值裝入到R1中,LDR中用常數要用=打頭.(注意跟MOV的區別,MOV是#)
ldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
用位與的方法賦值
n STR(Store) 用於把一個寄存器的值存入外部存儲空間,是LDR的逆操作.
STR R0,[R1] ; 把R0的值,存入到R1對應地址空間上(*R1 = R0)
STR R0,=0x30008000 ;把R0中值存入到地址0x30008000
S2C2440的中CPU內核以外的模塊的控制寄存器空間也是屬於外部空間,所以也得用如下指令LDR R0,=GPFDAT
4. 算術運算指令,ADD/ADC,SUB/SBC ,MUL
n ADD加法指令
ADD R0,R1,R2; R0=R1+R2
ADD R0,R1,#3 ;R0=R1+3
n ADC帶進位加法指令,即除了加兩個數以外,還要把CPSR的C值也要帶進來
u 通常用於大數(超過32Bit整數)相加,這時單用ADD不能處理,必須折成兩步,其中一步用ADC.
u 以下是做64Bit的加法
ADDS R0,R1,R2; R0=R1+R2,ADDS中S表示把進位結果寫入CPSR
ADC R5,R3,R4 ;R5=R3+R4+C
n SUB減法指令
SUB R0,R1,R2; R0=R1-R2
SUB R0,R1,#3 ;R0=R1-3
n SBC帶進位減法指令,即除了加兩個數以外,還要把CPSR的C值也要帶進來,類似ADC
u 以下是做64Bit的減法
SUBS R0,R1,R2; R0=R1-R2,SUBS中S表示把進位結果寫入CPSR
SBC R5,R3,R4 ;R5=R3-R4-C
n MUL 乘法指令
MUL R0,R1,R2; R0=R1*R2
MUL R0,R1,#3 ;R0=R1*3
5. 位操作指令 AND,ORR, TST,BIC
n AND位與指令
AND R0,R1,R2; R0=R1 & R2
AND R0,R1,#0xFF ;R0=R1 & 0xFF
n ORR位或指令
ORR R0,R1,R2; R0=R1 | R2
ORR R0,R1,#0xFF ;R0=R1 | 0xFF
n TST測試某一位是否為1,並把結果寫入CPSR,供下一句使用
TST R1,#0xffe; 等同於if(R1 & 0xffe)
TST R1,#%1;測試最低位是否為1,%表示二進制
n BIC清位操作
BIC R0,R0,#0xF ; 等同於 R0 &=~(0xF)
BIC R0,R0,#%1011 ; 該指令清除 R0 中的位 0 1 3,其餘的位保持; %表示是二進制,0x表示十六進制
6. 比較指令 CMP
n CMP比較兩個操作數,並把結果存入CPSR供下一句語句使用
CMP R0,R1; 比較R0,R1
7. 多寄存器語句傳輸指令,LDM,STM
類似於一次傳一個BUFFER到寄存器當中,或反過來.後面一般要接一個地址改變方法
n LDM 從BUFFER傳數據多個寄存器傳輸數據到
LDMIA R0! ,{R3-R9} ;加R0指向的地址上連續空間的數據,保存到R3-R9當中,!表示R0值更新,IA後綴表示按WORD遞增
LDMFD SP!,{R0-R7,PC}^;恢復現場,異常處理返回,^表示不允許在用戶模式下使用。
n STM 從寄存器列表向存儲空間傳值。
STMIA R1!,{R3-R9} ;將R3-R9的數據存儲到R1指向的地址上,R1值更新。
STMFD SP!,{R0-R7,LR}; 現場保存,將R0~R7,LR入棧
stmfd sp!,{r8-r9} ,把SP寄存器對慶的地址的值存到R8,R9當中.!表示最後的值寫入SP中。Fd表示
8. ARM指令的變形
大部分指令後位可以接 與S兩個特殊位來表示,對CPSR特殊的一些判斷
S,表示當前指令執行後把結果改寫CPSR
subs,Adds
取決於具體條件,只有CPSR滿足指定條件時才指這一指令
BEQ 實際上B+ EQ的條件執行.
addne 表示ADD +NE 才開始加.
9. ARM指令的定址方式
定址方式是根據指令中給出的地址碼來定位真實的地址,ARM中有9種定址方法
l 寄存器定址
直接用寄存器編號來定址,最為常用
MOV R1,R2 ;R2->R1
l 立即數定址
即指令中的地址碼是操作數本身,可以立即取出使用,立即數前帶一個#表示,否則表示一個地址
SUBS R0,R0,#1 ;R0 -1 ->R0
注意與SUBS R0,R0,1區別
l 寄存器偏移定址
這是ARM特有的定址模式,當第2操作數是寄存器,在執行操作之前,可以做一次移位操作
MOV R0,R2,LSL #3 ;R2的邏輯左移3位,結果放入R0,即R0=R2*8
ANDS R1,R1,R2,LSL R3;RS的值左移R3位,然後和R1相與操作,結果放入R1
移位操作有LSL (邏輯左移),LSR(邏輯右移) ,ASR(算術右移),ROR(循環右移)RRX帶擴展的循環右移
l 寄存器間接定址
即寄存器中值是一個地址,用[]來取出定位到地址當中
LDR R2,[R0] ;把R0的值當成地址,取出相應值,賦給R2
l 基址定址
把寄存器的地址值加上一個偏移量
LDR R2,[R3,#0x0F]; R3中的值加上0x0F,從這個地址取出值賦給R@
l 相對定址
基址定址的變形,由PC寄存器提供基準地址,指令中地址段作為偏移量.兩者相加即是有效地址,以下是BL採用相對定址
BL NEXT
…
NEXT
…
MOV PC,LR ;從子程序返回
10. ADS ARM的偽指令
類似於C語言的宏,由匯編程序預處理.
l 符號定義指令
全局變數定義 GBLA ,GBLL,GBLS
局域變數定義 LCLA,LCLL,LCLS
變數賦值SETA,SETL,SETS
其中上述偽指令中,最後面的A表示給一個算術變數賦值,L表示用於給一個邏輯變數賦值,s表示給一個字元串賦值
GBLL codedbg; 聲明一個全局的邏輯變數
Codebg SETL {TRUE} ; 設置變數為{TRUE}
LCLA bitno; 聲明一個算術變數
Bitno SETA 8 ;設變數值為8
l 數據定義偽指令
n SPACE 定義一個內存空間,並用0初始化
{label } SPACE expr
DataBuf SPACE 100 ;定義100位元組長空間, unsigned char DataBuf[100];
n DCB 定義一個連續位元組內存空間,用偽指令的表達式expr來初始化.一般可以用定義數據表格,或文字字元串.(這時等同於SETS),用於初始二進制BUFFER
{label} DCB expr{,expr …}
Dest DCB -120,20,36,55 ;等同於 unsigned char Dest[]={-120,20,36,55};
n DCU定義的一段字的內存空間(DCB是位元組),並用後面表達式初始化
_RESET DCU Reset ; 等同於 DWORD _RESET[]={Reset};
n MAP定一個結構化內存,相當於定義一個C結構
n FILED 定義一個結構化內存的成員
MAP 0x00,R9 ; 定義內存表,地址為R9
Timer FIELD 4 ; 定義數據域Timer,長為4字
Attrib FIELD 4 ; 定義數據域Attrib,長為4字
String FILED 100 ; 定義數據域String ,長為100字
相當於C語言的定義:
struct {
DWORD Timer ;
DWORD Attrib ;
Char String[100];
} R9;
11. 雜項的偽指令
n 位元組對齊 ALIGN
ALIGN; 聲明4位元組對齊
n 定義一個數字常量定義 EQU
NAME EQU expr {type}
PLLCON EQU 0xE01FC080;定義PLLCON,類似於C的宏或C++的常量
n 包含文件 GET和INCLUDE
INCLUDE lpc2106.inc
n NOP 空指令
在匯編時會被ARM的空操作代替,比如MOV R0,R0,一般用於延時與佔位。
n 聲明一個外部符符號 IMPORT,EXTERN
IMPORT,EXTERN 向外部導入一個符號,一般是外部程序全局變數
n 條件編譯:[]。類似於C的#ifdef 之類定義。
格式 :[ 條件表達式
滿足條件分支
|
不滿足條件分支
]
示例1:
[ ENTRY_BUS_WIDTH=32 ;類似#if ENTRY_BUS_WIDTH=32
b ChangeBigEndian ;DCD 0xea000007
] ; 類似#endif
示例2: [ CLKDIV_VAL>1 ; 類似#if CLKDIV_VAL>1
bl MMU_SetAsyncBusMode
|;類似#else
bl MMU_SetFastBusMode ; default value.
]; 類似#endif
示例3 [ THUMBCODE 類似#ifdef THUMBCODE
bx lr
| ;類似#else
mov pc,lr
] ;類似#endif
n 段定義 AREA
n 指令集定義 CODE16和CODE32
指示是Thumb 指令集(壓縮指令集,每個指令16位)。還是普通32位指令集
n 匯編結束:END
n 程序入口ENTRY
6. 為什麼用delphi編程時老是報 main.dcu處有錯
看看你的環境。。
和你程序的輸出路徑。。。
問題可以的話。。說具體點。
7. 如何編程將word中的附件(嵌入式對象)保存到文件 有使用過word另存為docx格式,解壓再解析embeddings
1、不明白為什麼要解壓縮出來,也許LZ是希望提取Word中的各種「對象」吧
包括word、ppt、excel等,然後將提取的這些附件「另存為」一個一個單獨的文件,如果是這樣的話
那麼可以參考:向word插入一個已經存在的excel
objectoMissing=System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.Applicationword=
newMicrosoft.Office.Interop.Word.Application();//創建word對象
word.Visible=true;//顯示出來
Microsoft.Office.Interop.Word.Documentdcu=
word.Documents.Add(refoMissing,refoMissing,
refoMissing,refoMissing);//創建一個新的空文檔,格式為默認的
dcu.Activate();//激活當前文檔
objecttype=@"Excel.Sheet.12";//插入的excel格式,這里我用的是excel2010,所以是.12
objectfilename=@"C:list.xlsx";//插入的excel的位置
word.Selection.InlineShapes.AddOLEObject(
reftype,reffilename,refoMissing,refoMissing);//執行插入操作
那麼只需要進行相反的操作就可以了,所以這里的關鍵是獲取Document.InlineShapes集合對象,通過該對象識別插入的「對象」,然後再將這些對象轉換為合適的類型,通過SaveAs方法另存一下
2、將doc轉換為docx,原理類似,我的方法是在安裝了word2007(組件版本office12)的前提下,用C#打開文檔,然後利用SaveAs方法將其轉換為docx(2007)格式
8. delphi7編程的問題
untClassTeacher in 'untClassTeacher.pas',
untClassStudent in 'untClassStudent.pas';//注釋掉,不要放在系統單元調用處
ATeacher:TTeacher;
AStudent:TStudent;需要先添加引用
具體問題已實現,請參考您代碼
9. 我在學DELPHI的XML編程,請問少了MSXML2_TLB.DCU文件....
要在「對象」-〉「情況設置」中設置「dcu」的路徑