匯編語言基本概念匯總


      匯編語言應該是我們如今學的最“低級”的語言了,由於如今不會再有人去學機器語言了。

而匯編語言還在一些硬件或者嵌入式設備上使用並開發着。

下面資料是為了大學的匯編考試整理的資料,如今與大家分享,希望能給大家提供幫助。

匯編語言程序設計匯總

計算機主要由運算器、控制器、存儲器和輸入輸出設備五大部件構成。
字長word是指微處理器內部一次能夠並行處理二進制代碼的位數。它與微處理器內部寄存器以及CPU內部數據總線寬度是一致的,字長越長,所表示的數據精度就越高。
內存是由若干個存儲單元組成,每一個單元分配一個固定的地址而且存放一個字節的數據。
MIPS Millions of Instruction Per Second   每秒百萬條指令
微機系統採用了多種系統總線標准。如ISA/EISA/VESA/PCI
系統總線分為數據總線、地址總線、控制總線。
Data Bus: DB
Address Bus: AB
討論存儲器容量時。以2的10次方即1024為基本單元。稱為1K。1024K就是1M。
Control Bus : CB
CPU主頻越高,其運算速度就越快。

字長代表了CPU對數據處理的能力和精度。
OS的主要部分是常駐監督程序Monitor,僅僅要一開機就存在於內存中,能夠從用戶接收命令,並使OS運行對應的動作。
匯編語言和機器語言一一相應。


匯編程序就是用來把由用戶編制的匯編程序翻譯成機器語言程序的一種系統程序。


高級語言的翻譯程序有兩種:
一種是先把高級語言程序翻譯成機器語言,(或先翻譯成匯編語言,然后又匯編程序再次翻譯成機器語言)然后才干在機器上運行。——編譯程序
直接把高級語言程序在機器上執行,一邊解釋一邊執行。

——解釋程序
翻譯程序包含匯編程序、解釋程序、編譯程序。


ALU :算術邏輯運算單元:用來進行算術和邏輯運算及其對應操作。
8086 CPU內部結構按功能分為:
總線接口單元 BIU:Bus Interface Unit
運行單元 EU: Executive Unit
8086對存儲器和IO設備的全部操作都是由BIU完畢的。


8086CPU的20位地址線可直接尋址1M存儲器物理空間。但CPU內部寄存器均為16位的寄存器,16位寄存器怎樣實現20位地址尋址呢?
CPU是將有關寄存器內容左移4位,然后由專門地址加法器,與16位偏移地址相加。形成20位的物理地址。以便找到存儲單元。
指令指針 IP : Instruction Pointer
IP 用來存放下一條要運行指令在代碼中的偏移地址。


IP的內容由BIU自己主動改動。使它總是指向下一條要取的指令在現行代碼段中的偏移地址。


因為BIU和EU是各自獨立並行工作的。在EU運行指令的同一時候,BIU可預取以下一條或幾條指令。
Flags:反映CPU運算中的狀態特征和存放某些控制標志。
通用寄存器組:
包含4個16位的數據寄存器:AX/BX/CX/DX
和4個16位指針與變址寄存器:SP/BP/SI/DI
8086CPU的外部數據總線和內部數據總線都是16位的,是真正的16位機。
寄存器能夠分為程序可見寄存器和程序不可見寄存器。
程序可見寄存器是指在匯編語言程序設計中用到的寄存器。能夠由指令來指定。


程序不可見寄存器指一般程序設計中不用而由系統所用的寄存器。


程序可見寄存器能夠分為通用寄存器、專用寄存器和段寄存器。
AX/BX/CX/DX是數據寄存器。用來臨時存放計算過程中用到的操作數,結果或其它信息。能夠以字(16位),或字節(8位)形式訪問。都是通用寄存器。但又有各自專用的功能。
AX: Accumulator。做累加器用。是算術運算的主要寄存器。
BX: Base,做通用寄存器使。在計算存儲器地址時,經常使用作基址寄存器。
CX:Count,作為通用寄存器使用。經常使用來保存計數值。如在移位指令、循環和串處理指令中作隱含的計數器。


DX:Data:可做通用寄存器使用,在做雙字長運算時把DX和AX組合在一起存放一個雙字長數。DX存放高位字。
SP/BP/SI/DI四個16位寄存器能夠像數據寄存器一樣在運算中存放操作數。但僅僅能以字(16位)為單位使用。
一般用在存儲器尋址時,提供偏移地址。


SP:Stack Pointer:棧指針寄存器,用來指示棧頂的偏移地址。
BP:Base Pointer:基址指針寄存器。
SI:Source Index:源變址寄存器
DI: Destination Index:目的變址寄存器
CS:段寄存器
IP:Instruction Pointer 是指令指針寄存器。用來存放代碼段中的偏移地址。

在程序執行中,始終指向下一條指令的首地址。與CS連用確定下一條指令的物理地址。


Flags是標志寄存器,又稱程序狀態字寄存器PSW   Program Status Word
條件碼標志記錄程序中執行結果的狀態信息,是依據有關指令的執行結果由CPU自己主動設置的。這些狀態信息作為興許條件轉移指令的轉移控制條件。所以稱為條件碼。
OF: Overflow Flag 溢出標志
SF: Sign Flag  符號標志
ZF: Zero flag  零標志
CF: Carry Flag   進位標志
AF: Auxiliary Carry Flag   輔助進位標志
PF: Parity Flag    奇偶標志
DF :Direction Flag    方向標志
IF: Interrupt Flag  中斷標志
段寄存器也是一種專用寄存器。專用於存儲器尋址,用來直接或間接存放段地址。
CS: Code Segment   代碼段寄存器
DS: Data Segment   數據段寄存器
SS: Stack Segment   堆棧段寄存器
ES: Extra Segment   附加段寄存器

一個存儲單元中存放的信息稱為該存儲單元的內容。


在存儲單元里以字節為單位存儲信息。
假設機器字長為8位時,則地址為0004H單元中存放的信息為78H。也就是說,該單元的內容為78H。(0004H)=78H
一個字存入存儲器要占有連續的兩個字節單元。存放時低位字節存入低地址,高位字節存入高地址。這樣兩個字節單元就構成了一個字單元。

            字單元的地址用它的低地址表示。

(0004H)=5678H
雙字單元的存放方式與字單元類似,他被存放在相繼的4個字節中,低位字存入低地址區,高位字存入高地址區。

雙字單元的地址有其最低字節的地址指定。

(0004H)=12345678H。
1字=2字節
同一個地址既能夠作為字節單元的地址,又可看做字單元,雙字單元或四字單元的地址。
假設用X表示某存儲單元的地址,則X單元的內容能夠表示為(X);假如X單元中存放着Y,而Y又是一個地址,則可用(Y)=((X))表示Y單元的內容。



eg:(0004H)=5678H,5678H又是一個存儲單元地址。(5678H)=2F1EH。2F1EH才是真正的內容。
即((0004H))=2F1EH。

在1M的存儲器里,每個存儲單元都有一個唯一的20位地址,稱為該存儲單元的物理地址。
段地址是指每一段的起始地址(又稱段基地址),因為他必須是段的首地址,所以低四位一定是0。能夠規定段地址僅僅取段起始地址的高16位值。


偏移地址指在段內相對於段起始地址的偏移值。
把段地址左移四位再加上偏移地址就形成物理地址。
物理地址=段地址*16D+偏移地址
等價於
物理地址=段地址*10H+偏移地址
專門存放段地址的寄存器。稱為段寄存器。
CS:代碼段
DS:數據段
SS:堆棧段
ES:附加段
每一個段寄存器能夠確定一個段的起始地址。
MOV AX,ES:[BX]
ES作段寄存器,BX作間接寄存器尋址的單元送入AX寄存器。
MOV BX,ES:[SI]
ES作段寄存器,SI作間址寄存器的尋址單元內容送入BX寄存器。


MOV EAX,DS:[BP]
DS作段寄存器,BP作間址寄存器尋址的單元內容送入EAX寄存器。
一個計算機的指令集合。就是該計算機的指令系統。


每條指令有兩部分組成,操作碼字段和地址碼字段。
操作碼字段:說明該指令所要完畢的操作,即該條指令的性質。
地址碼字段:描寫敘述該指令的操作對象。


一般地址碼字段通常是直接給出操作數;或者給出操作數存放的寄存器編號;或者給出操作數存放的存儲單元的地址或有關的地址的信息。
依據地址碼字段所給出的地址的個數,指令格式可分為零地址、一地址、二地址、三地址、多地址指令。
指令中用於確定操作數存放地址的方法,稱為尋址方式。
假設地址碼字段直接給出了操作數。這樣的尋址方式是馬上尋址。
假設地址碼字段指出了操作數所在的寄存器編號,叫寄存器尋址。
假設操作數存放在存儲器中。則地址碼字段通過各種方式給出了存儲器地址。叫存儲器尋址。
尋找和獲得操作數或操作數存放地址或指令轉移地址的方法稱為尋址方式。
操作數及操作結果存放的地址有三處:存放在指令的地址碼字段中。存放在寄存器中;存放在存儲器的數據段(DS)、堆棧段(SS)或附加數據段(ES)中。


其相應有三種操作數:馬上操作數、寄存器操作數、存儲器操作數
要尋找這些操作數就有三種基本尋址方式:馬上尋址方式、寄存器尋址方式、存儲器尋址方式。
馬上尋址方式尋找的操作數緊跟在指令操作碼之后。
格式:操作碼 數字表達式
MOV AX,267
MOV AL,10010011B AND 0FEH
MOV AL,PORT1
MOV AX,DATA1
“267”是數字。“10010011B AND 0FEH”是數字表達式,PORT1是一個符號名。屬於常數。DATA1是定義的段名。就是段地址,屬於常數。


匯編馬上尋址方式時,匯編程序首先計算數字表達式的值,然后寫入指令的地址碼字段,稱為馬上數。


寄存器尋址是指要尋找的操作數在某個寄存器中。
格式:操作碼 寄存器名
MOV AX,BX
MOV AL,BL
匯編程序將寄存器的地址編號寫入指令的地址碼字段,當機器運行含有這樣的尋址方式的指令時,依據地址碼字段的編號訪問到寄存器。繼而訪問到操作數。
存儲器尋址方式:當操作數放在存儲器中的某個單元時,CPU要訪問存儲器才干獲得該操作數。假設存儲器的存儲單元是20位,通過各種方法算出段內偏移地址(有效地址)。結合段地址形成20位物理地址,找到操作數,稱為存儲器尋址。


直接尋址方式是指要尋找的操作數的地址在指令中直接給出。
格式:
操作碼 地址表達式
操作碼 [地址表達式]
操作碼 [數字表達式]

如:如果TABLE是在數據段定義的一個字節數組的首地址標號,偏移地址為1000H
MOV AL,TABLE
MOV AL,[TABLE]
MOV AL,[1000H]
是等價的。
直接尋址方式默認的段地址是DS。


若同意在匯編指令中指定除DS寄存器以外的段寄存器作為操作數的段地址。這就是段超越。
用段超越前綴表示:
段寄存器名:地址表達式
段寄存器名:[地址表達式]
段寄存器名:數字表達式
段寄存器名:[數字表達式]
如:
設TABLE是在附加數據段定義的一個字節數組的首地址標號,其偏移地址為1000H。則
MOV AL,ES:TABLE
MOV AL,ES:[TABLE]
MOV AL,ES:1000H
MOV AL,ES:[1000H]
表示將字節數組的第一個數組元素送入AL寄存器中。


寄存器間接尋址方式:通常將BX,BP稱為基址寄存器,SI,DI稱為變址寄存器,尋址時操作數的地址被放在這些寄存器中。
格式:
操作碼 [基址寄存器名或變址寄存器名]
MOV AX,[BX]
MOV AX,[SI]
也同意指定段超越前綴來取得其它段中的數據:
MOV AX,ES:[BX]
寄存器相對尋址:
操作數的偏移地址是指定寄存器的值與一個整數之和。


格式:
操作碼 變量名[機制寄存器名或變址寄存器名]
操作碼 [變量名+基址寄存器名或變址寄存器名]
操作碼 符號名[機制寄存器名或變址寄存器名]
操作碼 [符號名+基址寄存器名或變址寄存器名]
操作碼 機制寄存器名或變址寄存器名+/-數字表達式
如:
MOV SI,5
MOV AL,TABLE[SI]   == MOV AL,[TABLE+SI]

基址變址尋址方式:操作數的偏移地址是兩個指定寄存器的值之和。


格式:
操作碼 [基址寄存器名][變址寄存器名]
操作碼 [基址寄存器名+變址寄存器名]
如:
MOV AX,[BX][SI]
MOV AX,[BX+SI]
當機器運行含有這樣的尋址方式的指令時,根據地址碼字段的值得到基址寄存器和變址寄存器的值,將其相加。和作為操作數的偏移地址。

能夠用段超越前綴又一次指定段寄存器:
MOV AL,ES:[BX][SI]
相對基址變址尋址:操作數偏移地址是指定寄存器的值與相對偏移量之和。


MOV AL,TABLE[BX][SI]
MOV AL,TABLE[BX+SI]
MOV AL,[TABLE+BX+SI]
格式:
操作碼 變量名[基址寄存器名][變址寄存器名]
操作碼 變量名[基址寄存器名+變址寄存器名]
操作碼 [變量名+基址寄存器名+變址寄存器名]
符號名 變量名[基址寄存器名][變址寄存器名]
符號名 變量名[基址寄存器名+變址寄存器名]
符號名 [變量名+基址寄存器名+變址寄存器名]
操作碼 [基址寄存器名+變址寄存器名+/-數字表達式]

四類傳送指令:通用傳送指令、累加器專用傳送指令、地址傳送指令、標志傳送指令
DST:目的操作數
SRC:源操作數
REG:寄存器
SEGREG:段寄存器
MEM:存儲器
DATA:馬上數
PUSHF:標志入棧指令
POPF:標志出棧指令
XCHG:交換指令
MOV:可實現寄存器之間、寄存器和存儲器之間傳送數據,還可實現馬上數送寄存器或存儲單元的操作。
MOV:原操作數與目的操作數不能同一時候為存儲器尋址方式,即兩個內存單元之間不能直接傳送指令。
MOV:兩個段寄存器之間不同意直接傳送數據。


把CPU內部的寄存器細分為段寄存器和寄存器。

MOV有9種指令。
MOV的9種傳送方式:
從寄存器到寄存器
MOV REG1,REG2
如:
MOV AX,BX
MOV AH,CL
MOV BX,SI
MOV DI,DX

從寄存器到段寄存器
MOV SEGREG1,REG
如:
MOV DS,AX
MOV ES,DX
MOV SS,DI

從寄存器到存儲器
MOV MEM,REG
MEN指下面五種存儲器尋址方式:直接、寄存器間接、寄存器相對、基址變址、相對基址變址。


如:
TABLE是定義的字變量
MOV TABLE,AX
MOV [BX],BX
MOV TABLE[BX],CX
MOV [BX][SI],DX
MOV TABLE[BX][SI],AX

從段寄存器到寄存器
MOV REG,SEGREG
格式:
MOV AX,CS
MOV BX,ES
MOV DI,SS
MOV SI,DS

從存儲器到寄存器
MOV REG,MEM
格式:
MOV AX,TABLE
MOV BX,[BX]
MOV CX,TABLE[BX]
MOV DX,[BX][SI]
MOV AX,TABLE[BX][SI]

從段寄存器到存儲器
MOV MEM,SEGREG
格式:
MOV TABLE,CS
MOV [BX],ES
MOV TABLE[DI],SS
MOV [BX][SI],DS
MOV TABLE[BX][SI],ES

從存儲器到段寄存器
MOV SEGREG,MEM
格式:
MOV ES,[BX]
MOV SS,TABLE[DI]
MOV DS,[BX][SI]

從馬上數到寄存器
MOV REG,DATA
格式:
MOV AX,OOH
MOV BX,12H
MOV CX,34H
MOV SI,56H

從馬上數到存儲器
MOV MEM,DATA
格式:
MOV TABLE,DATA
MOV WORD RTR[BX],0FFSET TABLE
MOV TABLE[DI],ABC
MOV [BX][SI],ABC+2
MOV TABLE[BP][SI],0FFH
ABC是符號名,相當於一個常數,TABLE是變量名。



PUSH指令
格式:
PUSH SRC
將16位寄存器、段寄存器、16位存儲單元數據壓入堆棧。
POP指令
格式:
POP DST
將堆棧中的16位數據送入16位寄存器、段寄存器、16位存儲單元中。


堆棧中數據的壓入彈出必須以字為單位進行。
PUSHF指令
格式:
PUSHF
將標志寄存器內容壓入堆棧
POPF
格式:
POPF
將16位堆棧數據彈入標志寄存器中。
XCHG指令
XCHG指令可實現字互換和字節互換。
互換能夠在寄存器之間進行。也能夠在寄存器和存儲單元之間進行。


格式:
XCHG DST,SRC
互換源、目的兩個操作數的存放位置。
XCHG指令源、目的操作數的尋址方式不同意是馬上尋址方式,兩個存儲單元之間不能直接互換數據。


地址傳送指令:將地址送到指定的寄存器中
LEA:偏移地址送寄存器
LDS:指針送指定寄存器和DS
LES:指針送指定寄存器和ES
格式:LEA REG,SRC
操作:(REG)SRC的偏移地址
功能:把源操作數的偏移地址送到指定的寄存器

LDS:指針送指定寄存器和DS寄存器
格式:LDS REG,SRC
操作:(REG)(SRC)
     (DS)(SRC+2)
功能:將源操作數尋址到的存儲單元的第一個源操作數(字)送16位寄存器,第二個源操作數(字)送DS寄存器。

LES:指針送指定寄存器和ES寄存器指令
格式:LES REG,SEC
操作:(REG)(SRC)
      (ES)(SRC+2)
功能:將源操作數尋址到的存儲單元的第一個源操作數(字)送16位寄存器,第二個源操作數(字)送ES寄存器。
LEA BX,TABLE
TABLE是數據段中定義的地址標號。指令運行前,假設(BX)=0000H,(DS)=2000H,TABLE=20020H,運行后,(BX)=0020H
加法指令ADD
格式:ADD DST,SRC
操作:(DST)(SRC)+(DST)
功能:完畢源操作數和目的操作數的加法運算,並把運算結果保存在目的操作數中。
帶進位加法指令ADC
格式:ADC DST,SRC
操作:(DST)(SRC)+(DST)+CF
功能:完畢帶進位的源操作數和目的操作數的加法運算,並把結果保存在目的操作數中。

增量指令 INC
格式:INC DST
操作:(DST)(DST)+1
功能:完畢目的操作數的自加運算

ADD和ADC指令兩個操作數不能同一時候為存儲器尋址方式,而且目的操作數不能為馬上數尋址方式。
INC指令的操作數不能為馬上數尋址方式。
完畢雙字長相加,被加數存放在DX和AX中,加數放在BX和CX中,和放在DX和AX中。
ADD AX,CX
ADC DX,BX

SUB減法指令
格式:SUB DST,SRC
操作:(DST)(DST)-(SRC)
功能:完畢源操作數和目的操作數的減法運算,把結果保存在目的操作數中。


SBB 帶借位減法指令
格式:SBB DST,SRC
操作:(DST)(DST)-(SRC)-CF
功能:完畢帶借位的源操作數和目的操作數的減法運算,並把運算結果保存在目的操作數中。



DEC 減量指令
格式:DEC DST
操作:(DST)(DST)-1
功能:完畢目的操作數的自減運算。

NEG 求補指令
格式:NEG DST
操作:(DST)0-(DST)
0-操作數=-操作數

CF表示機器的最高有效位向更高有效位的進位。
減數>被減數,此時有借位。則CF=1,否則CF=0.
完畢雙字長相減操作,被減數存放在DX和AX中,減數存放在BX與CX中。差放在DX和AX中,
SUB AX,CX
SBB DX,BX
乘法指令
乘法指令可對字節、字、雙字進行操作。且可對有符號數整數或無符號整數進行操作。
兩個8位數相乘,結果為16位數。


兩個16位數相乘。結果為32位數。


無符號數指令MUL
格式:MUL SRC
操作:
字節操作:(AX)(AL)*SRC
字操作:(DX-AX)(AX)*SRC
有符號數乘法指令IMUL
格式:IMUL SRC
在乘法指令中。被乘數也即目的操作數隱含在AX(字運算)或AL(字節運算)中,乘數也即源操作數。


兩個8位數相乘是16位,存放在AX中。


兩個16位數相乘是32位。存放在DX,AX中。
當中DX存放高位字。AX存放低位字。
MUL CL  。AL的內容乘以CL的內容,無符號數存於AX。
IMUL DL   。AL的內容乘以DL的內容,有符號數存於AX。
MUL BYTE PTR[BX]    ;AL內容乘以數據段中由BX尋址的字節存儲單元的內容,無符號積存於AX。
120. IMUL WORD PTR[BP]    。AX內容乘以堆棧段中由BP尋址的字存儲單元的內容,帶符號的積存於DX,AX。
121. 邏輯運算指令:可對8位數或16位數進行邏輯運算。是按位操作的。


122.AND邏輯與指令
格式:AND DST,SRC
操作:(DST)(DST)(SRC)
本指令的功能用於使某個操作數中的若干位維持不變,而使另外若干位位0的操作。也稱屏蔽某些位。
要維持不變的位必須和1相與,而要置零的位必須和0相與。


123.屏蔽AL中的高四位
AND AL,00001111B
124.AND AL,AL
指令運行前后。AL無變化。但運行后使標志位發生了變化,即CF=0,OF=0.
125.OR邏輯或指令
格式:OR DST,SRC
操作:(DST)(DST)(SRC)
本指令用於使某個操作數中的若干位維持不變,使另外若干位置1的場合。要維持不變的必須和0相或,而置為1的位必須和1相或。
126.OR AL,10000000B
若運行前(AL)=OFH,則運行后(AL)=8FH.
127.OR AL,AL
指令運行前后,(AL)不變,但運行后標志位發生了變化,即CF=0。OF=0.
128.XOR 邏輯異或指令
格式:XOR DST,SRC
操作:(DST)(DST)異或(SRC)
用於推斷兩個數是否相等;也可用於操作數中的若干位維持不變,而使另外若干位取反的操作。維持不變的位與0相異或,取反的位與1相異或。
129.XOR AL,AL
運行后,使(AL)=0,CF=0。OF=0.
130.測試AL是否等於33H
XOR AL,33H
JZ MATCH
131.使AL中最高位和最低位取反。其它位保持不變
XOR AL,10000001B
132.TEST測試指令
格式:TEST DST,SRC
操作:(DST)  (SRC)
用於不改變原有操作數的情況下,用來檢測某一位或某幾位的條件是否滿足。用於條件轉移指令的先行指令。


不檢測的那些位與0相與,即屏蔽掉。
檢測的那些位與1相與,即保持不變。


133.檢測(AL)的最高位是否為1,若為1則轉移,否則順序運行。


TEST AL,10000000B
JNZ AA
…..
AA:…

134.NOT邏輯非指令
格式:NOT DST
尋址方式不同意為馬上尋址方式及段寄存器。
135.指令尋址方式是確定下一條要運行指令的地址的方法。


136.段內直接尋址
這樣的尋址方式的匯編格式有三種:
指令名 SHORT 轉移目標地址標號
指令名 轉移目標地址標號
指令名 NEAR PTR 轉移目標地址標號
指令中直接指明了要轉移的目標地址。因此叫直接尋址。又由於這樣的指令僅僅改變了IP寄存器的值而不改變CS寄存器的值,因此又叫段內尋址。
當運行這樣的尋址方式的轉移指令時。機器取出位移量,與當前IP相加。和送入IP寄存器中。CS寄存器內容保持不變,從而實現轉移。

位移量不同,轉移范圍不同。當位移量位8位,僅僅同意轉移到與本條指令的下一條指令相距-128~127范圍內的存儲單元中。當位移量位16位時。同意轉移到當前代碼段內不論什么地方。

137.位移量能夠是一個帶符號的8位數,也能夠是一個帶符號的16位數。表示了轉移地址偏移本條指令的下一條指令的字節數。負數表明要向當前指令的后面跳轉。整數要向當前指令的前面跳轉。
138.條件轉移指令的位移量僅僅能是8位。而無條件轉移指令能夠是8位或16位。
139.轉移指令是一種基本的程序控制指令。當中無條件轉移指令使匯編者能跳過程序某些部分轉移到不論什么分支中去。
140.條件轉移指令可使編程者依據結果來決定轉到何處。測試的結果保存在標志位中,然后又被條件轉移指令檢測。
141.比較兩個數。若兩數相等則轉移。否則順序運行
CMP AX,BX
JZ SS2


SS1:…
SS2:…

142.兩個無符號數比較大小時,機器依據CF標志位來推斷大小。即兩無符號數相減。若不夠減,則最高位有借位,CF=1;否則CF=0。


當CF=1時,說明被減數低於減數。
當CF=0且ZF=0時,說明被減數高於減數;
當CF=0且ZF=1時。說明被減數等於減數。


143.變量TABLE中存放了一個偏移地址,當無符號數X小於、等於或大於此偏移地址時。應去運行三個不同的程序段。
MOV BX,TABLE
MOV AX,X
CMP AX,BX
JA SS3
JZ SS2

SS1:…   ;低於程序段
SS2:…   等於程序段
SS3:…   高於程序段

144.比較兩個數,相等則轉移,否則順序運行
CMP AX,BX
JZ SS2


SS1:…
SS2:…

145.中斷:Interrupt
146.NOP:無操作指令,不運行不論什么操作
HLT:停機指令,使CPU處於暫停狀態。
147.段間直接尋址
(1)指令名 FAR PTR 轉移地址標號
(2)指令名 段地址:段內偏移地址
指令中直接指明了要轉移的目標地址,此轉移地址或用地址標號或用數值地址表示,因此叫直接尋址。
又由於這樣的指令不僅改變IP寄存器的值並且改變CS寄存器的值,因此又叫段間尋址。
148.段內間接尋址
(1)指令名 16位寄存器名
(2)指令名 WORD PTR 存儲器尋址方式
轉移的目標地址放在寄存器或存儲器中。因此叫寄存器間接尋址。

指令僅僅改變IP寄存器的值而不改變CS寄存器的值。因此又叫段內尋址。


149.段間間接尋址
指令名 DWORD PTR 存儲器尋址方式
轉移的目標地址放在存儲器中。稱作間接尋址。


又由於指令不僅改變IP寄存器的值並且改變CS寄存器的值,因此又叫段間尋址。
150.控制轉移指令通過改變CS。IP來控制程序的指令流程。
151.JMP段內直接尋址
(1)段內直接短轉移
格式:JMP SHORT 轉移地址標號
操作:IP(當前IP)+8位偏移量
轉移范圍:轉到本條指令的下一條指令的-128~127個字節范圍內。

段內直接近轉移
格式1:JMP NEAR PTR 轉移地址標號
格式2:JMP 數值偏移地址
可轉移到當前代碼段中不論什么地方。


152.JMP 段內間接轉移
(1)格式:JMP 16位寄存器名
功能:無條件轉移到當前段的指定偏移地址處

(2)格式:JMP 存儲器尋址方式
功能:無條件轉移到當前段的指定偏移地址處

153.段間直接轉移
(1)格式:JMP FAR PTR 轉移地址標號
操作:IP轉移地址標號的偏移地址
      CS轉移地址標號的段地址
功能:無條件轉移到指定標號地址處往下運行。

(2)格式:JMP 段地址值:偏移地址
操作:IP偏移地址值
      CS段地址值
功能:無條件轉移到指定段的地址往下運行。



154.段間間接轉移
格式:JMP DWORD PTR 存儲器尋址方式
操作:IP尋址到存儲單元的第一個字
      CS尋址到存儲單元的第二個字
功能:無條件轉移到指定段的指定偏移地址處。

155.全部JMP指令都不影響狀態標志位。


156.CALL調用指令
(1)段內直接調用
格式:CALL NEAR PTR 子程序名
      CALL 子程序名

(2)段內間接調用
格式:CALL 16位寄存器名
      CALL WORD PTR 存儲器尋址方式

(3)段間直接調用
格式:CALL FAR PTR 子程序名

段間間接調用
格式:CALL DWORD PTR 存儲器尋址方式

157.RET返回指令
(1)段內返回
格式:RET
(2)段間返回
格式:RET

(3)段內帶馬上數返回
格式:RET 表達式

(4)段間帶馬上數返回
格式:RET 表達式

158.循環控制指令:LOOP/LOOPZ/LOOPE/LOOPNZ/LOOPNE
格式:
指令名 循環入口的地址標號

操作:推斷測試條件,若條件成立,則IP(IP)+8;若條件不成立,則IP保持不變。
循環指令用的是段內直接尋址法,是相對轉移指令。



159.從寄存器里取數據比從存儲器里取數據快得多從而提高了指令運行速度。
160.如果TABLE是在數據段定義的一個字節數組的首地址標號,其偏移地址為1000H,則:
MOV AL,TABLE = MOV AL,[TABLE] = MOV AL,[1000H]
MOV AL,TABLE+2 = MOV AL,[TABLE+2] = MOV AL,[1000H+2]

160.段超越前綴
如果TABLE是在附加數據段定義的一個字節數組的首地址標號,其偏移地址為1000H。則
MOV AL,ES:TABLE
MOV AL,ES:[TABLE]
MOV AL,ES:1000H
MOV AL,ES:[1000H]

161.BX,BP稱為基址寄存器
   SI,DI稱為變址寄存器

MOV AX,[BX]
MOV AX,[SI]
MOV AX,[基址寄存器名或變址寄存器名]

162.注意寄存器間接尋址和相對尋址的差別

163.寄存器相對尋址:操作數的偏移地址是指定寄存器的值與一個整數之和。
164.LEA 取偏移指令
ABC EQU 5
LEA SI,TABLE
MOV AL,ABC[SI]

165.[BX+6]    [BP-1000H]  [SI+OFFSET TABLE] 都是寄存器相對尋址。


166.基址變址尋址:操作數的偏移地址是兩個指定寄存器的值之和。
如:
[基址寄存器名][變址寄存器名]
[基址寄存器名+變址寄存器名]

167.相對基址變址尋址
MOV AL,TABLE[BX][SI]
MOV AL,TABLE[BX+SI]
MOV AL,[TABLE+BX+SI]

168.兩個段寄存器之間不同意直接傳送數據。
如:
DATA是用戶定義的一個數據段的段名
則:
MOV AX,DATA
MOV DS,AX

錯誤:MOV DS,DATA

169.MOV AX,1234H
   PUSH AX
運行前 (SS)=2000H,(SP)=00FEH
運行后 (SS)=2000H,(SP)=00FCH

注意:入棧時。SP-2

170.XCHG BX,[BP+SI]
指令運行前:
(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H
則 源操作數物理地址=1F00H*10H+0100H+0020H=1F120H

運行后:
(BX)=0000H
(1F120H)=1234H

171.有兩個5字節變量X(789623A789H),Y(2375937B60H),求ZX+Y
解:
DATA SEGMENT
X DB 89H,0A7H,23H,96H,78H
Y DB 60H,7BH,93H,75H,23H
Z DB 5 DUP(0)
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV CX,5
MOV SI,0

PO:
MOV AL,X[SI]
ADC AL,Y[SI]
MOV Z[SI],AL

INC SI
DEC CX
JNZ PO
MOV AH,4CH
INT 21H
CODE ENDS
END START



172.
DB :DEFINE BYTE    定義字節        一個字節長
DW:DEFINE WORD    定義字        兩個字節長
DD:DEFINE DWORD    定義雙字     四個字節長

173.AX1+2+3+…+100

CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX,0
MOV SI,1
MOV CX,100

PO:
ADD AX,SI
INC SI
DEC CX
JNZ PO

CODE ENDS
END START

174.X,Y串長度為N。X=Y顯示Z,X!=Y顯示Y
解:
DATA SEGMENT
N EQU 20
X DB N DUP(0)
Y DB N DUP(0)
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,ES:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,N
LEA SI,X
LEA DI,Y
CLD DF=0

PO:
MOV AL,[SI]
CMP AL,[DI]
JNZ NP
INC SI
INC DI
DEC CX
JNZ PO
MOV DL,’Z’
MOV AH,02H
INT 21H
JMP DP

NP:
MOV DL,’Y’
MOV AH,02H
INT 21H

DP:
MOV AH,4CH
INT 21H

CODE ENDS
END START

175.完畢兩個字節數據相加
解:
DATA SEGMENT
BUF1 DB 34H
BUF2 DB 2AH
SUM DB ?
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,BUF1
ADD AL,BUF2
MOV SUM,AL
MOV AH,4CH
INT 21H

CODE ENDS
END START

176.偽指令語句也叫指示性語句。僅僅是用來指示、引導匯編程序在匯編過程中做一些操作。為匯編程序在翻譯時提供有關信息,並不翻譯機器代碼的語句。


177.一條宏指令語句的功能相當於若干條指令語句的功能。


178.            。凝視
179.操作碼用來指明操作的性質或功能。指令中的助記符都是操作碼。

MOV、ADD都是操作碼。
180.CLC 操作數默認在CF中。
181.對於十六進制數,當以A~F開頭,前面加數字0,以避免和名字混淆,如十六進制A6H。應該寫成0A6H。否則easy和名字A6H混淆。
182.常數用符號名來取代就是符號常數。
用COUNT EQU 3或COUNT=3定以后COUNT就是一個符號常數,與數值常數3等價。
183.兩個地址相加、相乘、相除是沒有意義的。
184.MOV AL,4*8+5   。數值表達式
MOV SI,OFFSET BUF+12   ;D地址表達式
185.邏輯運算符僅僅能用於數值表達式中,不能用於地址表達式中。
186.關系運算符
EQ  相等
LT   小於
LE   小於等於
GT   大於
GE   大於等於
NE   不等於
運算結果為真時。表示為0FFFFH,運算結果為假時,為0000H

MOV BX,32 EQ 45   等價於   MOV BX,0000H
MOV BX,56 GT 30   等價於   MOV BX,0FFFFH

187.一條語句能夠寫在多行上,續行符是&
188.分離運算符
(1)LOW 運算符
格式:LOW 表達式
功能:取表達式的低字節部分

(2)HIGH運算符
格式:HIGH 表達式
功能:取表達式的高字節部分

188.CONSTANT EQU 256
DATA EQU HEIGHT+12   ;HEIGHT是標號,地址表達式賦以符號名DATA
ALPHA EQU 7
BETA EQU ALPHA-2
ADDR EAU VAR+BETA
B EQU [BP+8]
P8 EQU DS:[BP+8]

189.EQU偽操作中的表達式是不同意反復定義的。而=偽操作同意反復定義。
190.解除定義偽指令 PURGE
Y1 EQU 7
PURGE Y1
Y1 EQU 88
191.DB :偽指令用來定義字節,其后的每個操作數都占有一個字節(8位)的存儲單元。
DW:偽操作定義字,其后的每一個操作數占有一個字(16位)。低位字節在第一個字節地址中,高位字節在第二個字節地址中。
DD:定義雙字。

191.操作數“?”能夠保留存儲空間。但不存入數據。待到程序執行時存放中間或終於結果。
192.匯編源程序定義:
DATA_SEG1 SEGMENT   ;定義數據段

DATA_SEG1 ENDS
DATA_SEG2 SEGMENT    ;定義附加段

DATA_SEG2 ENDS

CODE_SEG SEGMRNT
ASSUME CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2
START:            ;開始運行的入口地址
MOV AX,DATA_SEG1
MOV DS,AX
MOV AX,DATA_SEG2
MOV ES,AX

CODE_SEG ENDS    。代碼段定義結束
END START          。源程序結束

193.實現兩個32位數的乘法程序
解:
DATA SEGMENT
NUM1 DD 12345678H
NUM2 DD 5A4BEF06H
RESULT DD 2 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV EAX,NUM1
MUL EAX,NUM2
MOV RESULT,EAX
MOV RESULT+4,EDX
MOV AH,4CH
INT 21H
CODE ENDS
END START

194.將一個字節壓縮BCD碼轉化成兩個ASCII碼
分析:一個字節的壓縮BCD碼就是用一個字節的二進制數表示兩位十進制數。如十進制96表示成壓縮BCD碼就是96H,轉化成ASCII碼就是把壓縮BCD碼表示的十進制數的高位和低位分開,並以ASCII碼表示,即裝化成39H,36H
解:
DATA SEGMENT
BCDBUF DB 96H
ASCBUF DB 2 DUP(?)
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,BCDBUF    ;取出BCD碼
MOV BL,AL       ;送BL暫存
MOV CL,4
SHR AL,CL      。高四位變低四位,高四位補零(96H09H)
ADD AL,30H     。變成ASCII碼(39H)
MOV ASCBUF,AL    ;存儲第一個ASCII碼
AND BL,0FH      。屏蔽高四位,僅僅保留低四位(96H06H)
ADD BL,30H     ;變成BCD碼(36H)
MOV ASCBUF+1,BL     ;存儲第二個碼
MOV AH,4CH
INT 21H

CODE ENDS
END START


195.利用直接查表法完畢將鍵盤輸入的一位十進制數(0~9)轉換成相應的平方值,並存放在SQRBUF中。
分析:0~9的平方值分別為0,1,4,9,16,25,36,49,64,81.把平方值放在一起形成一個平方值表,依據輸入的值和相應平方值所在單元地址之間的關系(表首地址加上輸入的值),查出相應的平方值。
解:
DATA SEGMENT
SQRTAB DB 0,1,4,9,16,25,36,49,64,81
SQRBUF DB ?
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SQRTAB   。平方表首地址
MOV AL,1
INT 21H    。由鍵盤輸入一個數,得到其ASCII碼
SUB AL,30H    ;由ASCII碼得到對應的數
XLAT     。查表
MOV SQRBUF,AL    ;存儲結果
MOV AH,4CH
INT 21H

CODE ENDS
END START

196.從鍵盤輸入一個小寫字母,將其轉化成大寫字母在屏幕上顯示出來。
分析:用DOS功能調用來實現   ASCII-32

解:
STACK SEGMENT STACK
DB 200 DUP(?

)
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,SS:STACK
BEGIN:
MOV AH,01H    。一號調用,從鍵盤輸入字符存入AL
INT 21H
SUB AL,20H    ;十六進制20就是十進制的32
MOV DL,AL
MOV AH,02H   。二號調用。在屏幕上顯示DL中的內容
INT 21H
MOV AH,4CH
INT 21H

CODE ENDS
END BEGIN

197.在內存中有一個字節單元NUM,存有帶符號數據,要求計算絕對值,放入RESULT單元中。
分析:NEG   求反
解:
DATA SEGMENT
X DB -25
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
TEST AL,80H    ;測試AL的正負
JZ NEXT    ;為正,轉NEXT
NEG AL   ;否則,求反

NEXT:
MOV RESULT,AL
MOV AH,4CH
INT 21H

CODE ENDS
END START

198.多分支結構實現方法:條件選擇法,跳躍表法,地址表法
199.求:Y=1,X>0
        Y=0,X=0
        Y=-1,X<0
輸入數據為X。輸出數據為Y,都是字節變量。
解:
DATA SEGMENT
X DB -25
Y DB ?


DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0    ;AL中內容和0比較
JGE BIG    ;>=0,轉BIG
MOV BL,-1  ;否則為負數,-1送BL
JMP EXIT    ;結束
BIG:JE EE     ;AL中內容是否為0,為零轉EE
MOV AL,1    ;否則為大於零,1送BL
JMP EXIT

EE:MOV BL,0
EXIT:
MOV Y,BL
MOV AH,4CH
INT 21H

CODE ENDS
END START

200.SHL:將操作數邏輯左移指定次數
SHR:將操作數邏輯右移指定次數

201.除法指令要求被除數的長度必須是除數的兩倍。
字節除法是用16位數除以8位數,字除法是用32位數除以16位數。
DIV:無符號數除法
IDIV:帶符號數除法
202.格式:DIV SRC
操作:
字節操作:
(AL)(AX)/(SRC)的商
(AH) (AX)/(SRC)的余數

字操作
(AX)(DX,AX)/(SRC)的商
(DX) (DX,AX)/(SRC)的余數

在除法中,被除數也即目的操作數隱含在AX(字節運算)或DX-AX(字運算)中,除數即源操作數。

203.
(1)DIV CL    ;AX的內容除以CL的內容,無符號商存於AL,余數存於AH
(2)IDIV DL    
(3)DIV BYTE PTR[BP]   ;AX的內容除以堆棧段中由BP尋址的字節存儲單元的內容。無符號的商存於AL中,余數存儲AH中。

204.CS  指令尋址
SS   堆棧尋址
DS   數據尋址

205.OF   是否溢出標識符
DF    方向標識符
IF    中斷標志符
SF    符號標識符
ZF     是否為零標識符
AF    輔助進位標識符
PF    奇偶標識符
CF    進位標識符

206.AX,BX,CX,DX     16位數據寄存器。2字節
SP,BP,SI,DI           16位指針與變址寄存器  2字節

AX能夠分別訪問高位字節AH和低位字節AL。


AX,BX,CX,DX能夠以字(16位)形式訪問,也能夠以字節(8位)訪問。都是通用寄存器。


SP,BP,SI,DI僅僅能以字(16位)訪問。

207.使用ASSUME偽操作來明白段和段寄存器的關系。


當中段寄存器名必須是CS,DS,ES,SS,而段名必須是由SEGMENT定義的段中的段名。
208.ASSUME偽操作僅僅是指定某個段分配給哪一個段寄存器,並不能把段地址裝入段寄存器。
數據段和堆棧段須要這樣做。CS不須要這樣做,這是在程序初始化時完畢的。


209.從CISC體系結構轉變為RISC體系結構后。在相同的工藝水平(即相同的主頻,相同的工藝尺寸,相同的芯片面積下),使CPU的速度和性能有了非常大的提高。


210.microprocessor   微處理器
Microcomputer   微型計算機

211.操作碼:指明要完畢操作的性質
地址碼:指明規定操作的數據存放地址或操作數
212.assemble language  匯編語言
匯編語言程序翻譯成機器語言程序的過程稱為匯編。


213.匯編語言依賴於某一詳細計算機。是面向機器的語言。
214.八進制表示  O  Q
十進制表示   D
二進制表示    B
十六進制表示    H
215.反碼的特點:
(1)“0”有兩種表示法
(2)8位二進制反碼所能表示的范圍-128~127
(3)當一個帶符號數由反碼表示時,最高位為符號位。當符號位為0時,后面的7位為數值部分;當符號位為1時。一定要按位取反。才干得到數值。



216.補碼特點:
(1)[+0]補=[-0]補=00000000
(2)8位二進制補碼表示的數值為-128~127
(3)用補碼表示的二進制數,最高位為符號位,當符號位為0時。其余7位是此數的二進制值。當符號位為1時,數值獲取方法是按位取反加1.

217.數字0~9的ASCII碼值用十進制數表示是48~57
用十六進制表示是30H~39H
218.雙字是不論什么字節地址開始的兩個相鄰字,當中每一個字節都有自己的地址,最小字節地址就是雙字的地址。
219.非壓縮BCD碼是用一個字節僅僅表示一位0~9的十進制數。這些數作為無符號字節值存放。數的大小由低字節確定。


220.壓縮BCD碼是用一個字節來表示兩個十進制數(0~9)。每半個字節保存一個0~9的數字。


221.結果的顯示或打印。可使用DOS功能調用02號功能來實現。是把要顯示字符的ASCII碼送入DL寄存器,功能調用02號送入AH寄存器,通過指令INT 21H就可以實現結果的顯示與打印。
222.
MOV DL,’?


MOV AH,02H
INT 21H
‘?

’原先放在何處並不重要。但一定是要送入DL寄存器才干顯示。
223.顯示字符串
將在緩沖區中的字符串送屏幕顯示或打印。

使用9號功能調用。

要顯示的字符串應該存入由數據段定義的緩沖區中。且以‘$’為結束標志。
解:
DATA SEGMENT
BUF DB ‘HOW ARE YOU!$’
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET BUF
MOV AX,09H
INT 21H

CODE ENDS

224.

225.IP是指向下一次要取出的指令。與CS寄存器配合才干形成真正的物理地址。
226.通用寄存器共同擁有8個:
EAX/EBX/ECX/EDX可作為8位,16位或32位寄存器使用。


ESI/SDI/EBP/ESP可作為16位或32位寄存器使用。




227.AF:Auxitiary Carry Flag 輔助進位標志
在字節操作時。由低半字節向高半字節進位或借位。在字操作時。低位字節向高位字節有進位或借位。則AF=1。否則為0.
228.CF:Carry Flag  進位標志
當結果的最高位產生一個進位或借位。則CF=1,否則CF=0.
229.OF :Overflow Flag  帶符號數的運算結果超出了8位或16位,即在字節運算時大於+127或小於-128。在字運算時大於32767或小於-32768,置1.
230.CF和OF沒有必定關系。
231.奇偶標志PF:Parity Flag  ,若操作結果中“1”的個數為偶數,則PF=1,否則PF=0.
可用於校驗。
232.零標志 ZF:(Zero Flag)若運算結果為0,則ZF=1,否則ZF=0.
233.IF Interrupt-enable Flag  中斷同意標志
若指令中置IF=1。則同意CPU去接收外部的可屏蔽中斷請求。

若IF=0,則屏蔽上述的中斷請求。
234.CLC:Clear Carry Flag  標志CF清零。即CF0
235.CLD:Clear Direction Flag   標志DF清零,即DF0,則在串操作時。使地址增量。
236.方向標志 DF(Direction Flag)
若DF=1。則引起串操作指令為自己主動減量指令,也就是從高地址到低地址處理字符串。
若DF=0,則引起串操作指令為自己主動增量指令,也就是從低地址到高地址處理字符串。

237.1個字節8位。1個字16位,1個雙字32位。
                   Word         Double Word
238.字節是微型計算機中存取信息的基本單位(存儲單元)。


一個雙字占用4個存儲單元(字節)。
239.對於字。雙字,四字數據類型。因為他們每一個數據都要占用多個單元,訪問時僅僅需給出最低單元的地址號就可以,然后依次存取后繼字節。
低地址中存放低位字節數據,高地址中存放高位字節數據。
240.在內存中
地址: 0     1     2     3     4     5
數據:12H   34H   45H   67H   89H   0AH

(1)字節=34H
(1)字=4534H
(1)雙字=89674534H

241.物理地址計算:
10H*段基址+偏移量

注:10H=16D
就是二進制數向左移動4位。


段基址和偏移量一般用十六進制數表示,簡便的計算方法是在段基址的最低位補以0H。再加上偏移量。
242.某內存單元的地址用十六進制數表示為1234:5678,則物理地址是:
10H*1234H+5678H=179B8H

注:
1234:5678中,1234是段基址,5678是段內偏移量。就是偏移地址。



243.若(CS)=1234H,(DS)=2000H,(IP)=0010H,(SS)=4000H,則下一條要運行指令的地址是:
10H*(CS)+(IP)=12340H+0010H=12350H

244.每一個存儲單元在存儲器中所具有的地址稱為存儲單元的物理地址。段基地址是每一段的起始地址,單元與段基地址的距離稱為段內偏移地址。也叫偏移量。


245.
(1)MOV AL,20H
(2)MOV BX.2568H
(3)MOV ECX 25685678H
三條指令中的馬上數依次是8位,16位,32位,相應的寄存器也各自是8位的AL。16位的BX和32位的ECX
246.MOV AX,im      馬上數im,低8位字節iml存儲在低地址字節中。高8位字節imh存儲在高地址字節單元中。


247.寄存器尋址操作數直接存放在寄存器中,由指令指定的寄存器進行尋址,即操作數包括在指令規定的8位。16位,或32位寄存器中。
INC DL
MOV DS,AX
MOV EBX,ECX
三條指令操作數分別存於8位DL。16位AX和32位ECX中。

248.直接尋址
物理地址=10H*(DS)+有效地址     或
物理地址=16D*(DS)+有效地址

249.設操作數存放在DS所指向的數據段中,(DS)=2000H,(21000H)=34H。(21001H)=12H,(BX)=5678H,運行MOV BX,[1000H]

物理地址=10H*(DS)+1000H=21000H
(BX)=1234H
低位字節在低地址存儲單元中,
高位字節在高地址存儲單元中。



250.默認情況下,覺得操作數有效地址的作用域是DS所指向的數據段,但同意使用段超越前綴指定為其它段,即對於尋找操作數來說。還同意操作數在以代碼段、堆棧段或附加段為基准的區域中,僅僅要在指令中指明是段超越的。

16位地址偏移量能夠與CS,SS。ES相加,作為操作數的地址。如MOV AX,ES:[2000H]

251.寄存器間接尋址能夠是16位或32位的
使用BX,SI,DI,BP,則為16位尋址。


使用EAX,EBX,ECX,EDX,ESI,ESP,EDI,EBP,為32位尋址。

252.以BX/SI/DI/EAX/EBX/ECX/EDX/ESI/EDI間接尋址時。則默認操作數在DS段中。以BP/EBP/ESP間接尋址,則默認操作數在SS段。
253.以SI/DI/BX間接尋址,通常操作數在現行數據段中,即數據段寄存器DS左移4位后加上SI/DI/BX中的16位偏移地址作為操作數的地址。
254.設(DS)=2000H,(SI)=1000H,21000H單元的內容為34H。21001H單元的內容為12H,運行MOV AX,[SI]后,(AX)=1234H

254.若是以寄存器BP間接尋址,則操作數在堆棧段中。SS左移4位后與BP相加作為操作數的地址。


如:
(SS)=3000H,(BP)=2000H,32000H單元的內容為34H。32001H單元的內容為12H,運行MOV AX,[BP]后。(AX)=1234H.

255.通用寄存器EAX,EBX,ECX,EDX,ESI,EDI默認段寄存器為DS。
通用寄存器ESP,EBP默認段寄存器位SS。
256.
(1)MOV EBX,[EAX]   ;默認DS為段基址,傳送雙字給EBX
(2)MOV DX,[EBX]    ;默認DS為段基址,傳送字給DX
(3)MOV CH,[EAX]    ;默認DS為段基址,傳送字節給CH
257.假設操作數在默認段之外,指令中必須加段超越前綴。
如:
(1)MOV AX,ES:[SI]    。操作數在附加段寄存器ES中,不在默認段DS中。
(2)MOV AX,DS:[BP]   ;操作數在數據段寄存器DS中,不在默認段SS中。

“ES”和“DS”各自是兩指令的段超越前綴。



258.若在指令中規定是段超越的,則BP也能夠與其它的段寄存器相加。形成操作數地址。如:
MOV AX,DS:[BP]     ;BP不是與SS段寄存器形成操作數地址,而是與DS段寄存器形成操作數地址。

259.設(DS)=2000H,(SI)=1200H,(21200H)=56H,運行指令MOV AH,[SI]的結果是:
(AH)=56H

260.設(DS)=2000H,(DI)=2100H,(22100H)=68H,(22101H)=41H,運行指令MOV BX,[DI]后。
(BX)=4168H

261.EA :Effective Address   有效地址 或偏移地址  偏移量
262.基址尋址:由指定的基址寄存器內容,加上指令中給定的偏移量(要由一個段寄存器作為地址基准)作為操作數的地址的尋址方式稱為基址尋址。
263.在基址尋址方式下,EA=[基址寄存器]+位移量,位移量是常數且緊跟在操作碼之后,與操作碼一起放在代碼段中。
264.在16位尋址情況下。BX和BP作為基址寄存器。在缺省段超越前綴時。BX以DS作為默認段寄存器。BP以SS作為默認段寄存器。位移量為8位或16位。
265.基址尋址適用於對一維數組的數組元素進行檢索操作。

位移量表示數組起始地址偏移量,基址表示能夠變化的數組元素下標。


266.EA的格式:
[基址寄存器]+位移量
位移量[基址寄存器]
267.
(1)MOV EAX,[BX+24]   或   MOV EAX,24[BX]
(2)MOV ECX,[EBP+50]   或   MOV ECX,50[EBP]
(3)MOV DX,[EAX+1500]  或  MOV DX,1500[EAX]

268.設(DS)=2000H,(SI)=1200H,(21206)=56H,運行MOV AH,[SI+6],結果為:
(AH)=56H
269.基址變址尋址:由指令中的基址寄存器內容和變址寄存器內容相加得到操作數的有效地址EA的尋址方式。


EA=[基址寄存器]+[變址寄存器]
如:
MOV AX,[BX+SI]   或  MOV AX,[BX][SI]
MOV EAX,[EDX][EBP]  或  MOV EAX,[EDX+EBP]
一般規定由基址寄存器來決定默認哪一個段寄存器作段基址指針。若使用BP、ESP或EBP,則默認操作數在SS中;若使用其它基址或變址寄存器。則默認操作數在DS中。
270.MOV AX,[BX][SI]   ;基址寄存器是BX,默認DS為段基址寄存器。


MOV EAX,[EBP][ECX]    ;基址寄存器是EBP,默認SS為段基址寄存器。

271.設(DS)=2000H,(SI)=200H,(BX)=1000H,(21200H)=21H,運行MOV AL,[SI+BX],結果:
(AL)=21H.

272.運行MOV BX,[EDI+EAX]的結果是將內存中DS:[EDI+EAX]處開始的連續兩個單元內容送BX中。
273.相對基址變址尋址:由變址寄存器、基址寄存器內容和位移量一同相加而得到操作數有效地址的尋址方式。
EA=[基址寄存器]+[變址寄存器]+位移量
如:
MOV AX,[BX+DI+MASK]   或   MOV AX,MASK[BX][DI]

ADD EDX,[ESI][EBP+0FFFF000H]   或  ADD EDX,0FFFF000H[ESI][EBP]

274.匯編語言對指令的大寫和小寫是不敏感的。
275.傳送100個數據,寫出程序。
分析:使用循環。每次循環都要改動原地址和目標地址,這就要把源、目的地址分別放在兩個寄存器中。用寄存器間接尋址來尋找操作數,改動了寄存器的內容。
解:
MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2
MOV CX,100
AGAIN:
MOV AL,[DI]
MOV [SI],AL
INC SI
INC DI
DEC CX
JNZ AGAIN

276.OFFSET AREA1  是指地址單元AREA1在段內的地址偏移量。尋找內存操作數時,必須以段地址(在某個段寄存器中)加上此單元的段內地址偏移量,才干確定某一內存單元的物理地址。
277.地址傳送指令主要用於傳送操作數的地址。
LEA,裝入有效地址指令
Load Effective Address

LDS:裝入DS指令
LES:裝入ES指令
LSS:裝入SS指令

278.裝入有效地址指令 LEA
格式:LEA reg,mem
功能:將有效地址(偏移地址)mem而不是mem的內容裝入到一指定寄存器reg中。
說明:源操作數必須是一個內存操作數。目的操作數必須是一個16位的通用寄存器。


279.LEA BX,LIST
將變量LIST的地址偏移量送到BX
280.若BX寄存器的內容是0400H,SI寄存器的內容是003CH,運行指令LEA BX,[BX+SI+0F62H]后,BX的內容是什么?
解:
將0400H+003CH+0F62H=139EH送BX,所以結果(BX)=139EH.
與MOV BX,[BX+SI+0F62H]差別是MOV將139EH表示的單元內容送BX。



281.LEA指令能夠用對應的源操作數為馬上數的MOV指令取代。
如:
MOV BX,OFFSET VARWORD   等價於  LEA BX,VARWORD

282.LDS reg,mem
LES reg,mem
LSS reg,mem
功能:將一個32位或48位的全地址指針(包含一個16位段選擇符和一個16位或32位偏移值)裝入一個段寄存器和一個通用寄存器。

段寄存器由指令操作碼LDS、LES、LSS分別指定為DS,ES,SS.通用寄存器由目的操作數reg指定。



283.XCHG reg,reg
XCHG mem,reg
XCHG reg,mem
reg是寄存器操作數,mem是存儲器操作數。



如:
XCHG AL,CL
XCHG AX,DI
XCHG BX,SI
XCHG AX,BUFFER
XCHG BX,DATA[SI]
XCHG BL,[1000H]

284.查表轉換指令XLAT
格式:XLAT
功能:完畢一個字節的查表轉換。在DS:EBX外。建立一個256字節的表。用寄存器EBX作為基址。寄存器AL作為表的無符號下標(即表指針)將AL指向的那個字節的內容送回AL。即
((EBX)+(AL))AL
說明:
(1)在使用該指令之前,存儲器內需有一個代碼轉換表。表首地址送到EBX,相對於表首的位移量送到AL中,則轉換后數據的有效地址為:
有效地址=表首地址+位移量
即以EBX寄存器內容作為表首,AL寄存器內容作為位移量所相應的表中數據送入寄存器AL中,並替換掉AL原先的內容。


(2)該指令無顯式操作數,操作數是隱含的。指令默認段的數據段DS,而偏移量總是從寄存器EBX中得到。
(3)指令運行前AL是下標。運行后AL是查表的結果。若要在其它段中查表,可加段前綴。

285.通過查表轉換指令,求0~9中隨意一個數的平方
TAB DB 1,4。9,16。25,36。49,64。81
MOV AX,SEG TAB
MOV DS,AX
MOV BX,OFFSET TAB
MOV AL,5
XLAT

運行后:(AL)=25

286.實現存儲器操作數與馬上數相加/減,與累加器或別的寄存器相加/減。和/差放到該存儲單元中。


ADD BETA[SI],100
ADD BETA[SI],AX
ADD BETA[SI],DX
SUB BUF[SI],200
SUB BUF[SI],AX
SUB BUF[SI],DX

287.指令SBB [DI],100 實現的功能是用DS:[DI]所指單元的內容減去100再減去CF,結果送到DS:[DI]指向的字節單元中。

288.求補指令 NEG
格式:NEG OPRD
功能:對OPRD取補,相當於運行“OPRD0-OPRD”

如:
若(AH)=13H,運行NEG AH指令后。(AH)=0EDH;若(BX)=03H,運行NEG BX指令后,(BX)=0FFFDH.
說明:是求補,而不是求反。

289.CMP AX,BX
依據CMP指令的功能,應做AX-BX的操作。

若結果沒有產生借位(CF=0),則AX>=BX;若產生借位(CF=1),則AX<BX.
290.求最大值
MOV BX,OFFSET BLOCK
MOV AX,[BX]
INC BX
INC BX
MOV CX,99

AGAIN:
CMP AX,[BX]
JG NEXT
MOV AX,[BX]

NEXT:
INC BX
INC BX
DEC CX
JNE AGAIN
MOV MAX,AX
HLT

說明:JG為推斷帶符號數的大小。若大,則轉移到后面的標號。

291.MUL OPRD
IMUL OPRD
IMUL OPRD1,OPRD2
IMUL OPRD1,OPRD2,OPRD3

MUL:實現兩個無符號數相乘,AL。AX或EAX的內容和OPRD的內容是兩個無符號數,且假設OPRD長度為8位。則與AL內容相乘。相乘結果送到AX中。
假設OPRD長度為16位,則與AX內容相乘,相乘結果送到DX:AX中;
假設OPRD長度為32位,則與EAX內容相乘,相乘結果送到EDS:EAX中;

292.MUL CL     ;AX(AL)*(CL)
MUL BX      。DX:AX(AX)*(BX)
MUL DWORD[ESI]    。EAX中32位數與[ESI]所指雙字單元中的32位數相乘,結果在EDX:EAX中。



293.IMUL OPRD
被乘數是累加器(AL,AX或EAX),乘以指定的操作數。字節運算時乘積返回到AX,字運算時乘積返回到DX:AX,雙字運算時乘積返回到EDX:EAX

294.IMUL OPRD1,OPRD2
在雙字操作數格式下,用OPRD1乘以OPRD2。積存放在OPRD1指定的寄存器中。


295.IMUL OPRD1。OPRD2,OPRD3
用OPRD2乘以OPRD3,積放到OPRD1
296.格式:
DIV OPRD
IDIV OPRD
功能:
DIV無符號數除法,OPRD內容作為除數,假設OPRD長度為8位,則AX內容作為被除數,運算后商送到AL中,余數送到AH中。



297.DIV CL
(AX)/(CX) ,商在AL中,余數在AH中。
298.DIV WORD PTR[SI]
(DX:AX)中的32位數,除以(SI)所指單元中的16位數,商在AX中。余數在DX中。

299.某個操作數,自己和自己相“與”,操作數不變,能夠使CF=0.
某個操作數。自己和自己相“或”,操作數不變。能夠使CF=0.
某個操作數,自己和自己相“異或”,操作數置零。使CF=0.
300.檢測AL中的最低位是否為1,為1則轉移。
TEST AL,01H
JNZ THERE

THERE:

301.在實地址方式下,段寄存器的內容左移4位而得到段基地址。
302.NAME MAIN_PROGMODULE
NAME是保留字,用於定義程序模塊的名稱,MAIN_PROGMODULE是程序名稱,可用隨意標識符為程序命名。
303.顯示一行字符串
NAME SIMPLE_EXAMPLE
FIRST_DATA SEGMENT
STRING_DA DB ‘This is my program$’
FIRST_DATA ENDS

FIRST_STACK SEGMENT PARA STACK ‘STACK’
           DB 100 DUP(?)
FIRST_STACK ENDS

FIRST CODE SEGMENT
ASSUME DS:FIRST_DATA,SS:FIRST_STACK,CS:FIRST_CODE
START:
MOV AX,FIRST_DATA
MOV DS,AX
LEA DX,STRING_DA
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H

FIRST_CODE ENDS
END START

304.依據程序的實際情況,SS,DS,ES也能夠沒有,僅僅有CS是不可缺少的。每一個程序至少必須有一個。


305.每一個源程序在其代碼段中都必須有返回到DOS的指令語句。以保證程序運行完后能自己主動返回DOS,可繼續向計算機鍵入命令。
306.作為存儲器操作數的標號和變量有三種共同屬性:
(1)段值:段基址,可用SEG運算符求得。
(2)偏移值:段內偏移地址。可用OFFSET運算符求得。


(3)類型。。


307.“?”表示不確定值。僅僅表示預留規定長度的存儲空間。


308.DUP:建立單個值的多次拷貝。
309.
(1)VAR1 DB ?

     ;變量VAR1分配一個字節,但不賦初值。


(2)VAR2 DD ?      ; 變量VAR1分配四個字節,但不賦初值。
(3)STR1 DB ‘ABCDE’    ;給字符串分配5個字節,並賦初值。
(4)ARRAY DW 20 DUP(1)   ;給數組ARRAY分配20個字,初值均為1
(5)BUFF DB 6 DUP(?)    ;相當於  DB ?,?

,?,?

,?,?
(6)COUNT DB 25,35,45    ;給變量COUNT分配3個字節,並賦初值

310.操作數是字符串時,內存中存放的是每一個字符的ASCII碼
STR1 DB  ‘ABCDE’
STR1 DB  ‘A’,’B’,’C’,’D’,’E’
STR1 DB  41H,42H,43H,44H,45H
三者等價。

311.復制操作符DUP,表示操作數反復若干次。


(1)BUFFER1 DB 2 DUP(2,3,4)
等價於
BUFFER1 DB 2,3。4,2,3。4
BUFFER2 DW 1。2,3 DUP(6)
等價於
BUFFER2 DW 1,2,6。6,6
BUFFER3 DB 2 DUP(5。6。3 DUP(7))
等價於
BUFFER3 DB 5,6,7,7。7。5,6。7。7,7

312.指令單元 NEAR 和FAR
若一個單元的類型是NEAR,匯編程序產生一個段內JMP或CALL指令
若一個單元的類型是FAR,匯編程序產生一個段間JMP或CALL指令

313.DATA EQU 7
PURGE DATA
DATA EQU 28

314.MOV AX,SEG DATA
功能:把DATA的段地址存入AX寄存器中。
315.MOV SI,OFFSET DATA
功能:把DATA的偏移地址存入SI寄存器中。


等價於
LEA SI,DATA

316.PTR操作符
格式:類型 PTR 表達式
類型:BYTE,WORD,DWORD,NEAR,FAR
功能:給表達式(變量或標號)指定類型,無論有無類型或是什么類型,均以PTR前的類型為准。(有沒有像C語言中的強制類型轉換呢。嘿嘿)

對於變量。能夠指定的類型是BYTE,WORD,DWORD
對於標號,能夠指定的類型是NEAR(段內引用型),FAR(段間引用型)。

317.MASM:Microsoft Macro Assembler    匯編器。匯編開發環境
318.ASSUME:段寄存器說明語句
格式:ASSUME 段寄存器:段名/組名
功能:說明源程序中定義的段或組由哪個段寄存器去尋址。

指出了段與段寄存器的關系。

319.三個數相加把結果放在SUM單元中。
解:
DATA SEGMENT
BUF DB 35H,78H,0A5H
SUM DB ?
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,0
MOV SI,OFFSET BUF
ADD AL,[SI]
INC SI
ADD AL,[SI]
INC SI
ADD AL,[SI]
MOV SUM,AL
MOV AH,4CH
INT 21H

CODE ENDS
END START

320.子程序定義

子程序名 PROC FAR /NEAR

RET
子程序名 ENDP

321.調用
CALL [NEAR/FAR PTR]  子程序名

322.宏定義
宏名 MACRO 形參

宏名 ENDM

調用:
宏名 實參

323.宏調用展開在編譯處。在EXE文件里有N份。


子程序展開在運行處,在EXE文件里有1份。
324.同一個變量能夠在兩行定義
如:
X DB 12H,34H
 DB 78H,96H

325.
錯誤:
INC [SI]

正確:
INC WORD PTR [SI]
INC BYTE PTR [SI]

326.在匯編中字符就和字符串一樣。是同一個概念,都用單引號。字符就是長度為1的字符串。


327.AND AL,78H AND 0FH
第一個AND是指令,在運行時起作用。
第二個AND是運算符。在編譯時起作用。

328.ADD AX,5+3
第一個ADD是指令。在運行時處理。


第二個“+”是一個表達式,編譯時處理。

329.MOV AX,WORD PTR X
X是其它類型的,AX是WORD類型的。用WORD PTR進行類型轉換。



330.DB能夠定義:
(1)單字節數據
(2)字符串(按順序放)

下面是內存單元:
MESSAGE DB ‘HELLO’



331.DW能夠定義:
(1)雙字節數據
(2)僅僅能為長度為2的字符串
(3)地址表達式 EA

下面是內存單元:



332.DD能夠定義:
(1)雙字數據
(2)僅僅能放長度為4的字符串
(3)地址表達式

下面是內存單元:



333.子程序結束  ENDP
源程序結束   END

334.$表示當前地址




335.匯編上機過程:
(1)用編輯程序建立ASM源文件;
(2)用MASM程序把ASM文件匯編成OBJ文件;
(3)用LINK程序把OBJ文件連接成EXE文件;
(4)用DOS命令直接鍵入文件名稱就可運行該程序;

336.匯編程序的主要功能:
(1)檢查源程序語法是否正確;
(2)測出源程序中的語法錯誤,並給出錯誤信息;
(3)產生目標程序;
(4)展開宏指令

337.OBJ是二進制文件。
338.匯編過程生成3個文件,
EXAM.OBJ   :一定須要
EXAM.LST   :可有可無
EXAM.CRF   :可有可無

339.警告錯誤:WARNING ERRORS
嚴重錯誤:  SEVERE ERRORS

340..ASM (MASM匯編).OBJ(LINK 連接).EXE
341.DEBUG命令
A命令(匯編命令),逐行輸入匯編程序

—A 回車
2A7D :  0100  MOV AX,0201     ;地址自己主動給出
2A7D :  0103  MOV BX,0200
2A7D :  0106  MOV CX,0001
2A7D :  0109  MOV DX,0000
2A7D :  010C  INT 13
2A7D :  010E  INT 3
2A7D :  010F                ;結束輸入
段地址:偏移地址 自己主動給出

342.G命令  運行
—G=100 回車     ;從地址100H處開始運行

343.T命令  跟蹤運行
每條指令運行后,都要暫停並顯示各寄存器的內容。實際上是單步運行。

—T=0100  3      ;從地址0100H開始運行,運行3條命令

344.U命令   反匯編
—U 100 回車           。從地址100H處開始反匯編
能夠看到源碼的段地址和偏移地址。

345.D命令    顯示內存
將調入內存的程序以十六進制形式以及相應的ASCII形式顯示出來。

—D 100,200  回車
顯示內存地址從100至200這一段的內容。

346.地址計數器 $
JNZ $+6     ;JNZ指令的首地址加上6
當$用在指令中。表示本條指令的第一個字節的地址。

$+6必須是還有一條指令的首地址。

$用在偽操作的參數字段時,表示的是地址計數器的當前值。

347.ORG偽操作:用來設置當前地址計數器的值。



格式:
ORG 常數表達式

如常數表達式的值為N。則ORG偽操作能夠使下一個字節的地址成為常數表達式的值N。

VECTORS SEGMENT
ORG 10
VECT1 DW 47A5H
ORG 20
VECT DW 0C596H
VECTORS ENDS

348.ORG $+8        ;表示跳過8個字節的存儲區,亦即建立起8字節的未初始化的數據緩沖區。
349.TYPE運算符:返回變量或標號的類型值(屬性值)
350.LENGTH運算符:返回變量數據區分配的數據項總數
351.SIZE運算符:返回變量數據區分配的字節個數
352.    8086CPU在基址變址尋址方式中,基址寄存器能夠是(B)
A.AX或CX   B.BX或BP       C.SI或BX      D.DX或DI

353下列傳送指令中有語法錯誤的是(A)
A.MOV CS,AX     B.MOV DS,AX    C.MOV SS,AX        D.MOV ES,AX
解:不同意給CS/IP/PSW三個寄存器傳送數據,即這三個寄存器的值用戶無法改變。



354.邏輯移位指令SHR用於:D
A.帶符號數乘2              B.帶符號數除2
C.無符號數乘2              D.無符號數除2

355.邏輯移位指令
(1)SHL
(2)SHR
都用於無符號數

356.算數移位指令
(1)SAL
(2)SAR
用於有符號數

357.
STR1 DW ‘AB’
STR2 DB 14 DUP(?

)
CNT EQU $-STR1
MOV CX,CNT
MOV AX,STR1
則寄存器CL的值是(A)
A.10H        B.12H            C.0EH            D.0FH

J寄存器AX的值是(C)
A.00ABH         B.00BAH         C.4142H           D.4241H

358.簡述匯編語言的上機過程:
(1)用編輯軟件編輯擴展名為.ASM的源程序。
(2)用匯編程序MASM匯編源程序產生目標文件.OBJ;
(3)用連接程序LINK連接目標程序產生可運行文件 .EXE。
(4)用DOS直接鍵入文件名稱執行可執行程序,或進入DEBUG調試;

259.運行段內返回RET指令時,運行的操作是:
IP((SP)+1。(SP))
SP(SP)+2

260.運行段間返回RET指令時,運行的操作是:
IP((SP)+1,(SP))
SP(SP)+2
CS((SP)+1,(SP))
SP(SP)+2

261.其中斷發生時。由中斷機構自己主動完畢哪些動作?(中斷過程)
(1)取中斷類型號,標志寄存器內容入棧。
(2)當前代碼段寄存器入棧,當前指令計數器入棧。
(3)禁止硬件中斷和單步中斷,從中斷向量表取4N的字內容送IP及4N+2的字內容送CS,轉中斷處理程序;

262.
DATA SEGMENT
ORG 0020H
BUFF DB 6。5,’78’
ARRAY DW 5,67,8
BASUB EQU ARRAY-BUFF
DATA ENDS
該數據段已占有的存儲字節數是:10字節
BASUB的值:4

263.
A1 DB 10 DUP(?)
A2 DB 0,1。2,3。4,5。6,7,8。9

MOV CX,LENGTH A1
MOV SI,SIZE A1-TYPE A1
LOP:MOV AL,A2[SI]
MOV A1[SI],AL
SUB SI,TYPE A1
DEC CX
JNZ LOP

運行后,A1單元開始的10個字節的內容:0,1,2,3,4,5,6,7,8,9
功能:將A2中的10個數據傳送到A1中的10個字節單元。



264.當運行指令ADD AX,BX 后,若AX的內容為2BA0H,設置的奇偶標志位PF=1,則正確的是(D)   ???不懂
A.表示結果中含1的個數為偶數
B.表示結果中含1的個數為奇數
C.表示該數為偶數
D.表示結果中低8位含1的個數為偶數

265.串反復前綴指令
REP :     (CX)=0,則退出本條指令的運行,否則繼續運行。
REPZ/REPE:   當(CX)=0即數據串比較完畢或ZF=0即某次比較結果不相等時退出。

266.在串操作指令前使用反復前綴指令REPE,終止串的反復操作條件是(C)
A.CX=0且ZF=0
B.CX=0且ZF=1
C.CX=0或ZF=0
D.CX=0或ZF=1

267.以下指令中,合理而有意義的指令是(D)
A.REP LODSB
B.REP SCASB
C.REP CMPSB
D.REP MOVSB

MOVS是串傳送指令,MOVSB傳送一個字節

268.以下的數據傳送指令中。錯誤的操作是(D)
A.MOV SS:[BX+DI],1000H
B.MOV DX,1000H
C.MOV WORD PTR[BX],1000H
D.MOV DS,2000H

馬上數不能直接送段寄存器,即段寄存器僅僅能通過寄存器或存儲單元傳送數據。

269.運行下列指令后,正確的結果是(B)
MOV AL,100
MOV BL,-2

A.AL=100H,BL=02H
B.AL=64H,BL=0FEH
C.AL=64H,BL=82H
D.AL=100H,BL=0FEH

270.
依據某一個標志位的值來決定是否轉移。測試的標志位有S/Z/C/P/O五個。

適用於測試某一次運算的結果並依據不同的結果做不同的處理。
(1)JZ    ;條件ZF=1時轉移。結果為零則轉移。
(2)JNZ   。條件ZF=0時轉移。結果不為零則轉移。


(3)JS   ;條件SF=1時轉移。

結果為負則轉移。
(4)JNS  ;條件SF=0時轉移。結果為正則轉移。


(5)JO   ;條件OF=1時轉移。

結果為溢出則轉移。
(6)JNO   。條件OF=0時轉移。

結果無溢出則轉移。
(7)JP    。條件PF=1時轉移。

奇偶位為1則轉移。
(8)JNP   ;條件PF=0時轉移。

奇偶位為0則轉移。


(9)JC    。條件CF=1時轉移。

有進位則轉移。


(10)JNC   ;條件CF=0時轉移。無進位則轉移。



JZ 同JE
JNZ 同JNE

JMP是無條件轉移。



271.測試BL寄存器內容是否與4FH相等。若相等則轉NEXT處運行。代碼為(B)
A.TEST BL,4FH
JZ NEXT

B.XOR BL,4FH
JZ NEXT

C.AND BL,4FH
JZ NEXT

D.OR BL,4FH
JZ NEXT

272.
D1 DB 20H DUP(?

)
D2 DW D1
用一條指令實現取D1的偏移地址放到SI  3種方法
MOV SI,OFFSET D1
LEA SI,D1
MOV SI,D2

273.PSW寄存器共同擁有6位條件狀態位,3位控制狀態位。
274.ADD/ADC/INC除INC不會影響CF外。其它都會影響CF/ZF/SF/OF

275.SHL/SHR/SAL/SAR  對標志位的影響是一樣的。

276.注意NEG是求補,而不是求反。


277.假定(DX)=10111001B。(CL)=3。(CF)=1。試確定下列各條指令單獨運行后DX中的值。


(1)SHR DX,1
(2)RCR DL,1
(3)RCL DX,CL


DX:0000 0000 1011 1001
移動后:
DX:0000 0000 0101 1100
所以:
(DX)=005CH

RCR:帶進位循環右移指令
操作:操作數循環右移指定次數

RCL:帶進位循環左移指令
操作:操作數循環左移指定次數

DX:0000 0000 1011 1001
移動后:
DX:0000 0000 1101 1100
所以:
(DX)=00DCH

運行后:
DX:0000 0101 1100 1000
所以
(DX)=05C8H

278.
MOV AL,25H
SHL AL,1
MOV BL,15H
MUL BL
運行后,AX的內容為?

解:
25H*2*15H=1554D

全都化成十進制計算。

279.程序:
DATA SEGMENT
ORG 0020H

DA1 DW 12H,23H
DA2 DB 11H,21H
DA3 EQU 1234H
DA4 EQU $-DA2
DA5 DB 31H,32H
DATA ENDS

該程序段已占有的存儲字節數是多少?
DA4的值? DA5的值?
解:
(1)8
(2)2   0026H

注意:EQU定義的符號名不占存儲空間。

280.
ORG 1221H
NUM DW 12H

MOV CH,TYPE NUM
MOV AX,NUM
MOV BX,OFFSET NUM
MOV CL,BYTE PTR NUM+1
HLT

所以:
(AX)=0012H,(BX)=1221H,(CX)=0200H

ORG是設置該程序段的偏移地址。

281.程序
ADRR DB XXH,XXH,…,XXH
NUM EQU $-ADRR
RETT DB ?



MOV CX,NUM
MOV BX,-1
DON:INC BX
CMP ADRR[BX],0
LOOPZ DON
JNZ NEXT
MOV BL,0FFH
NEXT:MOV RETT,BL
HLT

功能?
RETT的內容是什么?

解:
在以ADRR為起始地址的數組中,查找第一個非零數據。
若找到則將第一個非零數據在數組中的偏移量送入RETT單元中。若無非零數據。則將0FFH送入RETT單元中。

282.循環控制指令測試條件



283.循環控制指令LOOPNZ/LOOPNE控制循環繼續運行的條件是(B)
A.CX≠0且ZF=1
B.CX≠0且ZF=0
C.CX≠0或ZF=1
D.CX≠0或ZF=0

284.壓縮BCD碼指每一個字節存儲兩個BCD碼
非壓縮BCD碼指每一個字節存儲一個BCD碼,當中低4位存儲數字的BCD碼,高4位為0.

285.使計算機運行某種操作的命令是(B)
A.偽指令
B.指令
C.標號
D.助記符

286.將數據5618H存放在存儲單元中的偽指令是(B)
A.DATA1 DW 1856H
B.DATA1 DB 18H,56H
C.DATA1 EQU 5618H
D.DATA1 DB 18H,00H,56H,00H

287.設DS=2200H,BX=1000H,SI=0100H,偏移量D=0A2B1H,計算出下列各種尋址方式的有效地址:
(1)使用D的直接尋址:0A2B1H
(2)使用BX的寄存器間接尋址:1000H
(3)使用BX和D的寄存器相對尋址:0B2B1H
(4)使用BX、SI和D的相對基址變址尋址:0B3B1H
(5)使用BX、SI的基址變址尋址:1100H

288.如TABLE為數據段中0100單元的符號名,當中存放的內容為0FF00H,下面兩條指令有什么差別?AX寄存器的內容各自是什么?
(1)MOV AX,TABLE
(2)MOV AX,OFFSET TABLE

是傳送TABLE中的內容。(AX)=0FF00H
是傳送TABLE的地址,(AX)=0100H

289.對於以下的數據定義,三條MOV指令分別匯編成什么?
TAB1 DW 10 DUP(?

)
TAB2 DB 10 DUP(?)
TAB3 DB ‘1234’

MOV AX,LENGTH TAB1
匯編成:
MOV AX,10

 MOV BL,LENGTH TAB2
匯編成:
MOV BL,10

MOV CL,LENGTH TAB3
匯編成:
MOV CL,1

290.MOV CX,DATA[SI]     ;寄存器相對尋址
注意:沒有存儲器間接尋址!!

。也沒有存儲器相對尋址!!。

馬上尋址
寄存器尋址(寄存器直接尋址)
寄存器間接尋址
直接尋址(存儲器直接尋址)
寄存器相對尋址
基址變址尋址
相對基址變址尋址

291.無符號數比較時,用“高於”或“低於”來做推斷根據。


有符號數比較時,用“大於”或“小於”來做推斷根據。



低於  Below
高於  Above
大於  Greater
小於  Less

轉移指令中,大部分指令能夠用兩種不同的助記符來表示。

比方。一個數低於還有一個數和一個數不高於也不等於還有一個數是等同的。
即JB和JNAE是等同的。

292.比較兩個無符號數的大小
兩個無符號數比較大小時,機器依據CF標志位來推斷大小。若兩無符號數相減,若不夠減,則最高位有借位,CF=1,否則CF=0.
所以
當CF=1時,說明被減數低於減數。
當CF=0且ZF=0時,說明被減數高於減數。
當CF=0且ZF=1時。說明被減數等於減數

293.
無符號數比較條件轉移指令表


294.變量TABLE中存放了一個偏移地址。當無符號數X小於、等於或大於此偏移地址時,應去運行三個不同的程序段。


MOV BX,TABLE
MOV AX,X
CMP AX,BX
JA SS3
JZ SS2
SS1:…   ;低於程序段
SS2:…   。等於程序段
SS3:…   ;高於程序段

295.比較兩個有符號數
兩個有符號數比較大小時,機器依據SF標志位來推斷大小。
無溢出時,OF=0.若被減數小於減數。差值為負。則SF=1。否則SF=0.
溢出時。OF=1,此時SF標志位顯示的正負性與應該得的正確結果值的正負性相反。SF=0表示被減數小於減數;SF=1表示被減數大於減數。


當OF=0且SF=1或OF=1且SF=0時。即SF∨OF=1。表示被減數一定小於減數。
當OF=0且SF=0且ZF=0或OF=1且SF=1時,(此時ZF=0)。前數一定大於后數。

有符號數比較條件轉移指令


296.試分析以下程序段的功能是什么?
CMP AL,’A’
JC OTHER
CMP AL,’Z’
JNZ OTHER
JMP LETTER

OTHER:…
LETTER:…

推斷AL的內容,若為‘A’~‘Z’的大寫字母時,程序段 LETTER處理,否則轉OTHER處理。



297.計算機中為便於存儲及計算機的物理實現,採用(A)。
A.二進制數     B.十進制數    C.八進制數     D.十六進制數
298.在86系列的CPU中。訪問IO設備採用(B)方式。
A.統一地址    B.獨立地址    C.混合地址     D.直接地址

299.機器指令是在程序執行期間由計算機來執行的。
偽指令是匯編程序對源程序進行匯編時處理的。僅僅提供有關信息。不產生機器代碼。

300.偽指令在程序(B)階段被處理。
A.編寫    B.匯編    C.連接    D.執行

301.在程序的開始能夠用NAME或TITLE作為模塊的名字。

但NAME和TITLE偽指令不是必要的。

302.一個完整、獨立的匯編語言源程序能夠沒有(C)偽指令。
A.段定義    B.存儲模式定義    C.程序開始   D.程序結束

303.JMP NEAR PTR [BX]使用(A)段寄存器。
A.CS,DS    B.DS,ES     C.ES,SS      D.DS,SS

304.響鈴符的ASCII編碼為(D)
A.0DH    B.OAH     C.20H    D.07H

305.   0~9的ASCII值為30H~39H
而字母A的ASCII值為41H

306.從微處理器的角度來看,計算機結構可分為CPU、內存、和IO子系統三個主要部分。
307.匯編語言源程序中的每一個語句由4部分組成,各自是:名字、操作碼助記符、操作數、和凝視。


308.指令MOV DL,1000H[SI]中。源操作數的地址是SI+1000H.
309.匯編語言程序的最后一條指令是匯編結束偽指令。


310.能夠改動其值的定義符號常量的偽指令是等號(=)偽指令。
311.MOV AX,@DATA 中AX的值是由操作系統在程序執行之前傳過來的。
312.     .STACK偽指令默認分配1024字節的棧空間。
313.在8086中。一個邏輯段最長為64K字節。


314.8086CPU加電后運行的第一條指令的物理地址為FFFF:0000  或寫成 FFFF0。
315.DB ‘AB’定義了2個字節。在內存中的16進制代碼按順序為41H。42H。


316.將寄存器AX置零:
MOV AX,0
或者
XOR AX,AX
317.將寄存器AL的內容乘以BL的內容,結果送到BX寄存器中。
MUL BL
MOV BX,AX
318.若AX為零則轉向短標號LABLE
CMP AX,0
JZ LABEL
或者
OR AX,AX
JZ LABEL

319.將AX的一個字輸出到port3D9H
MOV DX,3D9H
OUT DX,AX

320.操作系統1號功能調用(輸入一個字符)
MOV AH,01H
INT 21H

321.已知在內存中有一個字節單元NUM,存有帶符號數據,要求計算它的絕對值后,放入RESULT單元中。


解:
DATA SEGMENT
X DB,?


DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0
JGE NEXT
NEG AL
NEXT:
MOV RESULT,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START

322.編寫計算以下函數值的程序:
Y=1,X>0
 =0,X=0
 =-1,X<0
設輸入數據為X,輸出數據為Y,且都是字節變量。
解:
DATA SEGMENT
X DB -25
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0
JGE BIG
MOV BL,-1
JMP EXIT
BIG:JE EE
MOV BL,1
JMP EXIT
EE:MOV BL,0
EXIT:MOV Y,BL
MOV AH,4CH
INT 21H
CODE ENDS
END START

323.程序:把BX寄存器內的二進制數用十六進制數的形式在屏幕上顯示。



解:
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE
START:PUSH DS
SUB AX,AX
PUSH AX
MOV CH,H    ;CH存放循環計數值
LP:MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINTA
ADD AL,07H
PRINTA:MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ LP
RET
MAIN ENDP
CODE ENDS
END START

324.程序:在ADDR單元中存放着數Y的地址,編一程序把Y中1的個數存入COUNT單元中。
解:要測出Y中1的個數,就應逐位測試。

能夠依據最高有效位是否為1來計數。然后用移位的方法把各位數逐次移到最高位去。



TITLE 數1程序
DATA SEGMENT
ADDR DW NUMBER
NUMBER DW Y
COUNT DW ?


DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,0
MOV BX,ADDR
MOV AX,[BX]
REPEAT:CMP AX,0
JZ EXIT
JNS SHIFT
INC CX
SHIFT:SHL AX,1
JMP REPEAT:REPEAT
EXIT:MOV COUNT,CX
RET
MAIN ENDP
CODE ENDS
END START

325.JS   SF=1    ;結果為負則轉移
   JNS  SF=0    ;結果為正則轉移

326.冒泡排序

解:
DATA SEGMENT
A DW N DUP(?)
DATA ENDS
PROGRAM SEGMENT
MAIN PROC FAR
ASSUME CS:PROGRAM,DS:DATA
START:PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1:MOV DI,CX
MOV BX,0
LOOP2:MOV AX,A[BX]
CMP AX,A[BX+2]
JGE CONTINUE
XCHG AX,A[BX+2]
MOV A[BX],AX
CONTINUE:ADD BX,2
LOOP LOOP2
MOV CX,DI
LOOP LOOP1
RET
MAIN ENDP
PROGRAM ENDS
END START

327.偏移量=偏移地址=有效地址=段內地址
328.程序:在數組中有50個單字節有符號數,分別統計0,負數,正數個數。

解:
DATA SEGMENT
X DB 50 DUP(?)
N0 DB 0
N1 DB 0
N2 DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,50
MOV SI,0
PO:CMP X[SI],0
JNZ P1
INC N0
JMP P5
P1:JL P3
INC N2
JMP P5
P3:INC N1
P5:INC SI
DEC CX
JNZ P0
MOV AH,4CH
INT 21H
CODE ENDS
END START



注意:
DEC CX
JNZ P0
等價於
LOOP P0

329.過程定義偽指令
可把具有獨立功能的程序段定義為過程。供其它程序調用。



<過程名> PROC NEAR/FAR

RET
<過程名> ENDP

調用:
CALL [NEAR/FAR PTR] 子程序名

330.標志設置指令




331.字長為n
(1)無符號數范圍:
(2)有符號數范圍:
補碼:
原碼、反碼:

332.BCD都是無符號數。
333.  17D
(1)壓縮BCD碼:0001 0111B     17H
(2)非壓縮BCD碼:0000 0001 0000 0111B    0107H

334.   235D
(1)壓縮BCD碼:0010 0011 0101B    235H
(2)非壓縮BCD碼:。

。。。

。。。

。    020305H

335.    14個寄存器
(1)通用寄存器:
AX,BX,CX,DX
變址:SI,DI,BP,SP

段寄存器:CS,DS,SS,ES

控制寄存器:
IP
FLAG(PSW)

336.H計算機剛一啟動時,物理地址是多少?
CS:FFFF   其它寄存器全為0
物理地址=(CS)*10H+(IP)=FFFF0H

337.代碼段:(CS)*10H+IP
數據段:(DS)*10H+EA
堆棧段:(SS)*10H+SP

338.復習port號指令:  IN  OUT

IN AL,78H   ;78H是地址,是把78Hport的內容送AL
IN AL,DX    ;DX是地址。用DX去找外設的地址,然后取出內容送AL

339.實模式就是一般模式。就是我們經常使用的模式。
340.宏定義:

宏名 MACRO 形參

宏名 ENDM

調用:
宏名 實參

341.8086微處理器由哪幾部分組成?
EU   BIU
342.80X86中。存儲器為什么採用分段管理?
(1)內部16位,外部20位。所以要把20位地址分為不超過16位的段,便於訪問。
(2)便於模塊化編程。



343.IN輸入指令
格式:IN AL,IO地址表達式
  或  IN AX,IO地址表達式

操作:
AL(IO地址表達式)

AL(IO地址表達式+1)。(IO地址表達式)

功能:完畢IOport對累加器的數據輸入。



344.OUT輸出指令
格式:OUT IO地址表達式。AL

OUT IO地址表達式。AX

操作:(IO地址表達式)AL

(IO地址表達式+1),(IO地址表達式)AL

功能:完畢累加器對IOport的數據輸出。

345.AND AL,    
TEST AL,     
對標志位的影響一樣,AND最后結果送AL,TEST最后結果不送AL。



類比:
SUB AX。     
CMP AX,     


346.空格的ASCII碼是:20H
347.顯示字符代碼:
MOV DL,’字符’
MOV AH,02H
INT 21H

348.輸入字符代碼:
MOV AH,01H
INT 21H
等待用戶輸入

349.試編制一程序:從鍵盤輸入一行字符,要求第一個鍵入的字符必須是空格符。如不是,則退出程序。如是。則開始接收鍵入的字符並順序存放在首地址為BUFFER的緩沖區中(空格符不存放)。直到接收到第二個空格符時退出程序。


分析:這一程序要求接收的字符從空格符開始又以空格符結束,因此程序中必須區分所接收的字符是否是第一個字符。所以。設立作為標志的存儲單元FLAG。

一開始將其置為0。接收第一個字符后可將其置1.

解:
DATA SEGMENT
BUFFER DB 80 DUP(?

)
FLAG DB ?
DATA ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATA1
START:PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA1
MOV DS,AX
LEA BX,BUFFER
MOV FLAG,0
NEXT:MOV AH,01H
INT 21H
TEST FLAG,01H
JNZ FOLLOW
CMP AL,20H
JNZ EXIT
MOV FLAG,1
JMP NEXT
FOLLOW:CMP AL,20H
JZ EXIT
MOV [BX],AL
INC BX
JMP NEXT
EXIT:RET
MAIN ENDP
CODES ENDS
END START

350.NEAR調用改變IP。不改變CS;
FAR調用改變IP,改變CS;

351.調用程序和子程序在同一代碼段中
SEGX SEGMENT

MAIN PROC FAR   。主程序

CALL SUBR1       ;子程序調用

RET
MAIN ENDP

SUBR1 PROC NEAR   ;子程序定義

RET
SUBR1 ENDP

SEGX ENDS

352.調用程序和子程序不在同一個代碼段中
SEGX SEGMENT

SUBT PROC FAR    ;子程序定義

RET
SUBT ENDP

CALL SUBT    ;子程序調用(同一個段中調用)
SEGX ENDS

SEGY SEGMENT

CALL SUBT    ;子程序調用(不同段中調用)

SEGY ENDS

353.普通子程序
CODE SEGMENT
ASSUME CS:CODE
START:

CALL 子程序1

MOV AH,4CH
INT 21H

子程序1  PROC NEAR

RET
子程序1  ENDP
CODE ENDS
END START

354.子程序作主程序
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC FAR
START:PUSH DS
XOR AX,AX
PUSH AX
CALL 子程序1

RET
MAIN ENDP

子程序1  PROC NEAR

RET
子程序1  ENDP

355.狀態標志位

0011 1101
+1101 1011
 0001 1000


356.各種DEBUG命令
A命令——匯編
G命令——運行
T命令——跟蹤運行
U命令——反匯編
D命令——顯示內存
E命令——將內容寫入內存
R命令——改動寄存器

357.尋址方式
(1)馬上尋址:MOV AX,7896H
(2)寄存器尋址:MOV AX,BX
(3)存儲器直接尋址:MOV AX,[3792H]
(4)寄存器間接:MOV AX,[BX]

358.不考:
(1)串操作指令
(2)BCD調整失靈·指令
(3)折半查找

359.  P73 中斷  要保護PSW
360.
ORG 200H
X DB 78H,96H,’ABCD’,2 DUP(?)
Y DW 78H,’AB’,X+5,$



361.
選擇 2’*10
填空 1’*20
讀程序 5’*6
推斷 1’*5
編程 25’
必考冒泡排序

362.RET返回指令
(1)段內返回
操作:
IP((SP)+1,(SP))
SP(SP)+2

(2)段間返回
操作:
IP((SP)+1,(SP))
SP(SP)+2
CS((SP+1),(SP))
SP(SP)+2

363.
MOV AX,1234H      馬上尋址
MOV AX,BX          寄存器直接尋址
MOV AX,[BX]       寄存器間接尋址
MOV AX,TABLE     TABLE是一個變量名,存儲器直接尋址
MOV AX,[1234H]    存儲器直接尋址
MOV AX,[BX+1234H]   寄存器相對尋址
MOV AX,[BP][SI]     基址變址尋址
MOV AX,[BX+SI-1234H]    相對基址變址尋址

364.求AL中的內容
ABC EQU 2
DATA1 DB 20H
DATA2 DW 1000H

START:MOV AL,DATA1+ABC


所以:(AL)=10H
365.MOV CS,AX     ;錯誤
由於:
不能直接向段寄存器傳送數據;
CS的值不能由人為改動;

366.在8086/8088微處理器中,PUSH和POP指令在堆棧與寄存器或存儲單元之間傳送數據時,一次總是傳送2個字節。
367.INC [BX]    ;錯誤
由於:[BX]所指單元中的內容類型不確定,不知道是字節類型還是字類型,不同類型自加的大小不一樣。字節類型自加1,字類型自加2

368.ENDS
ENDP
ENDM
369.做P106   4.3
P107   4.12

370.子程序作主程序。必須用FAR
371.怎樣進行宏展開
INOUT MACRO X,Y     ;X。Y是形參
MOV AH,X
LEA DX,Y
INT 21H
ENDM

程序中遇到:
INPUT 9,INPUT    ;9。INPUT是實參

則展開為
+ MOV AH,9
+ LEA DX,INPUT
+ INT 21H

372.期中考試2個編程。
373.XLAT換碼指令
格式:XLAT

XLAT 地址標號
操作:(AL)((BX)+(AL))
說明:(1)XLAT指令是將AL的內容替換成存儲單元中的一個數,往往用於代碼轉換,比如把字符的掃描碼轉換成ASCII碼或者把十六進制數0~F轉換成七段數碼管顯示代碼。


使用該指令前,先在數據段建立一個表格,表格首地址存入BX寄存器中,欲代替碼的表內位移量存入AL寄存器。



374.(期中)
-64D的補碼是C0H。

375.(期中)
運行CALL指令,寄存器IP的內容一定改變。

376.下列指令中哪條是正確的(D)
A.MOV DS,0200H       B.MOV AX,[SI][DI]
C.MOV BP,AX          D.MOV BYTE PTR [BX],1000

A錯:馬上數不能直接送段寄存器。即段寄存器僅僅能通過寄存器或存儲單元傳送。


B錯:源操作數都是變址寄存器。


C錯:普通寄存器不能向變址寄存器傳數據。

377.使8086/88的標志寄存器F中的中斷標志I置為關中斷的命令是CLI。


378.指令LOOPZ標號轉移到標號(循環)的條件是 CX!=0且ZF=1.
379.SUB AX,[BX]目的操作數的尋址方式是寄存器直接尋址,源操作數採用的尋址方式是寄存器間接尋址。


380.   8086CPU內部按功能分為兩大部分即EU和BIU。


381.   8088微處理器段內直接尋址64KB字節空間。若尋址1MB字節空間必須通過段寄存器管理實現。
382.設(SS)=2000H。(SP)=0486H,若在堆棧中取出3個數據。則棧頂的物理地址為2048CH。假設又在堆棧中存入3個數據,則棧頂的物理地址是20486H。

注意:堆棧中數據的壓入彈出必須以字節為單位,所以PUSH和POP指令僅僅能作字操作。

383.中斷系統的中斷矢量表用來存放中斷類型號,共預留了1KB個字節空間。
384.A、B兩數相等的條件能夠用FR中的ZF標志位為1來推斷。
385.15D的原碼是00001111。反碼是00001111,補碼是00001111,壓縮BCD碼是15H。


386.MOV AX,9876H
MOV DL,0
MOV CX,16
AGAIN:SHL AX,1
JNC NEXT
INC DL
NEXT:LOOP AGAIN
MOV SUM,DL
程序的功能是:數AX中1的個數。


SUM的值是:8

387.已知AL=3,分析下列程序段:
SHL AL,1
MOV BL,AL
SHL AL,1
SHL AL,1
ADD AL,BL
SHL AL,1
程序完畢的功能是AL擴大20倍,運行后結果是AL=60.

388.繪圖說明下列語句所分配的存儲空間及初始化的數據值。
(1)BYTE_VAR DB ‘BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?)
(2)WORD_VAR DW 5 DUP(0,1,2),?,-5,’BY’,’TE’,256H

389.
DATA_BYTE DB 10,4,10H
DATA_WORD DW 100,100H,-5
DATA_DW DD 3C,0FFFDH



390.



391.操作數?能夠保留存儲空間。但不存入數據。

得到程序執行時存放中間或終於結果。
ABC DB 0,?,?,0
DEF DW ?,52,?



392.ARRAY1 DB 2 DUP(0,1,2,?)
ARRAY2 DB 100 DUP(?

)



393.ARRAY3 DB 100 DUP(0,2 DUP(1,2),0,3)



394.依據偽指令代碼寫內存情況是難點和必考點。

應該再次復習。尤其搞懂關於字符串的存放問題,DB和DW是不一樣的,應再次學習。

395.BP、SP可稱為指針寄存器
SI、DI可稱為變址寄存器

396.一般在作雙字長運算時把DX和AX組合在一起存放一個雙字長數,DX用來存放高位字。



397.        

第7位                                                                第0位

398.段寄存器也是一種專用寄存器。專用於存儲器尋址,用來直接或間接的存放地址。段寄存器的長度為16位。
注:SP/BP/SI/DI也是16位。

399.在存儲器里以字節為單位存儲信息。
400.為了正確的存放或取得信息。每個字節單元給出一個唯一的存儲器地址,稱為物理地址。

地址從0開始編號,順序的每次加1,因此存儲器的物理地址空間是線性增長的,在機器里,地址是用二進制表示的,是無符號整數。書寫格式使用十六進制數形式。


401.地址編號的范圍用十六進制數表示為0000H~FFFFH。


402.存儲器特性:內容是能夠重復讀取的。僅僅有當存入新的信息后。原來的內容就自己主動被覆蓋了。
403.8080/8088僅僅能在實模式下工作,僅僅需了解實模式。
404.80X86存儲器在實模式下同意的最大尋址空間為1MB。由於地址總線寬度為20位。
405.每一個段的大小可達64KB。由於地址寄存器是16位的,這樣段內地址可用16位表示。
406.在1MB的存儲器里,每個存儲單元都有一個唯一的20位地址。稱為該存儲單元的物理地址。
407.CS存放當前正在執行的程序;
DS存放當前執行程序的數據;
SS定義了堆棧所在區域。
ES是附加數據段;

408.段寄存器和偏移地址的默認組合


409.尋址方式分為:數據尋址和指令尋址
410.假設指令中指定的寄存器是BX/SI/DI。則操作數默認在DS中,假設指定的寄存器是BP。則操作數默認在SS中。
411.馬上數不能直接送段寄存器,即段寄存器僅僅能通過寄存器或存儲單元傳送數據。
412.兩個段寄存器之間不能直接傳送數據。
413.PUSH:
(SP)(SP)-2
((SP)+1,(SP))(SRC)     //理解
414.POP:
(DST)((SP)+1,(SP))
(SP)(SP)+2

415.XCHG指令
(1)源、目的操作數的尋址方式不同意是馬上尋址方式。
(2)兩個尋址方式中,必須有一個是寄存器尋址,兩個存儲單元之間不能直接互換數據;

416.NEG指令
0-操作數=-操作數。

在微型計算機中,帶符號的二進制數都採用補碼表示。所以此處的操作數是補碼,所以求 –操作數 就是求補操作。



417.將(AX)乘以10
分析:十進制數10的二進制形式為1010。即權為2和權為8的位為1,故採用2*(AX)+8*(AX),結果為10*(AX)

SHL AX,1
MOV BX,AX
SHL AX,1
SHL AX,1
ADD AX,BX

418.

419.有符號數比較大小:機器依據SF標志位來推斷大小。即若被減數小於減數,差值為負,則SF=1;否則SF=0。前提是無溢出 OF=0.

420.語句格式:
[標號:] 助記符 [操作數] [;凝視]
即匯編語句由4部分組成:標號。助記符,操作數。凝視

421.名字的定義規則:
(1)數字不能作為名字的第一個符號。
(2)單獨的問號(?)不能作為名字。
(3)一個名字的最大有效長度為31,超過31的部分計算機不再識別。
(4)特定含義的保留字。操作碼,寄存器名,不能作為名字。

422.匯編字符串用單引號。如:‘ABC’
423.邏輯運算符和邏輯運算指令是有差別的。


邏輯運算符的功能在匯編階段完畢,邏輯運算指令的功能在運行時完畢。


424.
AND AL,78H AND 0FH
匯編后。等價於:
AND AL,08H

第一個AND是邏輯運算指令,第二個AND是邏輯運算符

425.在匯編階段處理:偽指令、宏指令、運算符
426.為什么說程序開始偽指令是能夠省略的?
答:由於程序開始是用NAME或TITLE作為模塊的名字,並非必須的。
而結束偽指令 END則是必須的。


427.對於以下的數據定義。各條MOV指令單獨運行后,有關寄存器的內容是什么?
FLDB DB ?
TABLEA DW 20 DUP(?)
TABLEB DB ‘ABCD’

MOV AX,TYPE FLDB
MOV AX,TYPE TABLEA
MOV CX,LENGTH TABLEA
MOV DX,SIZE TABLEA
MOV CX,LENGTH TABLEB

428.某系列微機對存儲器分段。假設每個段最多的字存儲單元(16位二進制)是32K。那么表示段內字節單元偏移地址的二進制位數應是(B)
A.20位        B.16位           C.15位           D.12位

429.
ORG 0030H
DA1 DB 0,’0’,30H
DW DA1
數據為3000H字存儲單元的偏移地址是(A)
A.0030H     B.0031H     C.0032H        D.0033H

430.NUM1 DB (12 OR 6 AND 2) GE 0EH
NUM2 DB (12 XOR 6 AND 2) LE OEH
上述數據定義中,NUM1和NUM2字節單元的內容各自是(B)
NUM1=0,NUM2=0
NUM1=0,NUM2=0FFH
NUM1=0FFH , NUM2=0
NUM1=0FFH , NUM2=0FFH

431.MOV指令中目的操作數不能為馬上數和CS。
432.R命令:顯示寄存器的內容,然后改動其值。
433.8086/8088 CPU可訪問2個獨立的地址空間,一個為存儲器地址空間,大小為1MB個字節;還有一個為IOport,大小為64KB字節。

434.運行下列指令后,AX寄存器中的內容是什么?
START DW 10H,20H,30H,40H,50H
EE1 DW 3

MOV BX,OFFSET START
ADD BX,EE1
MOV AX,[BX]


解:(AX)=3000H

435.指令的操作數中,同意出現表達式,比如BUF1與BUF2均為變量名,以下指令中語法正確的是(D)
A.MOV AX,BUF1*BUF2
B.MOV AX,BUF1/BUF2
C.MOV AX,BUF1+ES:BUF2
D.MOV AX,BUF2-BUF1

436.在8086/8088的馬上數尋址方式中,對寄存器的使用下列說法正確的是(D)
A.使用AX,BX,CX,DX
B.使用SI,DI,BP,SP
C.使用任一個通用寄存器
D.不使用不論什么寄存器

437.在DEBUG中,為查看或改動內存單元的內容。使用的命令是(A)
A.  D或E     B.   D或R      C.   R或E     D.    D或U

E命令:將內容寫入內存
R命令:顯示寄存器的內容,然后改動其值

438.對CS段寄存器賦段地址的方法是(B)
A.MOV AX,CODE
MOV CS,AX

B.ASSUME CS:CODE

C.END起始地址

D.MOV CS,2050H

439.設SP=4AH,運行段內返回指令RET 4后。SP的值是(A)
A.50H        B.48H       C.4CH             D.44H

解:
(1)段內帶馬上數返回
格式:RET 表達式
運行的操作:
IP((SP+1),(SP))
SP(SP)+2
SP(SP)+16位表達式的值

(2)段間帶馬上數返回
格式:RET 表達式
運行的操作:
IP((SP)+1,(SP))
SP(SP)+2
CS((SP)+1,(SP))
SP(SP)+2
SP(SP)+16位表達式的值

440.8086CPU中,一個段最大可定義的字節數是(C)
A.61K      B.32K      C.64K      D.1M

441.軟中斷指令INT 21H運行,若AH=9時則完畢的功能是顯示字符串。
442.8086存儲器地址分段時,每一個段起始地址的特征是段首地址能被16整除。

443.JMP NEAR LAB   ;錯誤
改成:
JMP NEAR PTR LAB

444.編寫指令將附加段中的一個字節變量COUNT送給AL寄存器。



MOV BX,OFFSET COUNT
MOV AL,ES:[BX]

445.CMP [SI][DI]     ;錯誤 ,源、目的操作數不能同一時候為變量

446.最后移位指令吐血總結:
(1)SAL/SHL:作用一樣,最低位補0。
(2)SAR:算術右移,最高位補原先的那個最高位的數值;
     SHR:邏輯右移,最高位補0。
ROL:循環左移,依次移到最低位
ROR: 循環右移,依次移到最高位

RCL:帶進位的循環左移,每一位先加上CF的值,然后循環左移到最低位。原來的CF移到最低位;
RCR:帶進位的循環右移,每一位先加上CF的值。然后依次右移到最高位,原來的CF移到最高位。


github主頁:https://github.com/chenyufeng1991  。

歡迎大家訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM