當前位置:首頁 » 操作系統 » 源碼10H

源碼10H

發布時間: 2022-06-26 23:31:31

㈠ dos環境下繪圖

code segment
org 100h
assume cs:code
start:mov ax,0013h
int 10h
mov cx,50
mov al,3
mov dx,50
frow:mov ah,0ch
int 10h
inc dx
cmp dx,89
jnz frow
fline:mov ah,0ch
int 10h
inc cx
cmp cx,129
jnz fline
fsrow:mov ah,0ch
int 10h
dec dx
cmp dx,50
jnz fsrow
fsline:mov ah,0ch
int 10h
dec cx
cmp cx,50
jnz fsline
mov cx,90
mov al,10
srow:mov dx,70
sline:mov ah,0ch
int 10h
inc dx
cmp dx,109
jnz sline
inc cx
cmp cx,179
jnz srow
exit:mov ah,0
int 16h
mov ax,0003h
int 10h
mov ax,4c00h
int 21h
code ends
end start

這個是我在CSDN求到的源碼
繪圖要用到很多中斷,最好是下個int的手冊
推薦樓主去CSDN逛逛,高手很多的

㈡ 什麼是按位進行與運算

位運算是指按二進制進行的運算。在系統軟體中,常常需要處理二進制位的問題。c語言提供了6個位操作
運算符。這些運算符只能用於整型操作數,即只能用於帶符號或無符號的char,short,int與long類型。
C語言提供的位運算符列表:
運算符
含義
描述
&
按位與
如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0
|
按位或
兩個相應的二進制位中只要有一個為1,該位的結果值為1
^
按位異或
若參加運算的兩個二進制位值相同則為0,否則為1
~
取反
~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0
<<
左移
用來將一個數的各二進制位全部左移N位,右補0
>>
右移
將一個數的各二進制位右移N位,移到右端的低位被舍棄,對於無符號數,高位補0
1、「按位與」運算符(&)
按位與是指:參加運算的兩個數據,按二進制位進行「與」運算。如果兩個相應的二進制位都為1,
則該位的結果值為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。按位與其
實與邏輯上「與」的運算規則一致。邏輯上的「與」,要求運算數全真,結果才為真。若,true,B=true,則A∩B=true
例如:3&5
3的二進制編碼是11(2)。(為了區分十進制和其他進制,本文規定,凡是非十進制的數據均在數據後面加上括弧,括弧中註明其進制,二進制則標記為2)內存儲存數據的基本單位是位元組(Byte),一個位元組由8個位(bit)所組成。位是用以描述電腦數據量的最小單位。二進制系統中,每個0或1就是一個位。將11(2)補足成一個位元組,則是00000011(2)。5的二進制編碼是101(2),將其補足成一個位元組,則是00000101(2)按位與運算:
00000011(2)&00000101(2)&00000001(2)由此可知3&5=1
c語言代碼:
#include
<stdio.h>
main()
{
int
a=3;
int
b
=
5;
printf("%d",a&b);
}
按位與的用途:
(1)清零
若想對一個存儲單元清零,即使其全部二進制位為0,只要找一個二進制數,其中各個位符合一下條件:
原來的數中為1的位,新數中相應位為0。然後使二者進行&運算,即可達到清零目的。
例:原數為43,即00101011(2),另找一個數,設它為148,即10010100(2),將兩者按位與運算:
00101011(2)
&10010100(2)
00000000(2)
c語言源代碼:
#include
<stdio.h>
main()
{
int
a=43;
int
b
=
148;
printf("%d",a&b);
}
(2)取一個數中某些指定位
若有一個整數a(2byte),想要取其中的低位元組,只需要將a與8個1按位與即可。
a
00101100
10101100
b
00000000
11111111
c
00000000
10101100
(3)保留指定位:
與一個數進行「按位與」運算,此數在該位取1.
例如:有一數84,即01010100(2),想把其中從左邊算起的第3,4,5,7,8位保留下來,運算如下:
01010100(2)
&00111011(2)
00010000(2)
即:a=84,b=59
c=a&b=16
c語言源代碼:
#include
<stdio.h>
main()
{
int
a=84;
int
b
=
59;
printf("%d",a&b);
}

㈢ 匯編代碼實例

偽 指 令
偽指令是對匯編起某種控製作用的特殊命令,其格式與通常的操作指令一樣,並可加在匯編程序的任何地方,但它們並不產生機器指令。許多偽指令要求帶參數,這在定義偽指令時由「表達式」域指出,任何數值與表達式勻可以作為參數。不同匯編程序允許的偽指令並不相同,以下所述的偽指令僅適用於MASM51系統,但一些基本的偽指令在大部份匯編程序中都能使用,當使用其它的匯編程序版本時,只要注意一下它們之間的區別就可以了。MASM51中可用的偽指令有:ORG 設置程序起始地址END 標志源代碼結束EQU 定義常數SET 定義整型數DATA 給位元組類型符號定值BYTE 給位元組類型符號定值WROD 給字類型符號定值BIT 給位地址取名ALTNAME 用自定義名取代保留字DB 給一塊連續的存儲區裝載位元組型數據DW 給一塊連續的存儲區裝載字型數據DS 預留一個連續的存儲區或裝入指定位元組。INCLUDE 將一個源文件插入程序中TITLE 列表文件中加入標題行NOLIST 匯編時不產生列表文件NOCODE 條件匯編時,條件為假的不產生清單一、ORG 偽指令ORG用於為在它之後的程序設置地址值,它有一個參數,其格式為:ORG 表達式表達式可以是一個具體的數值,也可以包含變數名,如果包含變數名,則必須保證,當第一次遇到這條偽指令時,其中的變數必須已有定義(已有具體的數值),否則,無定義的值將由0替換,這將會造成錯誤。在列表文件中,由ORG定義的指令地址會被列印出來。ORG指令有什麼用途呢?指令被翻譯成機器碼後,將被存入系統的ROM中,一般情況下,機器碼總是一個接一個地放在存儲器中,但有一些代碼,其位置有特殊要求,典型的是五個中斷入口,它們必須被放在0003H,000BH,0013H,001BH和0023H的位置,否則就會出錯,如果我們編程時不作特殊處理,讓機器代碼一個接一個地生成,不能保證這些代碼正好處於這些規定的位置,執行就會出錯,這時就要用到ORG偽指令了。看如下例子:例:INT_0 EQU 1000HTIME_0 EQU 1010HINT_1 EQU 1020HTIME_1 EQU 1030HSERIAL EQU 1040HAJMP START ;跳轉到主程序起始點LJMP INT_0 ;外中斷0處理程序LJMP TIME_0 ;定時中斷0處理程序LJMP INT_1 ;外中斷1處理程序LJMP TIME_1 ;定時中斷1處理程序LJMP SERIAL ;串列口中斷程序START:NOPEND上面的程序經匯編後列表文件如下:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 108-26-96 1000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 1030H1040 = SERIAL EQU 1040H0000 0111 AJMP START ;跳轉到主程序起始點0002 021000 LJMP INT_0 ;外中斷0處理程序0005 021010 LJMP TIME_0 ;定時中斷0處理程序0008 021020 LJMP INT_1 ;外中斷1處理程序000B 021030 LJMP TIME_1 ;定時中斷1處理程序000E 021040 LJMP SERIAL ;串列口中斷程序START:0011 00 NOP0000 ENDThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-26-96;%T Symbol Name Type ValueINT_0 . . . . . . . . . . . . . I 1000INT_1 . . . . . . . . . . . . . I 1020SERIAL. . . . . . . . . . . . . I 1040START . . . . . . . . . . . . . L 0011TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以繪出代碼在ROM中的映象圖如下:代碼
01H
11H
02H
10H
00H
02H
10H
10H
02H
10H
20H

地址
00H
01H
02H
03H
04H
05H
06H
07H
08H
09H
0AH

代碼
02H
10H
30H
02H
10H
40H
00H





地址
0BH
0CH
0DH
0EH
0FH
10H
11H
12H
13H
14H
15
由上面的映象圖可知,在03H處的代碼為10H,而不是我們要的02H,所以外斷程序INT_0不能被正確執行,其它各中斷程序的情況同樣如此,如在0BH處,本來存放的應當是定時器0中斷程序,但按上述的映象圖,0BH處開始的3個代碼是:02H,10H,30H,這是定時器1的入口地址,所以,如果定時器0發生中斷,所執行的其實是定時器1的中斷程序,這當然不對。例2:INT_0 EQU 1000HTIME_0 EQU 1010HINT_1 EQU 1020HTIME_1 EQU 1030HSERIAL EQU 1040HAJMP START ;跳轉到主程序起始點ORG 0003HLJMP INT_0 ;外中斷0處理程序ORG 000BHLJMP TIME_0 ;定時中斷0處理程序ORG 0013HLJMP INT_1 ;外中斷1處理程序ORG 001BHLJMP TIME_1 ;定時中斷1處理程序ORG 0023HLJMP SERIAL ;串列口中斷程序START:NOPEND上面的程序經過匯編後列表文件如下:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 108-26-961000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 1030H1040 = SERIAL EQU 1040H0000 0126 AJMP START ;跳轉到主程序起始點0003 ORG 0003H0003 021000 LJMP INT_0 ;外中斷0處理程序000B ORG 000BH000B 021010 LJMP TIME_0 ;定時中斷0處理程序0013 ORG 0013H0013 021020 LJMP INT_1 ;外中斷1處理程序001B ORG 001BH001B 021030 LJMP TIME_1 ;定時中斷1處理程序0023 ORG 0023H0023 021040 LJMP SERIAL ;串列口中斷程序START:0026 00 NOP0000 ENDThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-26-96;%T Symbol Name Type ValueINT_0 . . . . . . . . . . . . . I 1000INT_1 . . . . . . . . . . . . . I 1020SERIAL. . . . . . . . . . . . . I 1040START . . . . . . . . . . . . . L 0026TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以繪出代碼在ROM中的映象圖如下:代碼
01H
11H

02H
10H
00H






地址
00H
01H
02H
03H
04H
05H
06H
07H
08H
09H
0AH

代碼
02H
10H
10H





02H
01H
20H

地址
0BH
0CH
0DH
0EH
0FH
10H
11H
12H
13H
14H
15H

代碼





02H
10H
30H




地址
16H
17H
18H
19H
1AH
1BH
1CH
1DH
1EH
1FH
20H

代碼


02H
10H
40H
00H






地址
21H
22H
23H
24H
25H
26H
27H
28H
29H
2AH
2BH
由映象圖可知,各中斷程序的代碼都在其規定地址處,一旦產生中斷即可執行相應的程序。至於圖中未填的部分(如02H),根據各編程器不同而不同,一般為FFH或00H。 二、END END語句標志源代碼的結束,匯編程序遇到END語句即停止運行。若沒有END語句,匯編將報錯。END語句有一個參數,可以是數值0,也可以是表達式,其格式是:標號: END 表達式它的值就是程序的地址並且作為一個特殊的記錄寫入HEX文件。若這個表達式省略,HEX文件中其值就是0。三、EQU EQU以及其它一些符號定義偽指令用來給程序中出現的一些符號賦值。對這些符號名的要求與其它符號相同,即長度不限,大小寫字母可互換並且必須以字母開頭。由等值指令定義的符號是匯編符號表的一部分。等值偽指令有兩種形式。一種用EQU,另一種用字元「=」即符號名 EQU 表達式符號名 = 表達式兩種形式的效果是一樣的。符號名在左邊,其對應的值在右邊。值可以是變元,其它的符號名或表達式。只要在兩遍掃描中求出表達式的值就行,否則引用該符號名時將報錯。當表達式的值是字元串時,只取後兩個字元。若串長為1,高位位元組被置0,符號名的值被列印在程序清單中。由等值偽指令定義的符號名不允許重名。如果經定義的符號名被重定義,則匯編將報出錯,並且這個符號名按新定義的處理,最好不要在程序中出現重名。例:0469= ABC EQU 469H0464= XY EQU ABC-502F0= JK = 7520754 XYJK = XY+JK在列表文件中最左邊的數字不是這些偽指令所在的地址而是通過匯編後賦給符號名的值。第一條符號名ABC被起來469H,第二條XY被賦於ABC-5,因此XY的值為469H-5=464H,JK的值為752(即2F0H),XYJK的值XY+JK=464H+2F0H=754H四、SET SET偽指令有些類似於等值偽指令,它定義了一個整數類型的符號名,它的格式為符號名 SET 表達式SET偽指令與等值偽指令的唯一區別在於SET偽指令所定義的符號名右以在程序中多次定義,而不報錯。例:002D= K57 SET 101101B8707= K57 SET 34567五、DATA與BYTE DATA與BYTE都是用來定義位元組類型的存儲單元,賦予位元組類型的存儲單元一個符號名,以便在程序中通過符號名來訪問這個存儲單元,以幫助對程序的理解。BYTE與DATE之間的區別類似於EQU和SET,BYTE偽指令不能定義重名。六、WORD WORD偽指令類似於DATE偽指令,只是WORD偽指令定義了一個字類型的符號名,其格式為:符號名 WORD 表達式0027= VAL31 WORD 390021= PAR7 WORD 21H一個字由2個位元組組成。當然,因為8051匯編語言集沒有字操作,所以程序執行時,只處理位元組。WROD偽指令僅僅允許用戶定義一個認為是字的存儲位置。七、BIT BIT偽指令定義了一個字位類型的符號名,其格式為:符號名 BIT 表達式這里表達式的值是一個位地址,這個偽指令有助於位的地址符號化。例:002F= LOG3 BIT 470014= Y731 BIT 14H八、ALTNAME 替換名(ALTNAME)偽指令提供用戶一種手段,以定義一個符號名來替換一個保留字,此後這個答名與被替換的保留字均可等效地用於程序中。任何保留類型的答名均可被替換。替換名偽指令格式為:ALTNAME 保留字,新名例:0002= ALTNAME R2 COUNT013A EA MOV A,R2013B E502 MOV A,COUNT九、DB DB偽指令用於定義一個連續的存儲區,給該存儲區的存儲單元賦值。該偽指令的參數即為存儲單元的值,在表達式中對變元個數沒有限制,只要此條偽指令能容納在源程序的一行內,其格式為:標號: DB 表達式只要表達式不是字元串,每一表達式值都被賦給一個位元組。計算表達式值時按16位處理,但其結果只取低8位,若多個表達式出現在一個DB偽指令中,它們必須以逗號分開。表達式中有字元串時,以單引號「'」作分隔符,每個字元佔一個位元組,字元串不加改變地被存在各位元組中,並不將小寫字母轉換成大寫字母。例如:DB 00H 01H 03H 46HDB 'This is a demo!'十、DW DW為以位元組為單元(十六位二進制)來給一個的存儲區賦值,其格式為:標號: DW 表達式例如:0000 3035 D46B DW 12341,54379,10110100101110B0004 2D2E0006 4344 4243 DW 'ABCD','BC','A'000A 0041000C 2868 02E8 DW 456*375h,83+295h,'YZ',72h-4560010 595A FEAA十一、DS DS為定義存儲內容的偽指令,用它定義一個存儲區,並用指定的參數填滿該存儲區。DS偽指令包含兩個變元,第一個變元定義了存儲區的長度的位元組數,在匯編時,匯編程序將跳過這些單元把其它指令匯編在這些位元組之後,因此在使用DS偽指令時第一個變元不可活力第二個變元表示在這些單元中真入什麼值,第二個變元可以活力活力時這些位元組將不處理。下例中0173處有一條DS 9,則空出9個位元組,下一第指令被匯編到017C處;在017C處空出1BH個單元,在這些位元組中被27H所填充。DS指令的格式如下:標號: DS 表達式1,表達式2表達式1定義了存儲區的長度(以位元組為單位)。這個變元不能省略。表達式2是可選擇的,它的值低8位用以填入所定義的存儲區。若省略則這部分存儲單元不處理。例:0000 04 INC A0001 DS 9000A 04 INC A000B DS 1BH,27H0026 04 INC A十二、INCLUDE INCLUDE偽指令用於鏈接源文件,即將一個源文件插入到另一個源文件中。它有一個參數,指出將要插入的文件名,該文件名中可包括驅動器名和路徑名。若文件沒有擴展名,則默認為是ASM。但待插入的文件必須是可以打開的。若文件打開操作失敗,則產生致命錯誤,匯編將停止運行。反之,匯編程序將文件內容讀入並按源代碼處理。當遇到文件結速符時,匯編程序返回到INCLUDE偽指令處繼續身下處理源程序。被插入的文件在程序清單中以「I」開頭。本宏匯編版本支持級嵌套,可在程序中用INCLUDE偽指令插入任意多個文件,但是,在一般情況下DOS允許打開的文件數量是有限的,如果用戶需要打開較多的文件,則必須在CONFIG.SYS文件中加入FILES=40或更多的值,若超過8級嵌套或打開的文件太多,則產生致命錯誤,匯編中止運行。INCLUDE偽指令提供了模塊化程序設計手段,在匯編程序處理主程序時,模塊被插入,盡管這不等價於鏈接和裝配可重定位的目標模塊,但它具有類似的功能,被插入的源文件中不應該包含END偽指令,否則,匯編就會提前停止運行,END偽指令只能出現在主程序中。此外,在主程序進行匯編前所有附加的源文件必須通過匯編,產生相應的HEX及LST文件,由於附加的文件沒有END偽指令,因此,附加文件匯編時,匯編程序將顯示:「沒有結束語句」的錯誤,但並不影響與主程序的鏈接。下面是一個使用INCLUDE偽指令的例子,其主程序的源文件MAIN.ASM為:;MAIN.ASMORG 27HSTART:CLR AMOV R3,AINCLUDE MOD1INC R5INCLUDE MOD2.ASMDEC R3END START主程序為帶有END偽指令的完整的源文件。程序中有兩INCLUDE偽指令,分別將兩附加的文件MOD1.ASM及MOD2.ASM鏈接到主程序中。以下是這兩個文件。;MOD1.ASMMOV R2,#31HMOV R5,#18H;MOD2.ASMMOV R6,#47HANL A,#07HMOV R1,A注意MOD1.ASM及MOD2.ASM均沒有END指令。在進行匯編時必須先對MOD1.ASM和MOD2.ASM進行匯編,然後在匯編MAIN.ASM,由於上兩個文件沒有END偽指令,所以在匯編時會出現錯誤提示,不用管它,繼續下面的工作,就可以得到正確的結果。以下是形成的列表文件:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1;MOD2.ASMMOV R6,#47HANL A,#07HMOV R1,A08-27-96;MAIN.ASM0027 ORG 27HSTART:0027 E4 CLR A0028 FB MOV R3,AI INCLUDE MOD1I ;MOD1.ASMI0029 7A31 MOV R2,#31HI002B 7D18 MOV R5,#18HI002D 0D INC R5I INCLUDE MOD2.ASMI ;MOD2.ASMI002E 7E47 MOV R6,#47HI0030 5407 ANL A,#07HI0032 F9 MOV R1,A0033 1B DEC R30027 END STARTThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-27-96;%T Symbol Name Type ValueSTART . . . . . . . . . . . . . L 0027;%Z00 Errors (0000)十三、TITL TITLE偽指令用於在列表文件頁頭建立一個標題,其格式為:$TITLE 標題行這里標量行就是將出現在頁頭的標量與通常的字元串定義不同。這里標量行不加引號。匯編從$TITLE之後的第一個可列印字元開始,到回車符之間的字元串作為標量標量的最大長度是60個字元,基標量行省略,則標題行為空行。若TITLE偽指令在一頁,它說明的標量行包含在本頁,否則,標題將出現在下頁頁頭。十四、PAGE PAGE偽指令用於形成新的一中定義一面的行數。其格式為:$PAGE 表達式若表達 式預設則開始新的一頁,若有表達式,則每頁行數重新定義。匯編開始時頁長為66行。一頁中除出頁外,剩餘55行用於列印源程序,這一格式適用於標准列印紙。如果變元值小於66,頁內可列印的源代碼行將相應減少。頁長最小值為12。若小於12時,每頁內除頁上只列印一行源程序。頁長變元是16位位元組,因而每頁最長可定義到65535行,這時分頁列印變為連續列印,在屏幕顯示程序清單或在捲筒紙上列印程序清單時,常常使用連續列印,如果在啟動匯編時用/N選項,頁長就是65535。十五、LIST與NOLIST 它們的格式為:$LIST$NOLISTLIST偽指令使匯編時主生程序清單,但即使不用該指令,匯編也會自動產生清單。但如果使用了NOLIST偽指令後需要繼續主生清單則必須使用LIST偽指令。NOLIST偽指令使匯編時不產生清單,所有包含此偽指令及在這條偽指令之後的語句都不進入列表文件。當不需要任何列表文件,並且不需要顯示程序清單時,可以在啟動匯編時不加.L附加項,且在源代碼的第一行加上NOLIST指令。使用NOLIST偽指令與附加項/L不同之處是NOLIST偽指令可加在源程序中,與LIST偽指令配合使用,使源程序中某些部分不產生清單。而不加附加項/L則不產生任何程序清單。不過,不管有無$NOLIST偽指令,程序在匯編時檢查到的錯誤都將在屏幕上顯示出錯的源代碼行及錯誤信息十六、NOCODE 其格式為 $NOCODENOCODE偽指令使得在匯編時,條件匯編程序結構中那些真值為假的條件不產生清單。有關條件匯編結構在下面介紹。如果沒有這條偽指令,匯編將主生所有條件下的清單,不論其真值是否為真。但是假的條件,不產生目標碼。而NOCODE偽指令使匯編清單中只列出那些由匯編程序用到的部分,因此,當使用NOCODE偽指令時,程序清單與源程序並非逐行對應。 本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/sunnf/archive/2008/10/23/3129370.aspx

㈣ 請看一看這個匯編程序有什麼問題

jmp [es:0000h]這句的問題吧,這是跳向es:0000h指向內存的值。

㈤ C++ int i[233];我直接這樣寫代表了什麼意思

C++ int i[233];直接這樣寫代表了,定義了一個整形的數組,共有233個整形元素,數組的名字叫做i。

㈥ 這個匯編語言源程序在RadASM為什麼不能運行

編譯選項有錯,這個IDE好像只是個殼,匯編器和連接器都要自己設吧,你編dos程序用/coff開關干什麼,8086匯編我感覺用記事本寫就足夠了,用不著整個ide什麼的

㈦ vbs 反編譯後怎麼查看源碼

這個好像有工具可以查看,我忘記叫什麼名了,不過只可惜在裡面看。有個像三角形的標志的。

熱點內容
伏吟的演算法 發布:2024-05-07 00:51:48 瀏覽:828
安卓手機上的照相鍵在哪裡 發布:2024-05-07 00:51:45 瀏覽:605
ftp如何刪除頑固文件 發布:2024-05-07 00:50:57 瀏覽:250
idea文件夾顯示 發布:2024-05-07 00:30:04 瀏覽:249
怎麼把ps存儲為ai 發布:2024-05-07 00:30:03 瀏覽:272
參數內存緩存 發布:2024-05-07 00:28:54 瀏覽:746
android狀態欄高度 發布:2024-05-07 00:24:42 瀏覽:241
資料庫主文件 發布:2024-05-07 00:14:41 瀏覽:608
木頭創意解壓 發布:2024-05-07 00:11:55 瀏覽:215
密碼都能設置什麼 發布:2024-05-07 00:02:30 瀏覽:741