新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編入門(mén)學(xué)習(xí)筆記 (三) —— 第一個(gè)程序

匯編入門(mén)學(xué)習(xí)筆記 (三) —— 第一個(gè)程序

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
瘋狂的暑假學(xué)習(xí)之 匯編入門(mén)學(xué)習(xí)筆記 (三)—— 第一個(gè)程序

本文引用地址:http://butianyuan.cn/article/201611/317777.htm

參考:《匯編語(yǔ)言》 王爽 第四章

1.一個(gè)源程序從寫(xiě)到執(zhí)行的過(guò)程

第一步:編寫(xiě)匯編源程序

第二步:對(duì)源程序進(jìn)行編譯連接

第三步:在操作系統(tǒng)中執(zhí)行

2.源程序

代碼:

  1. assumecs:first
  2. firstsegment
  3. start:movax,2
  4. addax,ax
  5. addax,ax
  6. movax,4C00H
  7. int21H
  8. firstends
  9. endstart

代碼解釋?zhuān)?/p>

assume 、segment、ends、end 等都是偽指令

end 表示 程序結(jié)束。

segment與ends(注意與end的區(qū)分)成對(duì)出現(xiàn),表示一個(gè)段,segment前面的 first 表示段的名字,標(biāo)號(hào),可以任意取。一個(gè)程序至少有一個(gè)段。

assume 用來(lái)把寄存器跟段關(guān)聯(lián)起來(lái)。

start:這個(gè)可以隨便取名字,但要與end 后面的一樣。表示程序的入口。CS:IP 指向。

3.編譯連接

(在win7 64位,可能有問(wèn)題,用DOSBox 模擬)

使用masm編譯,link鏈接

把上面的代碼保存到 1.asm中

編譯:在cmd中輸入 masm 1.asm; 生成 1.obj

鏈接:在cmd中輸入 link 1.obj; 生成 1.exe

4.程序的運(yùn)行

在cmd中輸入1 ,運(yùn)行不會(huì)有任何輸出,一閃而過(guò)

程序的運(yùn)行過(guò)程:首先必須有一個(gè)正在運(yùn)行的P1程序,將要運(yùn)行的P2程序從可執(zhí)行文件中加載進(jìn)入內(nèi)存后將CPU控制權(quán)交給P2,P2才能運(yùn)行。P2開(kāi)始運(yùn)行后P1暫停運(yùn)行。當(dāng)P2運(yùn)行完畢后,將CPU的控制權(quán)交給P1,此后P1繼續(xù)運(yùn)行。DOS中運(yùn)行1.exe P1可以是command,將1.exe加載如內(nèi)存。command設(shè)置CPU的CS:IP z指向程序的第一條指令(即程序的入口),從而使其運(yùn)行。程序運(yùn)行結(jié)束后,返回command,CPU繼續(xù)運(yùn)行command。

前面代碼中的:mov ax,4C00H

int 21H

功能就是程序返回

int 跟c英語(yǔ)中的int沒(méi)有任何關(guān)系,表示中斷。

5.程序執(zhí)行過(guò)程的跟蹤

在cmd中輸入:debug 1.exe 即可跟蹤運(yùn)行1.exe

這時(shí)輸入r查看寄存器信息,可以看到CX存放源程序中指令的長(zhǎng)度。

DS跟CS相差0010H,原因:

程序在運(yùn)行前,DOS系統(tǒng)先找到一個(gè)XX:0000H地址,在這段內(nèi)存區(qū)的前256個(gè)這個(gè)中 創(chuàng)建一個(gè)程序段前綴(PSP)的數(shù)據(jù)區(qū),DOS要利用PSP來(lái)和被加載的程序進(jìn)行通信。從XX:0010H開(kāi)始將程序裝入。

輸入t 單步執(zhí)行,到int 21H時(shí),輸入p結(jié)束。



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉