王爽《組合語言》 第三版 實驗10解析

2022-09-08 02:15:10 字數 3634 閱讀 9188

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段中 兩種方法我都使用...