匯編問題列表
(1)8086CPU是多少位的佑女?寄存器有哪些骑脱?名稱是什么痴柔?
8086CPU是16位的
-
寄存器
8個(gè)16位通用寄存器:
AX(Accumulator)累加寄存器裳涛,可以分為AH(High)和AL(Low)兩個(gè)8位寄存器诀拭。
BX(Base)基地址寄存器迁筛,可以分為BH(High)和BL(Low)兩個(gè)8位寄存器。
CX(Count)計(jì)數(shù)寄存器,可以分為CH(High)和CL(Low)兩個(gè)8位寄存器细卧。
DX(Data)數(shù)據(jù)寄存器尉桩,可以分為DH(High)和DL(Low)兩個(gè)8位寄存器。
SI(Source Index)源變址寄存器
DI(Destination Index)目標(biāo)變址寄存器
BP(Base Pointer)基地址指針寄存器
SP(Stack Pointer)棧指針寄存器
4個(gè)16位段寄存器:
CS(Code Segment)代碼段寄存器
DS(Data Segment)數(shù)據(jù)段寄存器
SS(Stack Segment)棧段寄存器
ES(Extra Segment)附加段寄存器
1個(gè)16位指令指針寄存器:
IP(Instruction Pointer)
只能與CS一起使用贪庙,只有處理器能改變其內(nèi)容蜘犁。
1個(gè)標(biāo)志位寄存器Flags:
按位起作用
詳情請見問題(14)
共計(jì)14個(gè)寄存器
(2)8086CPU的內(nèi)存分段機(jī)制是什么?內(nèi)存真的分段了嗎止邮?
-
內(nèi)存分段機(jī)制
段地址 * 16(或10H) + 偏移地址 = 物理地址
內(nèi)存只是在邏輯上進(jìn)行了分段这橙,物理上沒有分段。
(3)總線分幾種导披?不同總線的根數(shù)代表什么屈扎?
總線分為3種:地址總線,數(shù)據(jù)總線撩匕,控制總線鹰晨。
-
根數(shù)意義
總線 意義 地址總線 地址空間(尋址能力) 數(shù)據(jù)總線 一次傳輸數(shù)據(jù)的多少 控制總線 信號(hào)的種類
(4)內(nèi)存地址空間是什么?特點(diǎn)是什么止毕?
-
內(nèi)存地址空間是什么
計(jì)算機(jī)對 ROM 和 RAM 等芯片提供的存儲(chǔ)空間以線性邏輯整合在一起的連續(xù)區(qū)域模蜡。
-
內(nèi)存地址空間的特點(diǎn)是:
邏輯上連續(xù),統(tǒng)一編址扁凛;
物理上分散忍疾,芯片不同;
(5)地址加法器的作用是什么令漂?
地址是20位的膝昆,寄存器是16位的,地址加法器將短地址左移4位(乘10H或16D)再加上偏移地址形成20位物理地址叠必。
(6)8086CPU是如何執(zhí)行指令的荚孵?
指令放在內(nèi)存里,一條接著一條纬朝,CPU自己按順序取出并且執(zhí)行收叶。
(7)匯編語言是編譯性語言還是解釋性語言?匯編語言由哪幾種部分構(gòu)成共苛?
- 匯編語言是編譯型語言
- 匯編語言分為偽指令和代碼指令判没,每種指令由代碼段,數(shù)據(jù)段隅茎,堆棧段和附加段構(gòu)成澄峰。
(8)bochsdbg調(diào)試時(shí)用到的命令有哪些?都怎么使用辟犀?
以下僅整理常用命令俏竞,具有強(qiáng)烈主觀色彩。
類型 | 命令 | 功能 | 舉例 |
---|---|---|---|
中斷 | b | 加入斷點(diǎn),后接物理地址 | b 0x7c00 |
blist | 顯示現(xiàn)有斷點(diǎn) | ||
d | 刪除斷點(diǎn) | ||
執(zhí)行控制 | c | 繼續(xù)執(zhí)行(continue) | |
p或n | 單步執(zhí)行(遇到 call 和 int 不進(jìn)入函數(shù)魂毁、中斷內(nèi)) | ||
s | 單步執(zhí)行(遇到 call 和 int 進(jìn)入函數(shù)玻佩、中斷內(nèi)),后面可以加執(zhí)行條數(shù) |
s /s 100
|
|
查看寄存器 | r | 顯示寄存器狀態(tài) | |
sreg | 顯示段寄存器狀態(tài) | ||
info eflags | 顯示標(biāo)志位寄存器席楚,如果字母為大寫表示該位置狀態(tài)1咬崔,否則為0 | ||
查看內(nèi)存 | xp | 顯示內(nèi)存內(nèi)容,后接想要顯示的多少烦秩,單位垮斯,以及物理地址。b為字節(jié)闻镶,h為字甚脉,w為雙字 | xp /2b 0x7c00 |
print-stack | 查看堆棧 | ||
u | 反匯編,后接行數(shù)和物理地址 | u /10 0x7c00 |
|
退出 | q或quit或exit | 停止調(diào)試并退出 |
(9)硬盤的CHS铆农、LBA是什么牺氨?兩者轉(zhuǎn)化的公式是什么?
//TODO
(10)80*25彩色字符模式如何使用墩剖?其編程的一般套路是什么猴凹?
-
80*25彩色字符模式如何使用?
在80*25彩色字符模式下岭皂,顯示器可以顯示25行郊霎,每行80個(gè)字符。
一個(gè)字符要占兩個(gè)字節(jié)(一個(gè)字符的 ACSII 碼要占用一個(gè)爷绘,再加上顏色屬性用的一個(gè)字節(jié))书劝。
顏色屬性的表示方法:
所在位置 7 6 5 4 3 2 1 0 含義 閃爍 背景R 背景G 背景B 高亮 前景R 前景G 前景B -
編程的一般套路
控制要顯示的內(nèi)容所在屏幕上的位置
控制要顯示的內(nèi)容的是否閃爍和高亮,并設(shè)置前景和背景顏色土至。
一般將顏色屬性寫為16進(jìn)制或2進(jìn)制傳入顯存中想要賦予顏色屬性的字符后面的地址中
待續(xù)......
(11)內(nèi)存的串拷貝(rep movsb/movsw)
是如何實(shí)現(xiàn)的购对?
-
movesb
以字節(jié)為單位批量傳輸數(shù)據(jù)串。
-
movesw
以字為單位批量傳輸數(shù)據(jù)串陶因。
-
如何實(shí)現(xiàn)的骡苞?
執(zhí)行這條命令時(shí),原始數(shù)據(jù)串的短地址由 DS 決定楷扬,偏移地址由 SI 指定解幽,也就是 DS:SI。傳送的字節(jié)數(shù)或字?jǐn)?shù)由 CS 指定烘苹。另外還要指定是正向還是反向傳送躲株。
正向傳送:由低地址端到高地址端進(jìn)行傳送。
反向傳送:由高地址端到低地址端進(jìn)行傳送镣衡。
正向傳送時(shí)徘溢,每次傳送一個(gè)字節(jié)吞琐,SI 和 DI 自增1。每次傳送一個(gè)字然爆,SI 和 DI 自增2。
反向傳送時(shí)黍图,每次傳送一個(gè)字節(jié)曾雕,SI 和 DI 自減1。每次傳送一個(gè)字助被,SI 和 DI 自減2剖张。
無論正反傳送,CX都會(huì)自減1揩环。
控制正向還是反向傳送的方法是: 控制標(biāo)志位寄存器中的 DF 標(biāo)志位搔弄。
可通過
cld
指令將 DF 標(biāo)志位置為0,此時(shí)正向傳送丰滑。可通過
std
指令將 DF 標(biāo)志位置為1顾犹,此時(shí)反向傳送。rep 表示 repeat褒墨,功能:
- rep 后面的指令執(zhí)行一次
- (cx) = (cx)-1
- 如果(cx)不等于炫刷,重復(fù)執(zhí)行后面指令;否則郁妈,順序向下執(zhí)行浑玛,不再重復(fù)后面的指令。
傳送方式需設(shè)置如下(按字節(jié)傳送):
- cld / std
- 設(shè)置源數(shù)據(jù)段ds噩咪,設(shè)置目標(biāo)數(shù)據(jù)段es
- 設(shè)置源偏移si顾彰,設(shè)置目標(biāo)偏移di
- 設(shè)置傳送的次數(shù)cx
- rep movsb / movsw
(12)無符號(hào)數(shù)和有符號(hào)數(shù)是如何規(guī)定的?
無符號(hào)數(shù)指不區(qū)分正負(fù)胃碾,一律按照自然數(shù)處理的數(shù)字涨享。
-
有符號(hào)數(shù)指區(qū)分正負(fù),且該數(shù)字為整數(shù)或者負(fù)數(shù)要用其最高位進(jìn)行判斷书在。若最高位是0則該數(shù)字為正數(shù)灰伟,若最高位為1則該數(shù)字為負(fù)數(shù)。
如8位的字節(jié)運(yùn)算環(huán)境下儒旬,正數(shù)的范圍是00000000至01111111栏账。負(fù)數(shù)的范圍是10000000至11111111。
Tips: 如果想要判斷16進(jìn)制栈源,需要先將十六進(jìn)制轉(zhuǎn)換為2進(jìn)制再進(jìn)行判斷挡爵。題目告知為有符號(hào)數(shù)的前提下,只需判斷最高位是0還是1即可甚垦。
(13)mul和div的實(shí)現(xiàn)過程是什么茶鹃?(共4種)
- Mul(Multiply)乘法(被乘數(shù)*乘數(shù)=積)
8位乘法:
- 被乘數(shù)放置于 AL 中
- 乘數(shù) SRC 放置于8位通用寄存器或內(nèi)存涣雕。
- 乘積結(jié)果為16位,放置于 AX 寄存器中闭翩。
mul bl ; mul byte ptr [bx]
16位乘法:
- 被乘數(shù)放置于 AX 中
- 乘數(shù) SRC 放置于16位通用寄存器或內(nèi)存挣郭。
- 乘積結(jié)果為32位,低16位放置于 AX 寄存器中疗韵,高16位放置于 DX 寄存器兑障。
mul bx ; mul word ptr [bx]
- Div(Divide)除法(被除數(shù) / 除數(shù) = 商 。蕉汪。流译。余數(shù))
16位除法:
- 被除數(shù)放置于 AX 中
- 除數(shù) SRC 放置于8位通用寄存器或內(nèi)存。
- 商放置于 AL者疤,余數(shù)放置于 AH 中福澡。
div bl ; div byte ptr [bx]
32位除法:
- 被除數(shù)高16位放置于 DX 寄存器,低16位放置于 AX 中
- 除數(shù) SRC 放置于16位通用寄存器或內(nèi)存驹马。
- 商放置于 AX革砸,余數(shù)放置于 DX 中。
div bx ; div word ptr [bx]
(14)標(biāo)志位zf窥翩、of业岁、cf、pf寇蚊、sf笔时、df、tf仗岸、if允耿、af的作用是什么?是否會(huì)判斷前5個(gè)的值扒怖?
標(biāo)志位 | 0含義 | 1含義 | 備注 |
---|---|---|---|
ZF(Zero flag)零標(biāo)志位 | 運(yùn)算結(jié)果為1 | 運(yùn)算結(jié)果為0 | |
OF(Overflow flag)溢出標(biāo)志位 | 計(jì)算結(jié)果沒有溢出 | 符號(hào)相同的相加符號(hào)變的不一樣就溢出 较锡,符號(hào)不同的相減與被減數(shù)符號(hào)不一樣就溢出 | 只對有符號(hào)數(shù)而言 |
CF(Carry flag)進(jìn)位借位標(biāo)志位 | 最高位沒有產(chǎn)生進(jìn)位借位 | 前面的計(jì)算中最高位產(chǎn)生進(jìn)位借位 | 移位操作中保存最高位或最低位溢出的數(shù)字 |
PF(Parity flag)奇偶標(biāo)志位 | 計(jì)算結(jié)果有奇數(shù)個(gè)1 | 計(jì)算結(jié)果有偶數(shù)個(gè)1 | 結(jié)果的低八位 |
SF(Sign flag)符號(hào)標(biāo)志位 | 計(jì)算結(jié)果為非負(fù) | 計(jì)算結(jié)果為負(fù) | |
DF(Direction flag)方向標(biāo)志位 | 正向 | 反向 | 與rep,movesb等配合使用 |
AF(Auxiliary flag)輔助進(jìn)位借位標(biāo)志位 | 低四位沒有向高四位借位 | 低四位向高四位借位 |
IF, TF 不考盗痒,先不寫了蚂蕴。
(15)loop循環(huán)是如何實(shí)現(xiàn)的?
先讓 CX 自減1俯邓,再判斷 CX 是否為0骡楼,如果為0則跳轉(zhuǎn)至 loop 后面標(biāo)明的標(biāo)號(hào)。
(16)jcc語句如何使用稽鞭?
《x86匯編語言-從實(shí)模式到保護(hù)模式》第91頁表6-1鸟整,這玩意兒太多了懶得打。
(17)是否會(huì)使用loop或jcc實(shí)現(xiàn)一重或二重循環(huán)朦蕴?能否寫出程序框架篮条?
會(huì)弟头,能。(怠惰中......)
(18)db涉茧、dw赴恨、dd等作用是什么?times呢降瞳?
- db
定義一個(gè)以字節(jié)為單位的變量嘱支。
- dw
定義一個(gè)以字為單位的變量。
- dd
定義一個(gè)以雙字為單位的變量挣饥。
- times
重復(fù)n次后面的語句。
(19)and沛膳、or扔枫、xor、not的作用是什么锹安?怎么用短荐?
- and
按位清零。
假如叹哭,想要將 000010101B 的位0清零忍宋,我們只需要給他 and 上 11111110B 就可以了。
- or
按位置一
假如风罩,想要將 000010101B 的位7清零糠排,我們只需要給他 or 上10000000B 就可以了。
- xor
如果某相同位置上的兩個(gè)數(shù)字同為1或0超升,則清零入宦,如果不一樣則置一。
- not
按位取反室琢,是0變1乾闰,是1變0。
(20)棧如何使用盈滴?push和pop如何實(shí)現(xiàn)涯肩?空棧和滿棧怎么設(shè)置(即sp的值是多少)?
先一頓操作初始化棧段和棧頂。
- 設(shè)置棧段寄存器。
mov ax,段地址
mov ss,ax
- 設(shè)置棧頂?shù)钠频刂?/li>
mov sp,偏移地址
-
push
- (sp) = (sp) – 2
- 放入一個(gè)字到SS:SP處
-
pop
- 從SS:SP處取出一個(gè)字
- (sp) = (sp) + 2
空棧設(shè)置 SP 為0
滿棧設(shè)置 SP 為1
(21)8086尋址方式有哪些鸥咖?能否舉出一句匯編語句的例子养篓?
- 寄存器尋址
操作的數(shù)位于寄存器中,可以直接從寄存器里取得榔幸。
mov ax, cx
add bx, 0xf000
inc dx
- 立即尋址
指令的操作數(shù)是一個(gè)立即數(shù)。
add bx, 0xf000
mov dx, label_a
-
內(nèi)存尋址
- 直接尋址
操作數(shù)為一個(gè)偏移地址。
mov ax, [0x5c0f] add word [0x0230], 0x5000 xor byte [es:label_b], 0x05
表示內(nèi)存地址需要用中括號(hào)括起來阵幸。
- 基址尋址
順序存放的地址花履。
buffer dw 0x20, 0x100, 0x0f, 0x300, 0xff00 inc word [buffer] inc word [buffer + 2] inc word [buffer + 4]
mov [bx], dx add byte [bx], 0x55
- 變址尋址
類似于基址尋址,使用變址寄存器挚赊。
mov [si], dx add ax, [di] xor word [si], 0x8000
也可以帶偏移量诡壁。
mov [si + 0x100], al and byte [di + lable_a], 0x80
- 基址變址尋址
允許在機(jī)制寄存器和變址寄存器的基礎(chǔ)上帶一個(gè)偏移量。
mov [bx + si + 0x100], al and byte [bx + di + label_a], 0x80
(22)JMP語句分為幾種荠割?都是如何實(shí)現(xiàn)的妹卿?
//TODO
(23)如何實(shí)現(xiàn)子程序的調(diào)用?其過程是什么蔑鹦?
//TODO
(24)中斷類型碼夺克、中斷向量、中斷向量表嚎朽、中斷例程是什么铺纽?中斷發(fā)生時(shí)CPU執(zhí)行過程是什么?
//TODO
先罷工了S慈獭狡门!
參考文獻(xiàn)
黑色星辰的課件兒
《x86匯編語言-從實(shí)模式到保護(hù)模式》
翔哥