1. 匯編語言 怎麼辨別單位元組指令 雙位元組指令 三位元組指令
匯編語言是根據指令的類別和完成的功能來識別指令的單雙還是三位元組指令的,比如:
INC A;累加器加1,不會與任何其他操作數發生關系,所以是單位元組指令。
SJMP TTT;短轉移,因為TTT在正負127之內,不會超過一個位元組,所以是雙位元組指令。
LJMP TTT;長轉移,因為地址為十六位,所以是三位元組指令。
2. c語言中的SHORT是什麼意思
1、short和int等一樣,是C或C++的一種內部數據類型。用於表示有符號整數。不同的是,他們在內存中所佔的空間大小不同,short通常為int所佔一半,也有一些實現為和int一樣,但不會比int大。所佔內存空間不同,那麼可用表示的整數范圍也就不同。至於具體能表示什麼范圍,這個問題是體系結構和編譯環境相關的。
2、以下常式輸出各種整型類型的大小:
#include<iostream>
usingnamespacestd;
intmain()
{
cout<<sizeof(short)<<endl;
cout<<sizeof(int)<<endl;
cout<<sizeof(long)<<endl;
cout<<sizeof(__int64)<<endl;
}
在VC8上編譯運行結果是
2
4
4
8
也就是說short佔2位元組(byte),int和long一樣佔4位元組,__int64佔8位元組,佔位元組數越多,所能表示的數的范圍越大。
3. 為什麼單片機中CJNE,JNB,JB這幾條指令可實現的轉移范圍是負的128到127
單片機跳轉指令解析
控制轉移類指令
條件轉移指令Jcc根據指定的條件確定程序是否發生轉移。如果滿足條件則程序轉移到目標地址去執行程序;不滿足條件,則程序將順序執行下一條指令。
其通用格式為:
Jcc LABEL ;條件滿足,發生轉移:IP?IP+8位位移量
;否則,順序執行:IP?IP+2 其中,LABEL表示目標地址(8位位移量)。因為Jcc指令為2個位元組,所以順序執行就是指令偏移指針IP加2。條件轉移指令跳轉的目標地址只能用前面介紹的段內短距離跳轉(短轉移),即目標地址只能是在同一段內,且在當前IP地址-128~+127個單元的范圍之內。這種定址方式由於是相對於當前IP 的,所以被稱為相對定址方式。條件轉移指令不影響標志,但要利用標志。條件轉移指令Jcc中的cc表示利用標志判斷的條件,共16種。如下圖:
1、判斷單個標志位狀態
這組指令單獨判斷5個狀態標志之一,根據某一個狀態標志是0或1決定是否跳轉。
(1)JZ/JE和JNZ/JNE利用零標志ZF,判斷結果是否為零(或相等)
JE指令(相等時轉移)
JZ指令(等於0時轉移)
這是當ZF=1時轉移到目標地址的條件轉移指令的兩種助記符。這條指令既適用於判斷無符號數的相等,又適用於判斷帶符號數的相等。
JNE指令(不相等轉移)
JNZ指令(不等於0轉移)
這是當ZF=0時能轉移到目標地址的條件轉移指令的兩種助記符。這條指令也是既適用於判斷無符號數,又適用於判斷帶符號數。
(2)JS和JNS利用符號標志SF,判斷結果是正是負。
JS指令(為負轉移)——當滿足SF=1時,轉移到目標地址
JNS指令(為正轉移)——滿足SF=0時,轉移到目標地址
(3)JO和JNO利用溢出標志,判斷結果是否產生溢出
JO指令(溢出轉移)——OF=1時,轉移到目標地址 JNO指令(未溢出轉移)——OF=0時,轉移到目標地址
(4)JP/JPE和JNP/JPO利用奇偶標志PF,判斷結果中「1」的個數是偶是奇
JP/JPE指令(為偶轉移)——滿足PF=1時轉移 JNP/JPO指令(為奇轉移)——滿足PF=0時轉移 數據通訊為了可靠常要進行校驗。常用的校驗方法是奇偶校驗,即把字元ASCII碼的最高位用作校驗位,是包括校驗位在內的字元中為「1」的個數恆為奇數(奇校驗),或恆為偶數(偶校驗)。若採用奇校驗,在字元ASCII中為「1」的個數已為奇數時,則令其最高位為「0」;否則令最高位為「1」。
(5)JC/JB/JNAE和JNC/JNB/JAE,利用進位標志CF,判斷結果是否進位或借位,CF標志是比較常用的一個標志。 JC——滿足CF=1時轉移 JNC——滿足CF=0時轉移
JB(低於轉移) JNB(不低於轉移) JNAE(不高於等於轉移) JAE(高於等於轉移) 2、用於比較無符號數高低為區別有符號數的大小,無符號數的大小用高(Above)、低(Below)表示,它需要利用CF確定高低、利用ZF標志確定相等(Equal)。兩數的高低分成4種關系:低於(不高於等於)、不低於(高於等於)、低於等於(不高於)、不低於等於(高於);也就分別對應4條指令:JB(JNAE)、 JNB(JAE)、JBE(JNA)、JNBE(JA)。 JA/JNBE
JA即高於轉移,JNBE即不低於且不等於轉移,高於則沒有進位產生,即CF=0,不等於則ZF=0,所以這兩條指令滿足CF=0且ZF=0時轉移
JAE/JNB
高於或等於轉移/不低於轉移是當CF=0(高於就不產生進位)或ZF=1(等於)時轉移。
JB/JNAE
即低於/不高於且不等於轉移,是當CF=1(產生借位)且ZF=0(不相等)時轉移。
JBE/JNA
即低於或等於/不高於轉移,是當CF=1(借位產生)或ZF=1(相等)時轉移。
3、用於比較有符號數大小
判斷有符號數的大(Greater)、小(Less),需要組合OF、SF標志、並利用ZF標志確定相等與否。兩數的大小分成4種關系:小於(不大於等於)、不小於(大於或等於)、小於等於(不大於)、不小於等於(大於);也就分別對應4條指令:JL(JNGE)、JNL(JGE)、JLE(JNG)、 JNLE(JG)。
由上可見,條件轉移指令之前常有CMP、TEST、加減運算、邏輯運算等影響標志的指令,利用這些指令執行後的標志或其組合狀態形成條件。
JG/JNLE
大於/不小於且不等於轉移,是當標志SF與OF同號(即<SF異或OF>=0)且ZF=0時轉移
JGE/JNL大於或等於/不小於轉移,是當標志SF與OF同號(即<SF異或OF>=0)或ZF=0時轉移
JL/JNGL
小於/不大於也不等於時轉移,是當標志SF與OF異號(即<SF異或OF>=1)且ZF=0時轉移
JLE/LNG
小於或等於/不大於轉移,是當標志SF與OF異號(即<SF異或OF>=1)或ZF=1時轉移
4、判斷計數器CX是否為0
JCXZ LABEL ;CX=0,則轉移;否則順序執行
4. 本人編寫了一個簡單C程序,在VS2013軟體編譯運行,short本身佔2個位元組,卻%x列印出了一個32位數
%x對應的是int類型
所以 用%x默認會把參數轉為int
而-2轉為int, 值不變, 16進制值為0xfffffffe
unsigned short 賦值為-2的時候, 會根據-2的補碼,轉為對應的無符號值,也就是65534
用%x輸出時,還是轉為int 值還是65534, 所以會輸出fffe
5. 編譯器定義長整形佔4個位元組,短整型佔2個位元組有什麼用處體現在哪裡
可以容納的大小不同,4個位元組就是可以到2^32 - 1 , 2個位元組就只能到 2^16 - 1
6. 設相對定址的轉移指令佔2個位元組,第一個位元組為操作碼,第二個位元組是位移量(用補碼表示),每當CPU從
先取指令,每取一位元組,pc+1,轉移指令共兩位元組,取指後pc=300AH,轉移到300FH的位移量為05H(真值),補碼表示為0000 0101即05H(正數原碼補碼形式一致)
當前指令地址為300FH,要求轉移到3004H。取指令後,pc=3011H,位移量為-07H,補碼表示為1111 1001即F9H
答案我不確定,大體思想就醬
7. 51單片機的匯編指令中AJMP 和SJMP都是兩個位元組,都是兩個機器周期,它們有什麼區別呢
AJMP是短轉移指令。其轉移范圍為當前指令地址高5位相同的2K范圍。
SJMP為相對轉移指令。其轉移范圍為當前指令地址-128~+127范圍。
8. C語言高手快進來!!
C/C++中的基本類型,比如int所佔用的位元組數是不確定的,具體是和系統或編譯器實現相關的。比如32位系統就可能是int佔4個位元組,而16位系統int佔2個位元組
而java中由於跨平台的需要,所有基本類型都是定死的,比如int無論在哪都佔用4個位元組
9. 【計算機體系結構】什麼叫轉移指令(無條件轉移,條件轉移)
控制轉移指令通過改變CS:IP來控製程序的執行流程。這類指令包括無條件轉移指令、條件轉移指令、循環指令、子程序調用和返回指令以及中斷和中斷返回指令。
⑴無條件轉移
JMP跳轉
⑵條件轉移
JZ/JNZ結果為零/不為零則轉移
JS/JNS結果為負/為正則轉移
JO/JNO溢出/不溢出則轉移
JP/JNP奇偶位為1/為0則轉移
JB/JNB低於/不低於則轉移
JBE/JNBE低於等於/高於則轉移
JL/JNL小於/不小於則轉移
JLE/JNLE小於等於/大於則轉移
JCXZCX為零則轉移
⑶循環指令
LOOP循環
LOOPZ/LOOPE為零/相等時循環
LOOPNZ/LOOPNE不為零/不等時循環
⑷子程序調用與返回
CALL調用
RET返回
⑸中斷及中斷返回
INT中斷
INTO溢出則中斷
IRET中斷返回
程序中指令的執行順序是由CS:IP來決定的,程序轉移類指令可改變IP或CS、IP的內容,從而控制指令的執行順序,實現指令轉移、程序調用等功能。
1無條件轉移指令
JMP指令控製程序無條件地跳轉到目的單元,使用JMP指令可有三種格式:
⑴JMPSHORTlabel短轉移(shortjump)
⑵JMPNEARPTRlabel近轉移(nearjump)
●JMPlabel直接轉移(directjump)
●JMPreg寄存器間接轉移(registerindirectjump)
●JMPWORDPTROPR存儲器間接轉移(memoryindirectjump)
⑶JMPFARPTRlabel遠轉移(farjump)
短轉移的目標地址(或稱轉向地址)相對於當前IP值的位移量在-128至+127位元組之間,當前IP值是指JMP指令的下一條指令的地址(如圖3.11所示)。對短轉移JMP,機器指令的第一個位元組為操作碼EB,第二個位元組為位移量00~FF,這是一個帶符號的補碼數。轉向地址的計算方法為:(IP)當前+8位位移量。操作符SHORT指示匯編程序將JMP指令匯編成一個2位元組指令。
⑴JMPSHORTlabel短轉移(shortjump)
執行操作:(IP)←(IP)當前+8位位移量
短轉移示意圖
⑵JMPNEARPTRlabel近轉移(nearjump)
近轉移是JMP指令的預設格式,可以寫為"JMPlabel"。它可在當前代碼段內轉移,機器指令的操作碼是E9,位移量是16位的帶符號補碼數。指令中的轉向地址可以是直接定址方式、寄存器定址方式、寄存器間接方式和存儲器定址方式。
●JMPlabel直接轉移(directjump)
執行操作:(IP)←OFFSETlabel=(IP)當前+16位位移量
轉移的目標地址在指令中可直接使用符號地址,由於位移量為16位,它的轉移范圍應是-32768至+32767,也就是說,近轉移指令可以轉移到段內的任一個位置。
●JMPreg寄存器間接轉移(registerindirectjump)
執行操作:(IP)←(reg)
轉移的目標地址在寄存器中,例如指令"JMPBX"執行的結果,將BX的內容送給IP。
●JMPWORDPTROPR存儲器間接轉移(memoryindirectjump)
執行操作:(IP)←(PA+1,PA)
存儲器的物理地址PA由指令中的定址方式確定,JMP指令執行的結果,把PA單元的字內容送到IP寄存器中。例如"JMPWORDPTR[DI]",物理地址PA=(DS)×24+(DI),指令執行的結果是(IP)=(PA+1,PA)。
⑶JMPFARPTRlabel遠轉移(farjump)
執行操作:(IP)←label的段內偏移地址
(CS)←label所在段的段地址
遠轉移實現的是段間的跳轉,即從當前代碼段跳轉到另一個代碼段中,這意味著指令執行後,不僅要改變IP的值,CS也會得到一個新的段地址。在匯編指令中,遠轉移的目標地址也可以使用除立即定址方式外的任何定址方式來表示。
2條件轉移指令(conditionaljump)
條件轉移指令是在滿足了規定的條件後才控製程序轉移的一類指令,8086的條件轉移指令總結在表3.4中。
所有條件轉移指令都是短轉移指令,轉移的目標地址必須在當前IP地址的-128至+127位元組范圍之內,因此條件轉移指令是2位元組指令。
計算轉向地址的方法和無條件短轉移指令是一樣的,看例3.40的反匯編代碼。
例3.40程序中的"JNZAGAIN"匯編成"JNZ000D",000D是標號AGAIN的地址,指令"JNZ000D"的機器代碼是75FA,75是操作碼,FA是位移量。當CPU讀取JNZ指令後,IP寄存器自動加2(JNZ的指令長度)指向了下一條指令(MOV),此時IP的當前值是0013。計算轉向地址時,(IP)當前+位移量=0013+FA=0013+FFFA=000D,這正是AGAIN的偏移地址。實際上FA是-6的補碼,8位的FA與16位的0013相加時,FA符號擴展成為FFFA,相加的加結果為000D。
表3.4條件轉移指令分類 指令 轉移條件 說明
(Ⅰ) JZ/JE ZF=1 為零/相等,則轉移
JNZ/JNE ZF=0 不為零/不相等,則轉移
JS SF=1 為負,則轉移
JNS SF=0 為正,則轉移
JO OF=1 溢出,則轉移
JNO OF=0 不溢出,則轉移
JP PF=1 奇偶位為1,則轉移
JNP PF=0 奇偶位為0,則轉移
JC CF=1 進位位為1,則轉移
JNC CF=0 進位位為0,則轉移
(Ⅱ) JB/JNAE/JC CF=1 低於/不高於等於,則轉移
JNB/JAE/JNC CF=0 不低於/高於等於,則轉移
JBE/JNA (CFZF)=1 低於等於/不高於,則轉移
JNBE/JA (CFZF)=0 不低於等於/高於,則轉移
(Ⅲ) JL/JNGE (SFOF)=1 小於/不大於等於,則轉移
JNL/JGE (SFOF)=0 不小於/大於等於,則轉移
JLE/JNG ((SFOF)ZF)=1 小於等於/不大於,則轉移
JNLE/JG ((SFOF)ZF)=0 不小於等於/大於,則轉移
(Ⅳ) JCXZ (CX)=0 CX的內容為0,則轉移
注:(Ⅰ)根據條件碼的值轉移(Ⅱ)比較兩個無符號數,根據比較的結果轉移
(Ⅲ)比較兩個帶符號數,根據比較的結果轉移(Ⅳ)根據CX寄存器的值轉移
例
1050:0000B86610MOVAX,1040
1050:00038ED8MOVDS,AX
1050:0005B90500MOVCX,0005
1050:0008BB0000MOVBX,0000
1050:000D0207AGAIN:ADDAL,[BX]
1050:000F43INCBX
1050:001049DECCX
1050:001175FAJNZ000D
1050:0013A20500MOV[0005],AL
1050:0016B44CMOVAH,4C
1050:0018CD21INT21
例假設程序進行兩個帶符號數的比較,並根據比較結果轉移,其中(AL)=80H,(BL)=01,請指出下面兩組指令的轉向地址。
⑴CMPAL,BL⑵CMPAL,BL
JLXYJBXY
答:⑴轉向目標地址XY;⑵不能實現轉移。
執行CMP指令時,(AL)-(BL)=80-01=7F,條件碼設置為:SF=0,OF=1,CF=0。執行JL指令時,測試轉移條件:SFOF=01=1,說明滿足(AL)<(BL)的轉移條件,因此,(IP)←XY的偏移地址,程序即轉移到XY單元執行新的指令。
JB指令的轉移條件為CF=1,而CMP的執行結果使CF=0,所以不能引起轉移。
10. 設相對定址的轉移指令占兩個位元組
PC當前值為240,該指令取出後PC值為243,要求轉移到290,即相對位移量為290-243=47,轉換成補碼為2FH。由於數據在存儲器中採用以低位元組地址為字地址的存放方式,故該轉移指令的第二位元組為2FH,第三位元組為00H。