NJUPT【 匯編語言 】

一.數(shù)制

真值數(shù)和補碼數(shù)之間的轉(zhuǎn)換方法 : [[X]] = X

設(shè)設(shè)機器數(shù)字長n, n位補碼數(shù),

    **有符號數(shù)真值范圍為 -2^n-1^ ~ +2^n-1^-1**

     **無符號數(shù)其數(shù)值范圍為**  0~2^n^-1

<center>常用ASCII碼</center>

原數(shù)字 ASCII(D) ASCII(H)
0 48 30H
A 65 41H
a 97 61H
CR(回車) 13 0DH
換行 10 0AH

二.基本結(jié)構(gòu)

字長:字長是微處理器一次可以直接處理的二進制數(shù)碼的位數(shù)

實模式特點

  1. 加電復(fù)位之后,486自動工作在實模式岗喉,系統(tǒng)在DOS管理下
  2. 實模式下田盈,486只能訪問第一個1M(==220==)內(nèi)存(00000H - FFFFFH)
  3. 存儲管理部件對存儲器只進行分段管理,沒有分頁功能谍憔,一個邏輯段最大容量為==64K==
  4. 實模式下,段寄存器中存放段基址

保護模式特點:

  1. 支持多任務(wù)操作系統(tǒng)
  2. 保護模式下,可以訪問4G(232)物理存儲空間
  3. 采用分段和分頁功能

三個存儲地址空間:

  • 邏輯空間 可以達到246=64T
  • 線性空間
  • 物理空間

馮諾以曼體系

CPU: 運算器和控制器

主要包括以下幾個部分:存儲器任洞、運算器、控制器发侵、輸入設(shè)備交掏、輸出設(shè)備

486內(nèi)部結(jié)構(gòu)

<center>常用通用寄存器</center>


通用寄存器

指令 = 操作碼 + 操作數(shù)

32位微處理器地址空間

  1. 物理空間:程序的運行空間,即主存空間刃鳄,在486中盅弛,共32條地址線,內(nèi)存最大容量為4G
  2. 虛擬空間: 編程空間叔锐,虛擬存儲器是一項硬件和軟件相結(jié)合的技術(shù)挪鹏。

狀態(tài)標志寄存器

8086標志寄存器共有15個標志位置,分為兩類 狀態(tài)標志控制標志

1.條件(狀態(tài))標志

進位標志: A標:低半字節(jié)位是否出現(xiàn)借位或者是進位,有為1愉烙,無為0

輔助進位: C標:最高為值是否出現(xiàn)借位或者是進位讨盒,是為1,無為0

O標:是否溢出步责,是則1返顺,無則0禀苦,如果最高位不同,一定不會溢出遂鹊。

Z標:結(jié)果是否為0振乏,是則1,無則0

P標:運算結(jié)果低8位中1結(jié)果的1的次數(shù)是否為偶數(shù)秉扑,是則1慧邮,否則0

S標:最高位是否為1,是則1舟陆,否則0

2.控制標志

TF標:設(shè)置為1時误澳,CPU進入單步模式,所謂單步模式就是CPU在每執(zhí)行一步指令后都產(chǎn)生一個單步中斷

IF標志:IF為1時吨娜,CPU允許響應(yīng)外部的可屏蔽中斷請求脓匿。I=0的時候屏蔽

DF標:。使用CLD指令清0宦赠, DF為1時陪毡,串操作指令按遞減方式改變有關(guān)[存儲器](https://baike.baidu.com/item/存儲器)指針值,每次操作后使SI勾扭、DI遞減毡琉。

實模式下物理地址的形成

  • 邏輯地址是程序員賦予的,是不唯一的
  • 物理地址是唯一的妙色,不同的邏輯地址可以表示一個物理地址
邏輯段 段基址存放在 偏移地址存放在
代碼段 CS IP
堆棧段 SS SP
數(shù)據(jù)段 DS 根據(jù)不同的尋址方式BX、BP丐谋、SI煌珊、DI
附加段 ES/FS/GS 根據(jù)不同的尋址方式BX号俐、BP吏饿、SI、DI

CS蔬浙、IP的初值: 由操作系統(tǒng)賦值

SS猪落、SP的初值:

  • 程序員賦值
  • 操作系統(tǒng)賦值

DS/ES/FS/GS的初始值:由程序員賦值

BX/SI/DI/BP的初始值:由程序員賦值


三.匯編基本知識

a. 操作數(shù)尋址方式:star::star::star::star::star:

指令當中的操作數(shù) : 立即數(shù)笨忌、 寄存器數(shù)官疲、內(nèi)存操作數(shù)袁余、I\O端口操作數(shù)

那么各個數(shù)有各個訪問操作數(shù)的方式:

  • 訪問立即數(shù)
    • 立即尋址:heavy_check_mark:
  • 訪問寄存器數(shù)
    • 寄存器尋址:heavy_check_mark:
  • 訪問內(nèi)存操作數(shù):
    • 直接尋址:heavy_check_mark:
    • 間接尋址:heavy_check_mark:
    • 基址尋址:heavy_check_mark:
    • 變址尋址:heavy_check_mark:
    • 基址加變址尋址:heavy_check_mark:

1.立即數(shù)尋址

直接用立即數(shù)進行賦值

mov ax, 1000H 將1000H賦值給ax

2.寄存器尋址

直接把一個寄存器的值送給另一個寄存器

mov ax,bx ;將bx寄存器的值賦值到ax中

3.直接尋址

  1. 段寄存器:[偏移地址]

    偏移地址用立即數(shù)來表示的為直接尋址

    mov al, es:[2CH]  從ES段偏移地址位2CH的單元取數(shù) -> al
    mov ax, ds:[2000H] 從數(shù)據(jù)段偏移地址為2000H的單元取一字颖榜, ->ax
    
  2. 段寄存器:變量名

    mov ax, es:[YY] YY里面的內(nèi)容作為偏移地址
    

4.間接尋址

又稱間接尋址掩完,間址且蓬。操作數(shù)在內(nèi)存單元中恶阴,段基址放在段寄存器中冯事,偏移地址在==間址寄存器==當中昵仅。

地址表示:段寄存器:[間址寄存器]

物理地址 = 段寄存器 * 16 + 間址寄存器

<center><i>表1.間址寄存器和約定訪問邏輯段

間址寄存器 約定訪問的邏輯段
BP 堆棧段 SS 16位尋址方式
BX, SI, DI 數(shù)據(jù)段 DS 16位尋址方式
EBP摔笤, ESP 堆棧段 SS 32位尋址方式
EAX~EDX, ESI, EDI 數(shù)據(jù)段 DS 32位尋址方式
mov ax, [bx]    //約定的默認段寄存器為DS吕世, 所以會訪問 DS:[BX]

5.基址尋址

基址尋址的地址表達式:段寄存器:[基址寄存器+位移量]

物理地址: 段寄存器 * 16 + 基址寄存器 + 位移量

<center><i>表2.基址寄存器和約定訪問邏輯段

變址寄存器 約定訪問的邏輯段 適用于
BP 堆棧段 16位
BX 數(shù)據(jù)段 16位
EBP寞冯, ESP 堆棧段 32位
EAX~EDX, ESI ,EDI 數(shù)據(jù)段 32位
mov al, [bx + 2] 物理地址:DS * 16 + bx + 2

6.變址尋址

基址尋址的地址表達式:段寄存器:[比例因子變址寄存器+位移量]*

物理地址 :段寄存器 * 16 + 比例因子 * 變址寄存器 + 位移量

<center><i>表3.變址寄存器和約定訪問邏輯段

變址寄存器 約定訪問的邏輯段 適用于
SI, DI 數(shù)據(jù)段 無比例因子吮龄,16位尋址
EBP 堆棧段 有比例因子, 32位尋址
EAX~EDX, ESI ,EDI 數(shù)據(jù)段 有比例因子尝抖,32位尋址

==如何區(qū)別變址和基址尋址?==

我們通過表1和表2可以知道衙熔,在基址尋址過程中红氯,我們使用的基址寄存器為BP痢甘、BX塞栅,而變址寄存器中使用的位SI放椰、DI庄敛。所以我們可以作出區(qū)分藻烤。

7. 基址+變址尋址

基址尋址的地址表達式:段寄存器:[基址寄存器 + 比例因子變址寄存器+位移量]*

mov al, [BX + SI + 0250H] 物理地址= DS * 16 + BX + SI + 0250H

末.總結(jié)

mov al, 0120H       立即尋址
mov al, Bl          寄存器尋址
mov AL,DS:[1000H]   直接尋址
mov AL,BUF          直接尋址
mov AL,[BX]         間址尋址
mov AL,[BX+1]       基址尋址
mov AL,[SI+1]       變址尋址
mov AL,[BX+SI]      基址加變址尋址

b. 匯編語言指令

語句是匯編語言匯編和執(zhí)行的單位,匯編語言源程序包括的語句類型位:指令性語句和指示性語句兴猩。

標號代表該條指令的符號地址倾芝。

  • 指令性語句(符號指令) :經(jīng)過匯編之后晨另,通知CPU進行什么操作借尿。
  • 指示性指令
    • 偽指令:非機器指令路翻,是在匯編鏈接期間進行操作的
    • 宏指令

符號指令和機器指令是一一對應(yīng)的關(guān)系茂契。

1.常用偽指令語句

  • 數(shù)據(jù)定義偽指令
    1. 字節(jié)定義偽指令 : DB(Define Byte的縮寫) 長度為8位 單字節(jié)數(shù)

      N1:    
         DB 12H,64,-1,3*3
         DB 'A','B'
      N2:
         DB ?,?,?     或者是 DB 
      
    2. 字定義偽指令:DW(Define Word的縮寫) 長度位16位 雙字節(jié)數(shù)

      WNUM:
         DW 1234H, 56, 'AB', 'C'
         DW ?,?
       匯編后: 34H, 12H, 38H, 00H, 42H( ASCII B), 42H( A's ASCII) , 43H, 00H
      
  • 符號定義指令

    1. 等值偽指令 : EQU

      NUM EQU 33  類似于C語言中的define語句
      
    2. 等號偽指令 : =

      NUM = 33
      

      EQU和=的區(qū)別掉冶,EQU定義的NUM在后繼語句當中不能被重新定義郭蕉,而后者可以被重新定義召锈。

2.常用運算符

  1. $運算符

    作用:代表所在位置的地址

    BUF DB ‘a(chǎn)ssembly is ok’ ;字符串長度位14
    LLL EQU $-BUF ;返回從BUF運算符到當前位置的長度涨岁,也就是一共分配了多少單元
    
  2. SEG 運算符

    作用:計算某一段邏輯段的段基址

    mov ax, SEG DATA
    mov ds ,ax
    
  3. OFFSET 運算符

    作用:計算某個變量名和標號名所在單元的偏移量

    BUF DB 12H, 34H, 56H
    MOV BX OFFSET BUF
    MOV AL, [BX] ;AL = 12H
    
  4. PTR 運算符

    作用:臨時修改某一單元內(nèi)存的屬性

    類型屬性確定的操作數(shù)

    • 寄存器操作數(shù)
    • 用變量名直接尋址的內(nèi)存操作數(shù)

    類型屬性不確定的操作數(shù)

    • 立即數(shù)
    • 非變量名定義的內(nèi)存操作數(shù)(帶括號)
    BUF DB 11H,22H,33H,44H
    
    EXAMPLE_1:
        MOV AX, BUF ;不正確,前后位數(shù)不一樣
        MOV AX , WORD PTR BUF ;AH = 22H, AL = 11H
    EXAMPLE_2:
     MOV BUF, 1234H              ;錯誤
     MOV WORD PTR BUF, 1234H      ;正確秉撇,BUF單元變?yōu)?4H, BUF+1單元變?yōu)?2H
    EXAMPLE_3:
     MOV BX, OFFSET XX
     MOV [BX], 12H
     MOV BYTE PTR [BX], 12H  ;將BX單元的內(nèi)容變?yōu)?2H
     MOV WORD PTR [BX], 12H  ;將BX單元的內(nèi)容變?yōu)?2H琐馆,將BX+1單元的的內(nèi)容變?yōu)?0H
    

3.匯編基本指令集

1.通用傳送類指令
  1. 數(shù)據(jù)傳送指令

    mov des , source
    
    WARNING:
     MOV DS, 1000H ;不合法瘦麸,立即數(shù)不能直接賦值給段寄存器
     MOC CS, 1000H   ;不合法滋饲,不嫩修改CS的值
    
  2. 符號擴展指令

    MOVSX: 符號位向高位擴展屠缭,再送給目標操作數(shù)

    MOVZX:符號位高位補0勿她, 再送給目標操作數(shù)

    movsx DL, -16        ;DL = F0H
    movsx bx, dl     ;bx = FFF0H 符號位為1之剧,擴1
    movzx bx, dl     ;bx = 00F0H 括0
    
  3. 有效地址傳送指令

    LEA運算符等效于OFFSET運算符

    lea bx, buf ==  mov bx, offset buf
    
  4. 交換指令

    XCHG:兩個操作數(shù)互換背稼;

    說明: 段寄存器蟹肘、 立即數(shù)不能參加互換

    2個內(nèi)存操作數(shù)不能參與互換帘腹,前后屬性要一致阳欲。

2.堆棧操作類指令
堆棧

棧頂在棧區(qū)的低地址球化,棧底在棧區(qū)的高地址筒愚。

堆棧段寄存器 SS巢掺;

堆棧指針ESP和 SP;

  1. 進棧指令

    PUSH 源操作數(shù)

    SP = SP - 2
    高8位 --> SS:[SP+1] 高字節(jié)
    低8位 --> SS:[SP]
    
    PUSH WORD PTR [BX] ;將DS:[BX]的內(nèi)容壓棧
    
  2. 出棧

    SP = SP + 2
    SS:[SP] -- > 低8位
    SS:[SP+1] --> 高8位
    
3.運算類指令

二進制加法:

  • 加減運算法指令 當操作數(shù)為內(nèi)存數(shù)的時候必須使用PTR運算符

    • INC 目標操作數(shù) :加1指令 必須
    • DEC 目標操作數(shù) :減1指令
  • 乘除運算類指令

    <center><i>表4.乘法功能

    MUL/IMUL 被乘數(shù)默認在 乘數(shù)為 高位積在 低位積在
    字節(jié)相乘 AL R8/M8 AH AL
    字相乘 AX R16/M16 DX AX
    雙字相乘 EAX R32/M32 EDX EAX

    <center><i>表5.除除法功能

    DIV / IDIV 被除數(shù)默認在 除數(shù)為 商值在 余數(shù)在
    字節(jié)除法 AX R8/M8 AL AH
    字除法 DX=高16位 , AX=低16位 R16/M16 AX DX
    雙字除法 EDX=高32位 浸剩, EAX=低32位 R32/M32 EAX EDX
    • 無符號數(shù)乘法: MUL 乘數(shù)

      • 格式一 MUL 目 功能:被乘數(shù)默認在EAX中
      • 格式二 MUL 目 源
      • 格式三: IMUL 目绢要,源重罪, 立即數(shù) 源*立即數(shù) = 目標操作數(shù)
      MOV EAX, 15000
      MOV EBX, 12
      MUL EBX ;15000*12 --> EAX
      
    • 有符號乘法:IMUL 乘數(shù)

    • 無符號除法 DIV

    • 有符號除法 IDIV

  • NEG指令 : 求補運算 可以表達成 取反后 +1剿配, 可以用來求一個數(shù)的相反數(shù)

    MOV AL, 77
    NEG AL ;result : AL=-77
    
  • SBB指令 :除完成SUB減法運算外呼胚,還要減去借位CF蝇更,結(jié)果送到目的操作數(shù)蚁廓,按照定義影響6個狀態(tài)標志位相嵌。也就是

      SBB dest,src ; 帶借位減法:dest=dest-src-CF
    
  • ADC指令:帶進位加法指令 ADC(Addition Carry)

    ADC OPRD1,OPRD2 ;OPRD1 = OPED1 + OPRD2 + 1
    
4.BCD碼調(diào)整指令
  1. DAA指令默認的操作對象是AL寄存器,將AL寄存器里面的值變?yōu)锽CD碼

    ;計算1234+5678=漠另? 結(jié)果用BCD碼表示
    ;數(shù)據(jù)段
    N1 DW 1234H
    N2 DW 5678H
    SUM DW ?
    ;代碼段
    MOV AL, BYTE PTR N1
    ADD AL, BYTE PTR N2
    DAA
    MOV BYTE PTR SUM, AL
    MOV AL, BYTE PTR N1+1
    ADD AL, BYTE PTR N2+1
    DAA
    MOV BYTE PTR SUM+1, AL
    
  2. DAS

    默認操作對象是AL笆搓,對AL中的組合BCD差值進行修正。

    • 若被減數(shù)>減數(shù)算墨,調(diào)整后净嘀,C標=0挖藏,AL=組合BCD碼差值膜眠;
    • 若被減數(shù)<減數(shù)宵膨,調(diào)整后柄驻,C標=1鸿脓,AL=差值相對于模100的補數(shù)野哭。
    ;計算56-78 = 蛔溃?
    
    ;數(shù)據(jù)段
    MOV AL, 56H
    SUB AL, 78H
    DAS ;結(jié)果:C=1,AL=78H
    
5.轉(zhuǎn)移指令
  • 無條件轉(zhuǎn)移

    jmp xyz ;無符號跳轉(zhuǎn)到xyz
    
  • 有條件轉(zhuǎn)移

    • 無符號條件轉(zhuǎn)移

      CMP N1,N2 ;N1,N2都為無符號數(shù)
      JA XYZ          ;N1 > N2轉(zhuǎn)移
      JNA XYZ         ;N1 <= N2轉(zhuǎn)移
      JC  XYZ         ;N1 < N2轉(zhuǎn)移
      JNC XYZ         ;N1 >= N2轉(zhuǎn)移
      JZ XYZ          ;為零跳轉(zhuǎn)
      
    • 有符號數(shù)條件轉(zhuǎn)移

      CMP N1,N2 ;N1,N2都為有 符號數(shù)
      JG XYZ          ;N1 > N2轉(zhuǎn)移
      JGE XYZ         ;N1 <= N2轉(zhuǎn)移
      JL  XYZ         ;N1 < N2轉(zhuǎn)移
      JLE XYZ         ;N1 >= N2轉(zhuǎn)移
      
  • 循環(huán)控制轉(zhuǎn)移 LOOP

    ;TEST:某班級40人,某課程成績存放在SCORE開始的內(nèi)存單元麸塞,統(tǒng)計合格人數(shù)
    
    ;數(shù)據(jù)段
    SCORE DB XX,XX,XX;
    OK DB ?
    ;代碼段
    MOV AX, SEG SCORE
    MOV DS, AX
    MOV BX, OFFSET SCORE
    MOV CX, 40
    MOV DL, 0
    LAST:
      CMP BYTE PTR [BX], 60
      JC NO;如果成績小于60
      INC DL;及格人數(shù)加1
    NO:
      INC BX;偏移地址+1哪工,判斷下一個人數(shù)
      LOOP LAST;如果CX=0的時候雁比,跳轉(zhuǎn)到LAST
      MOV OK,DL
    
6.子程序調(diào)用與返回類指令
7.串傳送指令

說明

  • 源串和目標串的存儲及尋址方式都有隱含規(guī)定,源串要放在數(shù)據(jù)段鸭限,目標串要放在ES附加段
  • CPU自動用SI間址訪問數(shù)據(jù)段败京,用DI間址訪問ES附加段赡麦、用CX做為串計數(shù)器泛粹。

格式

  • 字節(jié)串傳送: MOVSB
  • 字串傳送: MOVSW
  • 雙字串傳送:MOVSD
    功能:把DS:[SI]傳送到ES:[DI]
8.邏輯運算指令
名稱 格式 功能 影響的標志位
邏輯與操作 AND S Z P
邏輯或指令 OR S Z P
邏輯非指令 NOT 不影響
異或指令 XOR 異或 S Z P
測試指令 TEST 測試 S Z P

Test指令:Test對兩個參數(shù)(目標扒接,源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設(shè)置標志寄存器,結(jié)果本身不會保存钾怔。

如果結(jié)果為0宗侦,那么ZF標志位為1 使用JZ跳轉(zhuǎn)
9.移位指令

操作數(shù)智能為cl寄存器或者是立即數(shù)

  1. 邏輯左移位 : SAL 或 SHL ,低位補0男旗, 進位到CF中
  2. 邏輯右移位: SHR察皇, 高位補0 無符號數(shù)
  3. 算術(shù)右移位: SAR 让网,高位補原來的最高位 符號位保持不變
  4. 循環(huán)右邊移位:


    image
10.處理機控制類指令

CLC 而账;復(fù)位進位標志:CF←0
STC 泞辐;置位進位標志:CF←1
CLD 吹缔;復(fù)位方向標志:DF←0
STD 厢塘;置位方向標志:DF←1
CLI 晚碾;復(fù)位中斷標志:DF←0
STI 格嘁;置位中斷標志:DF←1

四.匯編語言程序設(shè)計

1.完整的源程序結(jié)構(gòu)

  1. 用方式選擇偽指令來說明該程序的微處理器類型
  2. 用段定義語句定義每一個邏輯段
  3. 用ASSUME語句說明段約定
  4. 用匯編結(jié)束語句說明源程序到此結(jié)束
.586 ;方式定義 表示整個源程序經(jīng)過匯編鏈接之后生成哪種CPU類型的機器指令 向下兼容 如果缺省直接8086
DATA SEGMENT USE16 ;段定義語句探入,USE16定義,有效對有效地址為16位新症,邏輯段長度最大運行為64K 缺省的是USE32 所以在實模式下不能忘記\
...
DATA ENDS       ;段結(jié)束 

CODE SEGMENT USE16          ;定義代碼段
    ASSUME CS:CODE, DS:DATA ;段約定徒爹,用來表示CODE段和CS寄存器進行綁定隆嗅,DATA段和DS寄存器進行綁定。
BEG:
    MOV AX, DATA
    MOV DS, AX
    ...
    MOV AH,4Ch
    INT 21H         ;程序結(jié)束到此結(jié)束丽焊,把操作權(quán)給匯編程序
CODE ENDS
END BEG                     ;通知匯編程序,源程序到此結(jié)束法雌贱,用BEGIN

2. 開發(fā)過程

編輯程序 –> .ASM文件 –> 匯編程序 –> .OBJ文件 –> 鏈接程序 –> .EXE文件

a.asm --> ml /c a.asm --> link a.obj --> a.exe

3.開發(fā)格式

  1. .exe
  2. .com 優(yōu)先級比exe高

異同點

EXE文件:允許源程序使用多個邏輯段

                實模式下欣孤,每個邏輯段不超過64K

COM文件:源程序只允許一個邏輯段 就是代碼段

需要使用定位ORG指令將程序的啟動指令放在 代碼段偏移地址為100H的單元地址

程序使用的數(shù)據(jù)可以集中在代碼段的開始或者末尾

4.DOS功能調(diào)用

BIOS/DOS調(diào)用模式

MOV AH, 功能號
設(shè)置入口參數(shù)
INT 21H
分析出口參數(shù)

功能號:

  1. 01H 等待鍵入一個字符降传,有回顯,相映Ctrl_C
  2. 02H 顯示一個字符 從DL讀入 但是會破壞AL寄存器的內(nèi)容
  3. 07H 等待鍵入一個字符勾怒,無回顯
    1. 出口參數(shù) : AL=按鍵的ASCII碼
  4. 08H 等待鍵入一個字符
  5. 09H 顯示一個字符串
    1. 入口參數(shù): DS:DX = 字符串首地址婆排,字符串必須以 ‘&’(ASCII碼為24H)為結(jié)束符號
  6. 0AH 等待鍵入一串字符串送入數(shù)據(jù)緩沖區(qū)
    1. 入口參數(shù): DS:DX 指向放入的字符的緩沖區(qū)
    2. 出口參數(shù): 存放于緩沖區(qū)的字符串款票,以回車鍵結(jié)尾

5.BIOS功能調(diào)用

  1. 01H 查詢鍵盤緩沖區(qū)

    • 出口參數(shù): Z標志 = 0 , 有鍵入泽论,鍵代碼仍保留在鍵盤緩沖區(qū)中艾少,此時AL= 鍵入字符的ASCII碼翼悴,AH=鍵入字符的擴展碼 Z標志=1,表示無鍵入
  2. 0EH 顯示一個字符

    • 入口參數(shù) 從AL讀入
  3. 13H 顯示一個字符串

    • 入口參數(shù) 屬性字節(jié)BL 缚够,
image

5.程序設(shè)計格式

  1. 分支程序設(shè)計
  2. 循環(huán)程序設(shè)計

6.子程序設(shè)計

7.宏指令程序設(shè)計

宏體被COPY一份插入在位置上。是由匯編程序執(zhí)行的鹦赎。所以不會減少體積谍椅。

宏程序和子程序的異同點:

相同點:宏指令與子程序都可以簡化程序設(shè)計,增強程序的可讀性

不同點:

  • 子程序調(diào)用的是由CPU完成的古话,宏指令的調(diào)用是在匯編程序中完成的
  • 子程序的調(diào)用可以減小目標程序的體積雏吭,但是宏指令不可以

8.代碼轉(zhuǎn)換

  • 十六進制轉(zhuǎn)為二進制輸出
.586
DATA SEGMENT USE16
  MESG DB 'Please Enter!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT USE16
  ASSUME CS:CODE,DS:DATA
BEG:
  MOV BX, DATA
  MOV DS, BX
  ;顯示一行字符串
  MOV AH , 9
  MOV DX, OFFSET MESG
  INT 21H
  ;輸入一個字符
  MOV AH, 1
  INT 21H
  ;比較字符串
  CMP AL, 39H
  JNA NEXT1
  SUB AL, 7H
NEXT1:
  SUB AL,30H
  ;27行的2號功能會破壞AL的值,所以不能使用AL的值
  MOV BL, AL
  
  ;輸出 = 符號
  MOV AH,2
  MOV DL, '='
  INT 21H
  ;輸出二進制
  CALL DISP
  
  ;輸出B
  MOV AH,2
  MOV DL, 'B'
  INT 21H
  
EXIT:
  MOV AH, 4CH
  INT 21H
  
;顯示函數(shù)
DISP PROC
  MOV CX,8
LAST: 
  MOV DL, '0'
  RCL BL,1
  JNC NEXT
  MOV DL, '1'
NEXT:
  MOV AH,2
  INT 21H
  LOOP LAST
  RET
DISP ENDP

CODE ENDS
  END BEG
  • 十六進制輸出

    .586
    ;將BUF單元中的數(shù)字轉(zhuǎn)為16進制
    DATA SEGMENT USE16
      BUF DW 987AH
    DATA ENDS
    
    CODE SEGMENT USE16
    ASSUME CS:CODE, DS:DATA
    BEG:
      MOV AX, DATA
      MOV DS, AX
      MOV DX, BUF
      MOV CX, 4
      ;算術(shù)左移陪踩,低位補0
      SAL EDX, 16
    AGA:
      ROL EDX, 4
      AND DL, 0FH
      CMP DL ,10
      JC NEXT
      ADD DL, 7
    NEXT:
      ADD DL, 30H
      MOV AH, 2
      INT 21H
      LOOP AGA
      MOV AH, 4CH
      INT 21H
    CODE ENDS
    END BEG
    
  • 16進 制轉(zhuǎn)為 十進制顯示程序

    .586
    CMPDISP MACRO NN  ;設(shè)置一個宏
      LOCAL LAST,NEXT
      MOV DL,0
      LAST:
          CMP BEN,NN
          JC NEXT
          INC DL
          SUB BEN, NN
          JMP LAST
      NEXT:
          ADD DL,30H  ;ASCII
    ENDM
      
    DATA SEGMENT USE16
      BEN DW 1287H        ;4743
      TAB DW 10000,1000,100,10,1
      COUNT EQU ($-TAB)/2     ;查看TAB分配了多少單元格
      BUF DB COUNT DUP(?),'$';輸出緩沖區(qū)
    DATA ENDS
    
    CODE SEGMENT USE16
      ASSUME CS:CODE, DS:DATA
      BEG:
          MOV AX, DATA
          MOV DS, AX
          MOV CX, COUNT
          MOV BX, OFFSET TAB
          MOV SI, OFFSET BUF
      AGA:
          MOV AX, [BX]
          CMPDISP AX
          MOV [SI], DL
          ADD BX, 2
          INC SI
          LOOP AGA
      MOV SI, OFFSET BUF
      NOSP:
          CMP BYTE PTR[SI], 30H
          JNZ DISP
          INC SI
          JMP NOSP 
      DISP:
          MOV AH, 9 
          MOV DX, SI
          INT 21H
          MOV AH, 4CH
          INT 21H
    CODE ENDS
      END BEG
    

五.MOOC題目

第一章

image

第二章

image

第四章

image

第五章

image

第六章

image

第七章

image

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杖们,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肩狂,更是在濱河造成了極大的恐慌摘完,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傻谁,死亡現(xiàn)場離奇詭異孝治,居然都是意外死亡,警方通過查閱死者的電腦和手機审磁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門谈飒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人态蒂,你說我怎么就攤上這事杭措。” “怎么了吃媒?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵瓤介,是天一觀的道長吕喘。 經(jīng)常有香客問我赘那,道長,這世上最難降的妖魔是什么氯质? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任募舟,我火速辦了婚禮,結(jié)果婚禮上闻察,老公的妹妹穿的比我還像新娘拱礁。我一直安慰自己琢锋,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布呢灶。 她就那樣靜靜地躺著吴超,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸯乃。 梳的紋絲不亂的頭發(fā)上鲸阻,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音缨睡,去河邊找鬼鸟悴。 笑死,一個胖子當著我的面吹牛奖年,可吹牛的內(nèi)容都是我干的细诸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陋守,長吁一口氣:“原來是場噩夢啊……” “哼震贵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起水评,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屏歹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后之碗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙眶,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年褪那,在試婚紗的時候發(fā)現(xiàn)自己被綠了幽纷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡博敬,死狀恐怖友浸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偏窝,我是刑警寧澤收恢,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布植锉,位于F島的核電站范舀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏零酪。R本人自食惡果不足惜硼补,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一驮肉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧已骇,春花似錦离钝、人聲如沸票编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慧域。三九已至,卻和暖如春浪读,著一層夾襖步出監(jiān)牢的瞬間吊趾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工瑟啃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留论泛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓蛹屿,卻偏偏與公主長得像屁奏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子错负,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容