日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

汇编实验 用表格形式显示字符(附源码详细注释和相关注意的知识)

發(fā)布時(shí)間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编实验 用表格形式显示字符(附源码详细注释和相关注意的知识) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/qq_40774175/article/details/82867157

基礎(chǔ)知識(shí):

換行的ASCII碼:10 ,也就是0ah

回車的ASCII碼:13 ,也就是0dh

一般先回車,再換行

1. 匯編中的幾個(gè)常用標(biāo)志符號(hào)

??CF是進(jìn)位標(biāo)志,
?PF是奇偶標(biāo)志
?AF是輔助進(jìn)位標(biāo)志
?ZF是零標(biāo)志
?SF是符號(hào)標(biāo)志
?OF是溢出標(biāo)志.

2. cmp 的使用

?cmp 是將兩個(gè)操作數(shù)進(jìn)行相減,但是不保存結(jié)果,只保存相關(guān)的標(biāo)志(AF,ZF等),有了這些標(biāo)志,可以輔助于轉(zhuǎn)移語(yǔ)句中。

?

3. 條件轉(zhuǎn)移指令及轉(zhuǎn)移條件

??

je ? ? 等于則轉(zhuǎn)移 ? ? ? ? zf=1

jne ? 不等于則轉(zhuǎn)移 ? ? zf=0

jb ? ? ?低于則轉(zhuǎn)移 ? ? ? ?cf=1

jnb ? ?不低于則轉(zhuǎn)移 ? ?cf=0

ja ? ? ? 高于則轉(zhuǎn)移 ? ? ? ?cf=0且zf=0

jna ? ? 不高于則轉(zhuǎn)移 ? ?cf=1或zf=1

4. loop 語(yǔ)句

?loop 循環(huán)語(yǔ)句利用cx的值來(lái)記錄循環(huán)次數(shù),每次減一,直到為0。

?

5. int 21h

? ?int 21h 是系統(tǒng)調(diào)用,執(zhí)行它以后,干什么取決于ax中的內(nèi)容:

? ?

AH

功能

調(diào)用參數(shù)

返回參數(shù)

00

程序終止(同INT 20H)

CS=程序段前綴

01

鍵盤輸入并回顯

AL=輸入字符

02

顯示輸出

DL=輸出字符

03

異步通迅輸入

AL=輸入數(shù)據(jù)

04

異步通迅輸出

DL=輸出數(shù)據(jù)

05

打印機(jī)輸出

DL=輸出字符

06

直接控制臺(tái)I/O

DL=FF(輸入)
DL=字符(輸出)

AL=輸入字符

07

鍵盤輸入(無(wú)回顯)

AL=輸入字符

08

鍵盤輸入(無(wú)回顯)
檢測(cè)Ctrl-Break

AL=輸入字符

09

顯示字符串

DS:DX=串地址
'$'結(jié)束字符串

0A

鍵盤輸入到緩沖區(qū)

DS:DX=緩沖區(qū)首地址
(DS:DX)=緩沖區(qū)最大字符數(shù)

(DS:DX+1)=實(shí)際輸入的字符數(shù)

0B

檢驗(yàn)鍵盤狀態(tài)

AL=00?有輸入
AL=FF?無(wú)輸入

0C

清除輸入緩沖區(qū)并
請(qǐng)求指定的輸入功能

AL=輸入功能號(hào)
(1,6,7,8,A)

0D

磁盤復(fù)位

清除文件緩沖區(qū)

0E

指定當(dāng)前缺省的磁盤驅(qū)動(dòng)器

DL=驅(qū)動(dòng)器號(hào)?0=A,1=B,...

AL=驅(qū)動(dòng)器數(shù)

0F

打開文件

DS:DX=FCB首地址

AL=00?文件找到
AL=FF?文件未找到

10

關(guān)閉文件

DS:DX=FCB首地址

AL=00?目錄修改成功
AL=FF?目錄中未找到文件

11

查找第一個(gè)目錄項(xiàng)

DS:DX=FCB首地址

AL=00?找到
AL=FF?未找到

12

查找下一個(gè)目錄項(xiàng)

DS:DX=FCB首地址
(文件中帶有*或?)

AL=00?找到
AL=FF?未找到

13

刪除文件

DS:DX=FCB首地址

AL=00?刪除成功
AL=FF?未找到

14
?

順序讀
?

DS:DX=FCB首地址
?

AL=00?讀成功
? =01?文件結(jié)束,記錄中無(wú)數(shù)據(jù)
? =02 DTA空間不夠
? =03?文件結(jié)束,記錄不完整

15

順序?qū)?/p>

DS:DX=FCB首地址

AL=00?寫成功
? =01?盤滿
? =02 DTA空間不夠

16

建文件

DS:DX=FCB首地址

AL=00?建立成功
? =FF?無(wú)磁盤空間

17

文件改名

DS:DX=FCB首地址
(DS:DX+1)=舊文件名
(DS:DX+17)=新文件名

AL=00?成功
AL=FF?未成功

19

取當(dāng)前缺省磁盤驅(qū)動(dòng)器

AL=缺省的驅(qū)動(dòng)器號(hào)?0=A,1=B,2=C,...

1A

置DTA地址

DS:DX=DTA地址

1B
?

取缺省驅(qū)動(dòng)器FAT信息
?

AL=每簇的扇區(qū)數(shù)
DS:BX=FAT標(biāo)識(shí)字節(jié)
CX=物理扇區(qū)大小
DX=缺省驅(qū)動(dòng)器的簇?cái)?shù)

1C

取任一驅(qū)動(dòng)器FAT信息

DL=驅(qū)動(dòng)器號(hào)

同上

21
?

隨機(jī)讀
?

DS:DX=FCB首地址
?

AL=00?讀成功
? =01?文件結(jié)束
? =02?緩沖區(qū)溢出
? =03?緩沖區(qū)不滿

22

隨機(jī)寫

DS:DX=FCB首地址

AL=00?寫成功
? =01?盤滿
? =02?緩沖區(qū)溢出

23

測(cè)定文件大小

DS:DX=FCB首地址

AL=00?成功(文件長(zhǎng)度填入FCB)
AL=FF?未找到

24

設(shè)置隨機(jī)記錄號(hào)

DS:DX=FCB首地址

25

設(shè)置中斷向量

DS:DX=中斷向量
AL=中斷類型號(hào)

26

建立程序段前綴

DX=新的程序段前綴

27
?

隨機(jī)分塊讀
?

DS:DX=FCB首地址
CX=記錄數(shù)

AL=00?讀成功
? =01?文件結(jié)束
? =02?緩沖區(qū)太小,傳輸結(jié)束
? =03?緩沖區(qū)不滿

28

隨機(jī)分塊寫

DS:DX=FCB首地址
CX=記錄數(shù)

AL=00?寫成功
? =01?盤滿
? =02?緩沖區(qū)溢出

29

分析文件名

ES:DI=FCB首地址
DS:SI=ASCIIZ串
AL=控制分析標(biāo)志

AL=00?標(biāo)準(zhǔn)文件
? =01?多義文件
? =02?非法盤符

2A

取日期

CX=年
DH:DL=月:日(二進(jìn)制)

2B

設(shè)置日期

CX:DH:DL=年:月:日

AL=00?成功
? =FF?無(wú)效

2C

取時(shí)間

CH:CL=時(shí):分
DH:DL=秒:1/100秒

2D

設(shè)置時(shí)間

CH:CL=時(shí):分
DH:DL=秒:1/100秒

AL=00?成功
? =FF?無(wú)效

2E

置磁盤自動(dòng)讀寫標(biāo)志

AL=00?關(guān)閉標(biāo)志
AL=01?打開標(biāo)志

2F

取磁盤緩沖區(qū)的首址

ES:BX=緩沖區(qū)首址

30

取DOS版本號(hào)

AH=發(fā)行號(hào),AL=版本

31

結(jié)束并駐留

AL=返回碼
DX=駐留區(qū)大小

33
?

Ctrl-Break檢測(cè)
?

AL=00?取狀態(tài)
? =01?置狀態(tài)(DL)
DL=00?關(guān)閉檢測(cè)
? =01?打開檢測(cè)

DL=00?關(guān)閉Ctrl-Break檢測(cè)
? =01?打開Ctrl-Break檢測(cè)

35

取中斷向量

AL=中斷類型

ES:BX=中斷向量

36

?

取空閑磁盤空間

?

DL=驅(qū)動(dòng)器號(hào)?
0=缺省,1=A,2=B,...
?

成功:AX=每簇扇區(qū)數(shù)
???? BX=有效簇?cái)?shù)
???? CX=每扇區(qū)字節(jié)數(shù)
???? DX=總簇?cái)?shù)
失敗:AX=FFFF

38

置/取國(guó)家信息

DS:DX=信息區(qū)首地址

BX=國(guó)家碼(國(guó)際電話前綴碼)
AX=錯(cuò)誤碼

39

建立子目錄(MKDIR)

DS:DX=ASCIIZ串地址

AX=錯(cuò)誤碼

3A

刪除子目錄(RMDIR)

DS:DX=ASCIIZ串地址

AX=錯(cuò)誤碼

3B

改變當(dāng)前目錄(CHDIR)

DS:DX=ASCIIZ串地址

AX=錯(cuò)誤碼

3C

建立文件

DS:DX=ASCIIZ串地址
CX=文件屬性

成功:AX=文件代號(hào)
錯(cuò)誤:AX=錯(cuò)誤碼

3D
?

打開文件
?

DS:DX=ASCIIZ串地址
AL=0?讀
? =1?寫
? =3?讀/寫

成功:AX=文件代號(hào)
錯(cuò)誤:AX=錯(cuò)誤碼

3E

關(guān)閉文件

BX=文件代號(hào)

失敗:AX=錯(cuò)誤碼

3F
?

讀文件或設(shè)備
?

DS:DX=數(shù)據(jù)緩沖區(qū)地址
BX=文件代號(hào)
CX=讀取的字節(jié)數(shù)

讀成功:
? AX=實(shí)際讀入的字節(jié)數(shù)
? AX=0?已到文件尾
讀出錯(cuò):AX=錯(cuò)誤碼

40

寫文件或設(shè)備

DS:DX=數(shù)據(jù)緩沖區(qū)地址
BX=文件代號(hào)
CX=寫入的字節(jié)數(shù)

寫成功:
? AX=實(shí)際寫入的字節(jié)數(shù)
寫出錯(cuò):AX=錯(cuò)誤碼

41

刪除文件

DS:DX=ASCIIZ串地址

成功:AX=00
出錯(cuò):AX=錯(cuò)誤碼(2,5)

42

?

移動(dòng)文件指針

?

BX=文件代號(hào)
CX:DX=位移量
AL=移動(dòng)方式(0:從文件頭絕對(duì)位移,1:從當(dāng)前位置相對(duì)移動(dòng),2:從文件尾絕對(duì)位移)

成功:DX:AX=新文件指針位置
出錯(cuò):AX=錯(cuò)誤碼
?

43
?

置/取文件屬性
?

DS:DX=ASCIIZ串地址
AL=0?取文件屬性
AL=1?置文件屬性
CX=文件屬性

成功:CX=文件屬性
失敗:CX=錯(cuò)誤碼

44



?

設(shè)備文件I/O控制



?

BX=文件代號(hào)
AL=0?取狀態(tài)
? =1?置狀態(tài)DX
? =2?讀數(shù)據(jù)
? =3?寫數(shù)據(jù)
? =6?取輸入狀態(tài)
? =7?取輸出狀態(tài)

DX=設(shè)備信息



?

45

復(fù)制文件代號(hào)

BX=文件代號(hào)1

成功:AX=文件代號(hào)2
失敗:AX=錯(cuò)誤碼

46

人工復(fù)制文件代號(hào)

BX=文件代號(hào)1
CX=文件代號(hào)2

失敗:AX=錯(cuò)誤碼

47

取當(dāng)前目錄路徑名

DL=驅(qū)動(dòng)器號(hào)
DS:SI=ASCIIZ串地址

(DS:SI)=ASCIIZ串
失敗:AX=出錯(cuò)碼

48

分配內(nèi)存空間

BX=申請(qǐng)內(nèi)存容量

成功:AX=分配內(nèi)存首地
失敗:BX=最大可用內(nèi)存

49

釋放內(nèi)容空間

ES=內(nèi)存起始段地址

失敗:AX=錯(cuò)誤碼

4A

調(diào)整已分配的存儲(chǔ)塊

ES=原內(nèi)存起始地址
BX=再申請(qǐng)的容量

失敗:BX=最大可用空間
???? AX=錯(cuò)誤碼

4B
?

裝配/執(zhí)行程序
?

DS:DX=ASCIIZ串地址
ES:BX=參數(shù)區(qū)首地址
AL=0?裝入執(zhí)行
AL=3?裝入不執(zhí)行

失敗:AX=錯(cuò)誤碼
?

4C

帶返回碼結(jié)束

AL=返回碼

4D

取返回代碼

AX=返回代碼

4E

查找第一個(gè)匹配文件

DS:DX=ASCIIZ串地址
CX=屬性

AX=出錯(cuò)代碼(02,18)

4F

查找下一個(gè)匹配文件

DS:DX=ASCIIZ串地址
(文件名中帶有?或*)

AX=出錯(cuò)代碼(18)

54

取盤自動(dòng)讀寫標(biāo)志

AL=當(dāng)前標(biāo)志值

56

文件改名

DS:DX=ASCIIZ串(舊)
ES:DI=ASCIIZ串(新)

AX=出錯(cuò)碼(03,05,17)

57

置/取文件日期和時(shí)間

BX=文件代號(hào)
AL=0?讀取
AL=1?設(shè)置(DX:CX)

DX:CX=日期和時(shí)間
失敗:AX=錯(cuò)誤碼

58

取/置分配策略碼

AL=0?取碼
AL=1?置碼(BX)

成功:AX=策略碼
失敗:AX=錯(cuò)誤碼

59
?

取擴(kuò)充錯(cuò)誤碼
?

AX=擴(kuò)充錯(cuò)誤碼
BH=錯(cuò)誤類型
BL=建議的操作
CH=錯(cuò)誤場(chǎng)所

5A

建立臨時(shí)文件

CX=文件屬性
DS:DX=ASCIIZ串地址

成功:AX=文件代號(hào)
失敗:AX=錯(cuò)誤碼

5B

建立新文件

CX=文件屬性
DS:DX=ASCIIZ串地址

成功:AX=文件代號(hào)
失敗:AX=錯(cuò)誤碼

5C

?

控制文件存取

?

AL=00封鎖
? =01開啟
BX=文件代號(hào)
CX:DX=文件位移
SI:DI=文件長(zhǎng)度

失敗:AX=錯(cuò)誤碼

?

62

取程序段前綴

BX=PSP地址

<p class="cye-lm-tag">&nbsp;</p></td></tr></tbody></table></div></td></tr></tbody></table></div></td></tr></tbody></table></div><p class="cye-lm-tag">&nbsp;</p>

6. 輸出換行

?

? mov dl,0ah??//換行

? ?int 21h?

??mov dl,0dh??//回車符,作用是用來(lái)確認(rèn)

? int 21h

7. 代碼和注釋

  • code segment
  • assume cs:code
  • start:
  • mov dx,0010h //數(shù)字0
  • next:
  • mov cx,10h //計(jì)數(shù)16列
  • loop1:
  • mov ah,02h
  • int 21h //系統(tǒng)調(diào)用,至于做什么事,取決于你往al里面放什么
  • inc dx // +1
  • push dx //放入棧中
  • mov dl,0
  • int 21h
  • pop dx //將dx移除站內(nèi)
  • loop loop1 //利用cx的計(jì)數(shù)器來(lái)控制循環(huán)計(jì)數(shù)
  • push dx
  • mov dl,0ah //換行
  • int 21h
  • mov dl,0dh //回車符,開始顯示下一行
  • int 21h
  • pop dx
  • cmp dx,100h
  • jb next //低于100h則轉(zhuǎn)移,看cf ,cf=1,代表有進(jìn)位或借位,說(shuō)明小于,可以進(jìn)行轉(zhuǎn)移。
  • mov ah,4ch //帶返回碼結(jié)束
  • int 21h
  • code ends //結(jié)束定義的段
  • end start //結(jié)束程序
  • ?

    源碼2:

    ;PROGRAM TITLE GOES HERE --SMASCII
    ;*********************************
    prognam segment
    ;---------------------------------
    main proc far //proc應(yīng)該是“程序調(diào)用”的意思
    assumecs:prognam
    start:
    ;MAIN PART OF PROGRAM GOES HERE
    mov dl,10h //ah=02h時(shí),是“顯示輸出”的功能,DL=輸出字符
    mov di,15 //15行
    loop1:
    mov cx,16 //16列
    next:
    movah,02h //顯示ASCII碼為10H的字符,
    int21h
    call space //space是子程序名字,此前并未定義,是的呀,以前程序中,跳轉(zhuǎn)到的程序段之前也沒(méi)有定義,是后面才定義的,但能夠正確執(zhí)行,這和C語(yǔ)言中的函數(shù)需要事先聲明有點(diǎn)兒不同。
    inc dl
    loop next ;會(huì)自動(dòng)把cx減去1
    call enter ;一行顯示結(jié)束,進(jìn)行回車、換行
    dec di
    jne loop1 //若di減去1后不等于0,那么就繼續(xù)到loop1執(zhí)行循環(huán),不會(huì)執(zhí)行下面的ret,若di-1后==0,那么程序結(jié)束,執(zhí)行ret
    ret
    space proc
    push dx
    mov dl,20h ;ascII為20h的字符是可以顯示的空格,應(yīng)該是每顯示一個(gè)字符,就 調(diào)用一次子程序space,來(lái)顯示一個(gè)空格(可是要求中不是讓用NUL把兩個(gè)字符隔開嗎?可是NUL是不可顯示的控制字符,用mov ah,02h int 21h也就沒(méi)有意義了呀(02顯示輸出DL=輸出字符),到底是不是這樣呢?自己可以用debug或者另外一個(gè)源文件試一下,把這里的mov dl,20h改為mov dl,00h,運(yùn)行是什么情況和效果)
    mov ah,02h
    int21h
    pop dx ;疑問(wèn):為什么這里要進(jìn)行push和pop呢?(是因?yàn)轱@示完空格之后,要把dl的值加1,顯示下一個(gè)ASCII碼對(duì)應(yīng)的字符,如果不保存dx,那么dl直接被改變?yōu)?0h了,下一次Inc dl時(shí),就都是從20h加1,而不是從正確的dl值加1了)進(jìn)行子程序調(diào)用時(shí),默認(rèn)保存的是ip寄存器,其他要保存和恢復(fù)的現(xiàn)場(chǎng)要自己在子程序中手動(dòng)模擬實(shí)現(xiàn)嗎?
    ret
    space endp
    enter proc
    pushdx
    mov dl,0dh ;回車
    movah,02h
    int21h
    movdl,0ah ;換行
    movah,02h
    int21h
    pop dx
    ret
    enter endp
    main endp
    ;---------------------
    prognam ends
    ;***********************
    end start

    不帶注釋的源碼2:

    ;PROGRAM TITLE GOES HERE --SMASCII
    ;*********************************
    prognam segment
    ;---------------------------------
    main proc far
    assume cs:prognam
    start:
    ;MAIN PART OF PROGRAM GOES HERE
    mov dl,10h
    mov di,15
    loop1:
    mov cx,16
    next:
    mov ah,02h
    int 21h
    call space
    inc dl
    loop next
    call enter
    dec di
    ;jne loop1
    jnz loop1
    ;ret
    mov ah,4ch ;return to DOS
    int 21h

    space proc
    push dx
    mov dl,00h
    mov ah,02h
    int 21h
    pop dx
    ret
    space endp
    enter proc
    push dx
    mov dl,0dh
    mov ah,02h
    int 21h
    mov dl,0ah
    mov ah,02h
    int 21h
    pop dx
    ret
    enter endp
    main endp
    ;---------------------
    prognam ends
    ;***********************
    end start

    相關(guān)問(wèn)題和注意點(diǎn)

    1.字符’\0’和空格鍵是不是同一個(gè)概念 ?
    答:’\0’和空格不是同一個(gè)概念。
    ‘\0’表示字符串結(jié)束符,代表字符串結(jié)束,而空格是一個(gè)普通字符,顯示在文本中可以選中。
    ‘\0’的ASCII碼為0,空格的ASCII碼為32,兩個(gè)不是同一個(gè)字符
    在計(jì)算機(jī)程序中通常使用’\0’表示字符串結(jié)束,空格為文本字符,二者完全不同
    不是,字符’\0’是結(jié)束符,和空格不是一個(gè)概念。比如一個(gè)字符串,是以字符’\0’結(jié)束,而一個(gè)字符串中是可以有空格的,如:“your name”
    2.匯編語(yǔ)言main proc far是什么意思
    答:(1)far和near是子程序調(diào)用時(shí)的參數(shù)
    如果子程序和調(diào)用程序在一個(gè)段內(nèi),子程序參數(shù)設(shè)置為near
    如果子程序和調(diào)用程序不在一個(gè)段內(nèi),子程序參數(shù)設(shè)置為far
    這里主程序定義為far是因?yàn)?#xff1a;
    系統(tǒng)把主程序當(dāng)作DOS調(diào)用的一個(gè)子程序
    DOS內(nèi)核與主程序不是在同一個(gè)段地址內(nèi)
    所以主程序參數(shù)要用far。
    (2)proc是子程序定義偽指令, far是該子程序的屬性,決定調(diào)用程序和子程序是否在同一代碼段。如下為子程序定義及說(shuō)明 :
    子程序名 PROC NEAR ( 或 FAR )
    ……
    ret子程序名 ENDP
    (子程序名為符合語(yǔ)法的標(biāo)識(shí)符)
    3.CALL(LCALL)指令執(zhí)行時(shí),進(jìn)行兩步操作:   (1)將程序當(dāng)前執(zhí)行的位置IP壓入堆棧中;   (2)轉(zhuǎn)移到調(diào)用的子程序。   (CALL近調(diào)用,LCALL遠(yuǎn)調(diào)用,   CALL 尋址2K空間范圍   LCALL 尋址64K空間范圍)   CALL與RET結(jié)合使用,當(dāng)CALL調(diào)用的子程序運(yùn)行到RET命令時(shí),壓入堆棧的IP彈出,跳出子程序,開始執(zhí)行CALL的下一條語(yǔ)句。
    一般來(lái)說(shuō),執(zhí)行一條CALL指令相當(dāng)于執(zhí)行一條PUSH指令加一條JMP指令。
    自己總結(jié)的子程序編寫的結(jié)構(gòu):
    ·····································································
    子程序名 proc
    保存現(xiàn)場(chǎng)(push 應(yīng)該保存的一些寄存器)
    子程序的功能對(duì)應(yīng)的指令
    恢復(fù)現(xiàn)場(chǎng)(如果前面保存了多個(gè)寄存器,則按照括號(hào)匹配的原則按順序彈出)
    ret
    子程序名 endp
    ············································································
    注意:系統(tǒng)把主程序當(dāng)作DOS調(diào)用的一個(gè)子程序
    proc 和 endp 相當(dāng)于一個(gè)括號(hào),里面是一個(gè)過(guò)程的代碼。編譯器通過(guò)這兩個(gè)符號(hào)找到代碼,進(jìn)行處理。

    4.匯編中支持多行注釋嗎?
    答:(1)nasm,masm,tasm 不支持多行注釋
    可以用
    ; comment
    ; comment
    ; comment
    ; comment
    來(lái)實(shí)現(xiàn)。
    (3)如果注釋過(guò)長(zhǎng)不能在一行完成,那么應(yīng)該在第1列單獨(dú)起一行,但不宜頻繁使用以防淹沒(méi)代碼行.如果是多行注釋可以寫成注釋塊,注釋塊與代碼行以空注釋行相分隔如下所示:
    ;
    ; comment
    ; comment
    ; comment

    5.ENDP、ENDS、END、HLT的區(qū)別:
    ENDP 表示PROC所定義的過(guò)程結(jié)束. (end procedure)
    ENDS 表示SEGMENT定義的段結(jié)束. (end segment)
    END 程序結(jié)束.
    8086匯編語(yǔ)言中HLT代表什么?與END的區(qū)別在哪里?
    答:HLT是CPU指令CPU遇到該指令停止執(zhí)行命令
    END是匯編編譯器的偽指令,不會(huì)被CPU執(zhí)行,只會(huì)被編譯器執(zhí)行。
    6.Intel80x86系列匯編語(yǔ)言中的LOOP指令,是循環(huán)指令,循環(huán)次數(shù)由計(jì)數(shù)寄存器CX指定。是否執(zhí)行循環(huán)體的判斷指令在循環(huán)體之后,所以,至少執(zhí)行1次循環(huán)體,即至少循環(huán)1次。執(zhí)行LOOP指令時(shí),CPU自動(dòng)將CX的值減1,若CX=0,則結(jié)束循環(huán);否則,重復(fù)執(zhí)行循環(huán)體。
    簡(jiǎn)言之:loop指令會(huì)自動(dòng)把cx的值減一,若不為0,則繼續(xù)執(zhí)行循環(huán)體。
    7.匯編語(yǔ)言中je 和jne的區(qū)別
    這兩條指令都是對(duì)ZF的判斷,只是ZF= 1的時(shí)候je des表示跳轉(zhuǎn)到des處,而jne用法相似,當(dāng)ZF = 0的時(shí)候跳轉(zhuǎn),而修改ZF位則是前面的指令執(zhí)行結(jié)果,一般是減法或者cmp等等,簡(jiǎn)單記憶就是je為相等轉(zhuǎn)移,jne是不相等轉(zhuǎn)移
    上面說(shuō)的正確嗎?那么je和jne與jz和jnz還有什么區(qū)別呢?不就一樣了嗎?
    jz 表示當(dāng)zf =1 時(shí)跳轉(zhuǎn),即結(jié)果為0跳轉(zhuǎn)。jnz 即 zf=0 時(shí)跳轉(zhuǎn),即結(jié)果不為0 跳轉(zhuǎn)。
    是正確的,網(wǎng)上的一些說(shuō)法:
    JE ,JZ兩個(gè)命令有什么區(qū)別?
    諸多回答:應(yīng)該是一樣的吧……兩個(gè)命令譯成機(jī)器都是74,對(duì)于CPU來(lái)說(shuō),這兩條命令是沒(méi)有分別的
    幾乎沒(méi)有分別,都是相等就轉(zhuǎn)的意思。
    看起來(lái)方便些. cmp指令后用je; test指令后用jz, 這樣子上下文看著比較順!
    一樣。一個(gè)指令兩種寫法。
    這只是編譯器上做的處理,他們是一樣的,還記得匯編語(yǔ)言的開發(fā)目的和定義嗎?是為了讓人們從煩瑣單調(diào)的機(jī)器碼中解放出來(lái).
    8.RET指令的內(nèi)部操作是:棧頂字單元出棧,其值賦給IP寄存器。即實(shí)現(xiàn)了一個(gè)程序的轉(zhuǎn)移,將棧頂字單元保存的偏移地址作為下一條指令的偏移地址。
    關(guān)于ret和mov ah,4ch int 21h
    (1)RET 是子程序返回用的
    調(diào)用子程序用的是call 標(biāo)號(hào) 這個(gè)標(biāo)號(hào)就是子程序的入口 就是一個(gè)跳轉(zhuǎn) 但是得保護(hù)現(xiàn)場(chǎng)(因?yàn)檎{(diào)用完了需要返回到CALL 標(biāo)號(hào)的下條指令) 如果是近距離的call 則 需要執(zhí)行3步 1 CS入棧 2 IP入棧 3跳到標(biāo)號(hào)
    而子程序結(jié)束后 RET 的功能是 1 IP出棧 2 CS出棧(這就返回了) 返回后執(zhí)行CALL 標(biāo)號(hào)的下一條指令

    而 mov ax,4c00h
    int 21h
    是返回DOS的功能調(diào)用
    (2)ret 是用于子程序返回,返回調(diào)用該子程序的地方mov ah,4ch int 21h 返回DOS系統(tǒng)
    9.匯編語(yǔ)言中的psp空間干什么用的?
    (1)段前綴是操作系統(tǒng)在執(zhí)行程序時(shí)為程序所建立的一個(gè)信息塊, 里面包括了傳遞給待運(yùn)行程序的命令行參數(shù), 程序運(yùn)行結(jié)束時(shí)返回DOS所需的地址等有用的信息.
    COM格式比較特殊,數(shù)據(jù)段,代碼段,堆棧段集中在一個(gè)段里,連PSP也集中在這個(gè)段里, 于是段的前100H就用來(lái)存放PSP了.
    EXE文件在運(yùn)行時(shí)DS/ES的初值設(shè)為PSP的段地址,可以直接用偏移0-100H訪問(wèn)PSP的內(nèi)容。
    (2)一般來(lái)說(shuō),PSP是256個(gè)字節(jié),當(dāng)程度生成了可執(zhí)行文件以后,在執(zhí)行的時(shí)候,先將程序調(diào)入內(nèi)存,這個(gè)時(shí)候DS中存入程序在內(nèi)存中的段地址,緊接著是程序的一些說(shuō)明,比如說(shuō)程序占用多大空間等等,這就是PSP,一般PSP占256個(gè)字節(jié),然后才是真正的程序地址,將CS指向這里,IP設(shè)為0000,為什么一般CS要比DS大10H,就是因?yàn)檫@個(gè)原因,簡(jiǎn)單說(shuō):DS存放的是程序段地址,由于PSP的存在,真正要執(zhí)行的地址是DS再加上256個(gè)字節(jié),真正的地址是DS16+256化簡(jiǎn)一下:DS16+0+1616=16(DS+16)真正的地址又可以寫成:cs*16+0
    所以CS相當(dāng)于DS+16,化成十六制是DS+10
    10.助記符和操作數(shù)可以連在一起嗎?
    例如movcx,16的寫法是否正確呢?
    不正確,一定要分開,否則會(huì)報(bào)錯(cuò),說(shuō)你這一行缺少direction,因?yàn)檫B在一起后,編譯器就無(wú)法正確識(shí)別了。
    11.匯編中注釋的分號(hào)只能寫在第一列嗎?
    答:不是,這是無(wú)稽之談。
    12.很多代碼都會(huì)以start:表示開始,以end start表示結(jié)束,但有個(gè)問(wèn)題
    start: 表示一個(gè)標(biāo)號(hào),最后可不可不要end start這一句,
    因在一個(gè)代碼中出現(xiàn)了很多標(biāo)號(hào)時(shí),并沒(méi)有見到每個(gè)標(biāo)號(hào)都以“end 標(biāo)號(hào)” 去表示結(jié)束
    答:start:表示這兒第一條匯編開始運(yùn)行,
    end start表示匯編指令結(jié)束了,,, 匯編就那么個(gè)語(yǔ)法,你怎么去掉。。

    PS:endp表示子程序結(jié)束處
    ends表示段定義結(jié)束,數(shù)據(jù)段、附加數(shù)據(jù)段、堆棧、代碼段結(jié)束處。。
    個(gè)人理解:假如start不是表示程序從此處開始執(zhí)行,而僅僅是一個(gè)標(biāo)號(hào)的作用,那么最后面
    就不要寫為end start,而要寫為end main(當(dāng)匯編從main開始執(zhí)行時(shí))
    總結(jié)了,就是匯編程序的第一句從哪兒開始執(zhí)行,最后面表示end assembly的語(yǔ)句中的end后面就跟的是什么,不一定是start,也不一定是main,甚至可以是你自己定義的(表示程序最開始從哪兒執(zhí)行的)標(biāo)號(hào)的名字,都是名稱而已。
    13.匯編語(yǔ)言的偽指令是什么?
    答:不直接產(chǎn)生機(jī)器碼的指令,主要用于協(xié)助匯編程序進(jìn)行匯編,比如定位指令org、常量定義指令equ、程序塊指令segment/ends或proc/endp或micro/endm 等等。
    就是不會(huì)轉(zhuǎn)化成機(jī)器碼的指令 像mov ax,bx這樣的代碼匯編以后會(huì)轉(zhuǎn)化成機(jī)器碼 但是像 .section這樣的源碼只是在編譯過(guò)程中有效,編譯以后的機(jī)器碼就與它無(wú)關(guān)了,叫偽指令。
    偽指令不生成真正的執(zhí)行代碼… 但是又不能缺少! 因?yàn)樗赡芏x一些完成編譯 不可缺少的條件或東西。
    14.匯編中push和pop的操作數(shù)可以是什么?Push dl可以嗎?還是必須是push dx?
    答:push pop 只對(duì)字操作(不允許字節(jié)進(jìn)棧)操作數(shù)長(zhǎng)度為32位時(shí)進(jìn)出棧為雙字。
    例如 push dl是不正確的,應(yīng)該是push dx
    15.本實(shí)驗(yàn)發(fā)現(xiàn)中間用ASCII碼為0的字符和空格字符分隔它們,顯示結(jié)果是一樣的,而且
    用mov ah,4ch int 21h的方法返回DOS更好,用ret沒(méi)有成功返回,有時(shí)候會(huì)出現(xiàn)問(wèn)題。

    總結(jié)

    以上是生活随笔為你收集整理的汇编实验 用表格形式显示字符(附源码详细注释和相关注意的知识)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。