組合語言學習(三)

2021-08-21 16:17:37 字數 4685 閱讀 4499

這部分是王爽《組合語言》第7、8章重要內容的總結。主要分為四部分:

1.用組合語言實現大小寫字母的轉換(and和or指令應用)

2.組合語言二重迴圈的寫法

3.資料處理的兩個基本問題

4.實驗七的思路與**

實驗七基本上是對之前學習內容的乙個總結應用,比較重要。大小寫字母轉換部分幫助理解ascii碼設計的奇妙,二重迴圈用到棧也是很有意思。

1.and和or用法:

由於大寫字母ascii碼二進位制第5位為0,小寫字母為1,所以可以通過andor實現的大小寫字母轉換。

通過與0操作,得到大寫字母。或1操作,得到小寫字母。

下面程式中需要注意的一點:

必須以al為中介,完成與和或的操作。

and [bx],11011111b的含義,不是[bx]這個位元組單元與上11011111b,而是[bx]這個字單元與上0000000011011111b。所以需要al保證是位元組的運算。

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

mov cx,5

s:mov al,[bx]

and al,11011111b

mov [bx],al

inc bx

loop s

mov cx,11

s1:mov al,[bx]

or al,00100000b

mov [bx],al

inc bx

loop s1

mov ax,4c00h

int 21h

code ends

2.程式設計,將datasg段中的每個單詞改為大寫字母。

涉及到的知識點:

如何編寫二重迴圈?

主要解決的問題:

第一重迴圈中cx的值,應該如何儲存?

解決方案:

1.放到暫存器中儲存

但是暫存器數量有限,萬一被佔滿該怎麼辦?

2.放到記憶體單元中儲存

每次確定資料的位址非常麻煩。

3.放到棧中儲存,通過push和pop就能解決問題

assume cs:code,ds:data,ss:stack

data segment

db 'ibm '

db 'dec '

db 'dos '

db 'vax '

data ends

stack segment

dw 0,0,0,0,0,0,0,0

stack ends

code segment

start: mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

mov sp,10h

mov cx,4

mov bx,0

s: mov si,0

push cx

mov cx,3

s1: mov al,[bx+si]

and al,11011111b

mov

[bx+si]

,al inc si

loop s1

add bx,16

pop cx

loop s

mov ax,4c00h

int 21h

code ends

end start

3.資料處理的兩個基本問題

1.處理的資料在什麼地方?

立即數、暫存器、段位址和偏移位址

2.指令要處理的資料有多長?

通過暫存器名指明要處理的資料的尺寸。

用操作符x ptr指明記憶體單元的長度,x在彙編指令中可以為word或byte。

add byte ptr [bx],2

add word ptr [bx],2

4.實驗7 定址方式在結構化資料訪問中的應用

題目要求就是將乙個公司從2023年到2023年的 年份、收入、雇員和人均收入的資料,按照一定格式儲存在table段中。其中人均收入需要用收入除以雇員數。

table段,一共有14行,每一行16個位元組。0~3位元組存年份,5~8位元組存收入,a~b位元組存雇員數,d~e位元組存人均收入。4、9、c、f位元組存空格。

思路如下:

1.程式分為三段,data段、table段和code段。用ds記錄data的段位址,es對應table,cs對應code。

2.code段中,在將資料複製到**中時,需要每一行每一行處理。所以設定迴圈,使cx=21

3.bx指向table段的每一行,從0開始每次移動10h。[bx+idata]用於定位每行的元素位置。

4.bpsi用於鎖定table段中每一行所需要的資料。

由於年份和收入每個資料項占用4個位元組,而雇員每個資料項占用2個位元組。所以bp每個迴圈增加4,bp指向當前行年份資料在data段的中位置,[bp+84]指向當前行收入資料在data段中的位置。而si每個迴圈增加2,指向當前行雇員資料在data段中的位置。

5.對於除法,要提前將收入資料的低位存在ax中,高位資料存在dx中。

6.注意轉移過程中究竟一次轉移幾個位元組,以及相應的寫法。

具體**如下:

assume cs:code,ds:data,es:table

data segment

year db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

db '1993','1994','1995'

income dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

employeenum dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw 11542,14430,15257,17800

data ends

table segment

db 21 dup ('year summ ne ?? ')

table ends

code segment

start: mov ax,data

mov ds,ax

mov ax,table

mov es,ax

mov bx,0

mov bp,0

mov si,0

mov cx,21

s: mov ax,[bp]

mov es:[bx],ax

mov ax,[bp+2]

mov es:[bx+2],ax

mov byte ptr es:[bx+4],20h

mov ax,[bp+84]

mov es:[bx+5],ax

mov dx,[bp+86]

mov es:[bx+7],dx

mov byte ptr es:[bx+9],20h

mov ax,[bp+168]

mov es:[bx+10],ax

mov ax,[bp+84]

mov byte ptr es:[bx+12],20h

div word ptr [si+168]

mov es:[bx+13],ax

mov es:[bx+15],20h

add bp,4

add bx,16

add si,2

loop s

mov ax,4c00h

int 21h

code ends

endstart

程式的缺點在於,沒有採用結構化的定址表達形式:bx.idata[si],原因是把10進製換成16進製制有些麻煩……

組合語言學習(三)

1.順序結構 略 2.分支結構 1 設計乙個分段函式,x 0,y 1 x 0,y 0 x 0,y 1.486 data segment use16 x dw data ends code segment use16 assume cs code,ds data start mov ax,data m...

組合語言學習筆記 三

ram 允許讀寫,斷電 資料 和 指令 丟失 rom 只允許讀取,斷電 資料 和 指令 不丟失 1 cpu和計算機各個部件之間的關係 通過給各個部件進行編號,例如 0 399記憶體條 401 699顯示卡 2 ram 允許讀寫,斷電 資料 和 指令 丟失 3 rom 只允許讀取,斷電 資料 和 指令...

組合語言學習

參考書籍 組合語言 王爽 著 清華大學出版社 選單導航 一 彙編基礎知識 二 暫存器和常見彙編指令演示 一 基礎知識 1 彙編指令是機器指令的助記符,同機器指令一一對應 2 每一種cpu都有自己的彙編指令集 3 cpu可以直接使用的資訊在儲存器中存放 4 在儲存器中指令和資料沒有任何區別,都是二進位...