目录
1.显示字符串
其实这里面主要的问题是要用的寄存器比较多,像ax,cx会被经常用到,所以要用许多寄存器
比如bl代替cl来存储颜色,di与es配对,si与ds配对,ax就随插随用
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 bl,cl;将颜色存入bl
mov ax,0b800h
mov es,ax;用es显存起始位置
sub di,di;对di赋0
dec dh
dec dl;减一符合机器的习惯
;计算显示位置
mov al,160
mul dh;ax找到对应行
add dl,dl;一列元素一列属性,所以要乘2
mov cl,dl
mov ch,0
add ax,cx;行加列
mov di,ax;将最终开始存储的地方存入di
s: mov cl,ds:[si]
mov ch,0
jcxz ok;判断是否为零
;输出
mov ax,ds:[si]
mov es:[di],ax
inc di
inc si
mov es:[di],bl
inc di
jmp short s
ok: ret
code ends
end start
2.解决除法溢出的问题
除法如果被除数为16位
那么DX存高位,AX存低位
结果AX存商,DC存余数
利用好上面这个关系和题目给的公式就可以了
assume cs:code
code segment
start:
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ah,4ch
divdw:
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
push ax
push dx
pop cx
pop ax
pop dx
ret
code ends
end start
先用u指令看一下程序何时结束,直接用g指令到那个地方就可以快速执行完程序了
3.数值显示
这一题会用到很多个段的配合
总共分为如下结构:
初始化数据
进入写操作,将二进制数据写成十进制字符串
根据书上给的算法,从个位开始一位一位取出并+30h放入栈中,同时统计长度(jxcz)
入栈完成之后将其用loop循环一个个返回到开辟的数据段
初始化需要显示的信息
按照第一题的方法显示出来
assume cs:code
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 ax,4c00h
int 21h
dtoc:
push si
push dx
push cx
push bx
push ax
mov si,0
mov bx,10
change:
mov dx,0
div bx
mov cx,ax
jcxa last
add dx,30h
push dx
inc si
jmp short change
last:
add dx,30h
push dx
inc si
mov cx,si
mov si,0
s:
pop ds:[si]
inc si
loop s
exit_dtoc:
pop ax
pop bx
pop cx
pop dx
pop si
ret
show_str:
push ax
push es
push dx
push bx
push si
push di
mov ax.0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax
add dl,dl
add bx,dl
mov al,cl
mov ch,0
show:
mov cl,ds:[si]
jcxz exit_show_str
mov es:[bx],cl
inc si
inc bx
mov es:[bx+1],al
jmp short show
exit_show_str:
pop di
pop si
pop bx
pop dx
pop es
pop ax
code ends
end start