汇编学习-王爽-实验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
;名称: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
相关文章推荐
- 王爽汇编语言第六章学习笔记和实验五答案
- 王爽汇编语言第五章学习笔记和实验四答案
- 王爽<<汇编语言>>实验九答案
- 王爽 汇编语言 第三版 实验10 编写子程序
- 王爽汇编实验10 子程序3例
- 王爽.汇编.第三版.实验12.答案
- 8086汇编学习小记-王爽汇编语言第十五章外中断及实验15
- 王爽汇编语言第二版学习笔记之实验11
- 王爽.汇编.第三版.实验16.答案
- 2.解决除法溢出问题-汇编语言(王爽)-实验10 编写子程序
- 汇编语言(王爽)--实验10编写子程序
- 汇编语言(王爽)》(第九章、实验8分析一个奇怪的程序)学习笔记
- 汇编语言(王爽)---实验10
- 王爽汇编第二版实验10
- 王爽 汇编语言 实验5 答案
- 王爽汇编语言第二版学习笔记之实验15
- 王爽.汇编.第三版.实验七.答案
- 8086汇编学习小记-王爽汇编语言实验16
- 王爽汇编语言第二版学习笔记之实验13(1)
- 8086汇编学习小记-王爽汇编语言课程实验15及课程设计2的DOS环境