《組合語言》實驗 實驗

2021-10-05 03:47:24 字數 3375 閱讀 9331

注意:①db定義位元組型別變數,乙個位元組資料百佔1個位元組單度元,讀完乙個,偏移量加1

dw定義字型別變問量,乙個字資料佔2個位元組單元,讀完乙個,權偏移量加2

dd定義雙字型別變數版,乙個雙字資料佔4個位元組單元,讀完乙個,權偏移量加4

②一開始用了乙個暫存器表示所有項,但是後來發現四個資料佔的位元組數不同,所以需要兩個暫存器表示不同項才行。

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

data segment

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

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

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

;偏移位址範圍0-53h,表示21個年份的21個字串

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

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

;偏移位址範圍54h-0a7h,表示21年公司總收入的21個dword型資料

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

dw 11542,14430,15257,17800

;偏移位址範圍0a8h-0d1h,表示21年公司雇員人數的21個word型資料

data ends

table segment

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

table ends

codesg segment

start:

mov ax,table

mov es,ax

mov ax,data

mov ds,ax

mov si,0

mov di,0

mov bx,0

mov cx,21

s: ;先放年份,每個年份由四個位元組也就是兩個字構成,這樣移動更好

mov ax,[si]

mov es:[di],ax

mov ax,[si+2]

mov es:[di+2],ax

;再放收入,偏移54h

mov ax,54h[si]

mov es:5h[di],ax

mov ax,56h[si]

mov es:7h[di],ax

;再放雇員數,偏移0a8h

mov ax,0a8h[bx]

mov es:0ah[di],ax

;計算收入

mov ax,54h[bx]

mov dx,56h[bx]

div word ptr ds:0a8h[di]

mov es:0dh[di],ax

add si,4

add bx,2

add di,16

loop s

mov ax,4c00h

int 21h

codesg ends

end start

(1)因為是段內轉移,因此db後面可以填入任意大於0數字(只要不超過記憶體)

assume cs:code,ds:data

data segment

db 17 dup(0)

data ends

code segment

start: mov ax,data

mov ds,ax

mov bx,0

jmp word ptr[bx+1]

mov ax,4c00h

int 21h

code ends

end start

(2)

①:0②:code/start

(3)(cs) = 0006,(ip) = 00be

mov cl,[bx]

mov ch,0

jcxz ok

inc bx

inc cx

一開始做錯了,忘了loop指令要先cx-1

讀者可能會覺得jmp short s1會跳到程式中的s1,實則不然,jmp short是根據偏移位址跳轉的,也就是說在執行指令之前,偏移量就已經計算好了,這裡會跳轉-10直接到程式開始處執行,所以能夠正常返回。

assume cs:codesg, ds:datasg, ss:stacksg

datasg segment

db 'welcome to masm!'

db 2h,24h,71h ;三行文字的顏色

datasg ends

stacksg segment stack

db 16 dup (0)

stacksg ends

codesg segment

start:

mov ax,datasg ;ds中是資料段段位址

mov ds,ax

mov ax,stacksg

mov ss,ax ;棧指向第二段尾部

mov sp,16

mov ax,0b872h

mov es,ax ;es存放0b872h

mov cx,3 ;三行的顯示**是外層迴圈三次

mov bx,0 ;記錄當前是第幾行,也是外層迴圈的次數

s: push cx

mov cx,16 ;每行顯示16個字元,記憶體迴圈16次

mov di,0 ;記錄記憶體迴圈的次數

s0: mov al,ds:[di] ;低位元組顯示文字

mov ah,ds:[bx+16] ;高位元組顯示顏色屬性

mov si,di

add si,si ;乙個文字佔兩個位元組

mov es:[si],ax

inc di

loop s0

pop cx

mov ax,es

add ax,00ah ;切換到下一行的位置

mov es,ax

inc bx

loop s

mov ax,4c00h

int 21h

codesg ends

end start

組合語言實驗1 2

小寫字母變為大寫字母 data segment notic db please input the word 0ah,0dh data ends code segment assume cs code,ds data start mov ax,data mov ds,ax 填入ds mov cx,1...

組合語言實驗1 3

輸入10個字元,並反序輸出 data segment dd1 db 10 dup data ends code segment assume cs code,ds data start mov ax,data mov ds,ax lea bx,dd1 dd1的有效位址放入bx中 mov cx,0ah...

組合語言實驗11

編寫子程式,實現大小寫轉換 data segment db beginner s all purpose symbolic instruction code.0 data ends codesg segment assume cs codesg start mov ax,data mov ds,ax...