assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str: push dx
push cx
push si ; 保護子程式暫存器中用到的暫存器
; 由於主程式的限定
; 這裡由cpu自動為我們分配棧空間
mov di,0 ;顯示快取區中的偏移量
mov bl,dh
dec bl ; bl-1才是真正的行,因為行號從0開始計數
mov al,160
mul bl ; 每行160位元組 用 行數*每行偏移量 得到目標行的偏移量
mov bx,ax ; mul bl之後,乘積儲存在ax中,這裡要轉存入bx中
mov al,2 ; 列的偏移量為2,兩個位元組代表一列!!!
mul dl ; 與行偏移量同理
add bl,al ;將列偏移量與行偏移量相加,得到指定位置的偏移量。
mov ax,0b800h
mov es,ax ;指定顯示快取區的記憶體位置
mov al,cl ; 由於後面jcxz語句的判斷要用到cx,所以我們要將
; cl(顏色)先存下來。
s: mov ch,0
mov cl,ds:[si] ;首先將當前指向字串的某個字元存入cx中
jcxz ok ; 如果cx為0,則轉移到ok標號執行相應**
mov es:[bx+di],cl ;將字元傳入低位址
mov es:[bx+di+1],al ; 將顏色傳入高位址
add di,2 ; 列偏移量為2
inc si ; 字串的偏移量為1
loop s ; 不為0,繼續複製
ok: pop dx
pop cx
pop si ; 還原暫存器變數
ret ; 結束子程式呼叫
code ends
end start
這裡要注意,把乙個數放在了dx,高位暫存器中,那麼就相當於 65536。例如:int(h/n)65536 就相當於把int(h/n)放在了dx中。
divdw:
;先計算高位,再計算低位。低位先入棧
push ax ; 先將低位資料入棧,因為後面的div需要占用ax暫存器
mov ax,dx ; 將被除數(x的高16位)放入被除數的低16位ax中
mov dx,0 ; 將被除數的高十六位dx清零
div cx ; int(h/n), 存入ax(商)中,rem(h/n)存入dx(餘數)中
mov bx,ax ; 臨時儲存ax
pop ax ; 取出先前入棧的x的低位
div cx ; l\n
mov cx,dx ; 餘數儲存在cx裡
mov dx,bx ; dx儲存的是最終結果的高位
投機取巧之法,不過相對簡單。
assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,10h
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: push ax
push bx
push si
mov bx,10
mov si,0
s0:
mov dx,0
div bx ; ax/bx
add dx,30h ; 餘數加30
push dx ; 入棧
mov cx,ax ; 商-->cx
inc si ; 記錄迴圈次數
inc cx ; 當商為0時,也要加 1 ,方便loop判斷
loop s0 ; 首先 cx = cx -1,再判斷 cx 是否為0
mov cx,si ; cx 為迴圈次數
mov si,0 ; si 指向 ds:[0]
s1:
pop ds:[si] ; 將棧中轉化好了的資料放到記憶體中
inc si
loop s1
pop si
pop bx
pop ax
retshow_str: push dx
push cx
push si ; 保護子程式暫存器中用到的暫存器
; 由於主程式的限定
; 這裡由cpu自動為我們分配棧空間
mov di,0 ;顯示快取區中的偏移量
mov bl,dh
dec bl ; bl-1才是真正的行,因為行號從0開始計數
mov al,160
mul bl ; 每行160位元組 用 行數*每行偏移量 得到目標行的偏移量
mov bx,ax ; mul bl之後,乘積儲存在ax中,這裡要轉存入bx中
mov al,2 ; 列的偏移量為2,兩個位元組代表一列!!!
mul dl ; 與行偏移量同理
add bl,al ;將列偏移量與行偏移量相加,得到指定位置的偏移量。
mov ax,0b800h
mov es,ax ;指定顯示快取區的記憶體位置
mov al,cl ; 由於後面jcxz語句的判斷要用到cx,所以我們要將
; cl(顏色)先存下來。
s: mov ch,0
mov cl,ds:[si] ;首先將當前指向字串的某個字元存入cx中
jcxz ok ; 如果cx為0,則轉移到ok標號執行相應**
mov es:[bx+di],cl ;將字元傳入低位址
mov es:[bx+di+1],al ; 將顏色傳入高位址
add di,2 ; 列偏移量為2
inc si ; 字串的偏移量為1
loop s ; 不為0,繼續複製
ok: pop dx
pop cx
pop si ; 還原暫存器變數
ret ; 結束子程式呼叫
code ends
end start
王爽《組合語言》第三版 實驗10
assume cs code data segment db welcome to masm 0 data ends code segment start mov dh,8 行 mov dl,3 列 mov cl,2 顏色 綠 mov ax,data mov ds,ax mov si,0 call ...
《組合語言》王爽第三版 實驗9
datas segment 此處輸入資料段 db w 00000010b,e 00000010b,l 00000010b,c 00000010b,o 00000010b db m 00000010b,e 00000010b,0,t 00100100b,o 00100100b,0 db m 01110...
王爽 組合語言第三版實驗7
這個題目做了很久,使用了2中方法做出了結果,不過目前在單步除錯時還有點疑問。題目 power idea公司從1975成立一直到1995年的基本情況被定義到了datasg中,程式設計將datasg段中的資料寫入到table段中,並計算21年中的人均收入 取整 結果儲存到table段中 兩種方法我都使用...