這部分是王爽《組合語言》第7、8章重要內容的總結。主要分為四部分:
1.用組合語言實現大小寫字母的轉換(and和or指令應用)
2.組合語言二重迴圈的寫法
3.資料處理的兩個基本問題
4.實驗七的思路與**
實驗七基本上是對之前學習內容的乙個總結應用,比較重要。大小寫字母轉換部分幫助理解ascii碼設計的奇妙,二重迴圈用到棧也是很有意思。
1.and和or用法:
由於大寫字母ascii碼二進位制第5位為0,小寫字母為1,所以可以通過and
和or
實現的大小寫字母轉換。
通過與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.bp
和si
用於鎖定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 在儲存器中指令和資料沒有任何區別,都是二進位...