王爽《組合語言》第三版 實驗10 編寫子程式

2021-09-02 07:22:01 字數 4050 閱讀 9424

1.顯示字串

;子程式描述

;名稱: show_str

;功能:在指定的位置,用指定的顏色,顯示一 個用0結束的字串。

;引數: (dh)=行號(取值範圍0~24),(d)=列 號(取值範圍0~79),

;(cl)=顏色,ds:si指向字串的首位址

;返回:無

;應用舉例:在螢幕的8行3列,用綠色顯示data段中的字串。

assume cs:code,ds:data

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

call show_str

mov ah,4ch

int 21h

show_str:

mov ax,0b800h

mov es,ax ;使用ds和es暫存器作為段暫存器

mov al,160

mul dh

mov dh,0

dec dx

add ax,dx

add ax,dx

mov di,ax ;將計算出的第乙個字元的偏移位址存在di中

mov al, cl

s: mov bl, [si]

mov es:[di], bl ;存入字元

mov es:[di+1], al ;設定屬性位元組

inc si

add di,2 ;每個字元佔2個位元組

mov cx, [si]

jcxz ok ;遇0結束

jmp short s ;迴圈存入字元

ok: ret

code ends

end start

2.解決除法溢位的問題

;名稱: divdw

;功能:進行不會產生溢位的除法運算,被除數為dword型,除數為word型,結果為dword型。

;引數: (ax)=dword 型資料的低16位,(dx)=dword型資料的高16位,(cx)=除數

;返回: (dx)=結果的高16位,(ax)=結果的低,16位(cx)=餘數

;應用舉例:計算1000000/10(f420h/0ah)

;結果:(dx)=0001h,(ax)=86a0h,(cx)=0

;公式:

;x: 被除數,範圍: [0,ffffffff]

;n: 除數,範圍: [0, ffff]

;h: x高16位,範圍: [0, ffff]

;l: x低16位,範圍: [0, ffff]

;int():描述性運算子,取商,比如,int(38/10)=3

;rem():描述性運算子,取餘數,比如,rem(38/10)=8

;公式: x/n= int(h/n)*65536 +[rem(hn)*65536+l]/n

assume cs:code

code segment

start:mov ax, 4240h

mov dx, 000fh

mov cx, 0ah ;設定被除數與除數

call divdw

mov ah,4ch

int 21h

divdw:mov bp, ax ;將被除數的低16位暫存於bp

mov ax, dx

mov dx, 0

div cx ;h/n,結果為(dx)=rem(h/n),(ax)=int(h/n)

mov bx, ax ;將int(h/n)暫存至bx

mov ax, bp ;rem(h/n)*65536+l,結果為32位,高位存於dx,低位存於ax

div cx ;[rem(h/n)*65536+l]/n,結果商存於ax,餘數存於dx

mov cx, dx ;將餘數移至cx

mov dx, bx ;int(h/n)*65536後高位存於dx,低位為0

ret

code ends

end start

3.數值顯示

;名稱: dtoc

;功能: 將word型資料轉變為表示十進位制數的字串,字串以0為結尾符。

;引數: (ax)=word型資料,ds:si指向字串的首位址

;返回: 無

;應用舉例: 程式設計,將資料12666 以十進位制的形式在螢幕的8行3列,用綠色顯示出來。

assume cs:code,ds:data

data segment

db 10 dup(0) ;開闢記憶體空間儲存字串

data ends

code segment

start:

mov ax, 12666

mov bx, data

mov ds, bx

mov si, 0

call dtoc

mov dh,8 ;行號

mov dl,3 ;列號

mov cl,2 ;顏色

call show_str

mov ah,4ch

int 21h

dtoc:

mov bx, 10

mov dx, 0

div bx ;餘數存在dx

add dl,30h ;十進位制數字加30h為其ascii碼

mov [si], dl

inc si

mov cx,ax

jcxz over ;若ax為0則結束

jmp short dtoc

over:

mov ax, si

mov dx, 0

mov cx, 2

div cx

mov cx,ax

mov bx, 0

re: ;翻轉數字順序

mov al, [bx]

mov ah, [si-1]

mov [bx], ah

mov [si-1], al

inc bx

dec si

loop re

retshow_str:

mov ax,0b800h

mov es,ax ;使用ds和es暫存器作為段暫存器

mov si, 0

mov al,160

mul dh

mov dh,0

dec dx

add ax,dx

add ax,dx

mov di,ax ;將計算出的第乙個字元的偏移位址存在di中

mov al, cl

s:

mov bl, [si]

mov es:[di], bl

mov es:[di+1], al ;設定屬性位元組

inc si

add di,2 ;每個字元佔2個位元組

mov cx, [si]

jcxz ok ;遇0結束

jmp short s

ok: 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 ...

王爽《組合語言》 第三版 實驗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 show str ...

《組合語言》王爽第三版 實驗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...