注意:①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...