您的位置:首页 > 其它

汇编学习-王爽-实验10的答案

2013-09-12 11:09 323 查看
;------------------------------------show_str------------------------------------------------

;名称:show_str

;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串

;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址

;返回:无

我自己写的版本,和下面的另一个版本有点不一样,可能是对8行3列这句话有点分歧,不过不影响整体效果

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:
mov ax,0
mov al,160
;8位只能和8位的相乘
mul dh
add bx,ax
mov ax,0
mov al,2
mul dl
add bx,ax

mov ax,0b800H
mov es,ax
mov di,0

change:
push cx

mov cl,[si]
mov ch,0
jcxz ok

 
mov al,[si]
mov es:[bx + di],al;不能直接将[si]传递给es:[bx + di],不支持内存单元到内存单元的

mov指令
pop cx

mov es:[bx + di + 1],cl
inc si
add di,2
jmp short change

ok:
pop cx
;jcxz将直接转到ok操作,如果在这里不做pop,就会导致堆栈失衡
ret

code ends
end start

下面的答案来自作者“莫取网名”

data segment

        db 'Welcome to masm!',0

data ends

code segment

        assume cs:code,ds:data

start:

        mov dh,8     ;dh装行号(范围:1--25)

        mov dl,3              ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]

        mov cl,0cah           ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)

        mov ax,data

        mov ds,ax

        mov si,0

        call show_str

        mov ax,4c00h

        int 21h

show_str:   ;显示字符串的子程序[定义开始]

        push cx

        push si

        mov al,0A0h

        dec dh          ;行号在显存中下标从0开始,所以减1

        mul dh

        mov bx,ax

        mov al,2

        mul dl

        sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2

        add bx,ax      ;此时bx中存放的是行与列号的偏移地址

        mov ax,0B800h

        mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址

        mov di,0

        mov al,cl

        mov ch,0

s:      mov cl,ds:[si]

        jcxz ok

        mov es:[bx+di],cl       ;偶地址存放字符

        mov es:[bx+di+1],al     ;奇地址存放字符的颜色属性

        inc si

        add di,2

        jmp short s

ok:     pop si

        pop cx

        ret    ;显示字符串的子程序[定义结束]

code ends

end start

;---------------------------------------divdw-------------------------------------

;实验10.2,进行不会产生溢出的除法运算

;名称:divdw

;功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型

;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数

;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

;X/N = int(H/N)*65536 +[rem(H/N)*65536+L]/N

;;;;----------这里需要注意*65536,表示将存在低16位寄存器中的数据移入到高16位寄存器中

assume cs:code

data segment
db 10 dup(0)
db 10 dup(0)

data ends

code segment

start:
mov ax,4240H
mov dx,000fH
mov cx,0aH
call divdw
mov ax,4c00H
int 21H

divdw:
mov bx,data
mov es,bx
mov word ptr es:[0],ax;被除数的低16位
mov word ptr es:[2],dx;被除数的高16位
mov word ptr es:[4],cx;除数,16位
mov ax,dx
mov dx,0
div cx
mov word ptr es:[10],ax;将int(H/N)放入es:[10]中,这里int(H/N)*65536表示将ax换为dx,即es:[10]中存放的是结果的dx值
mov word ptr es:[12],dx;将余数存放在es:[12]中

mov ax,es:[0]
;mov dx,es:[12]
div cx
mov cx,dx
mov dx,es:[10]
ret

code ends

end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息