汇编语言第十章的小程序

 解决除法溢出

assume cs:code

code segment

start:mov ax,9680h ;L

mov dx,98h ;H

mov cx,0ah ;除数

call divdw

mov ax,4c00h

int 21h

divdw:push ax

mov ax,dx ;将H放到低4位

mov dx,0

div cx ;此时ax中存储int(H/N),dx中存储rem(H/N)

mov bp,ax

mov bx,dx

;乘上65536=16^4,相当于左移四位,也就是将数据放入高4位

pop ax

div cx ;此时ax中存储int(rem(H/N)*65536+L)/N,dx储存余数

mov cx,dx

mov dx,bp

ret

code ends

end start

显示数字

assume cs:code,ds:data,ss:stack

data segment

dd 10 dup (10)

data ends

stack segment

dd 30 dup (0)

stack ends

code segment

start:mov ax,stack

mov ss,ax

mov sp,30

mov ax,1a80h

mov dx,6

mov bx,data

mov ds,bx

mov si,0

mov di,0 ;计算位数

call dtoc

mov dh,8 ;行号

mov dl,10 ;列号

mov cl,2

mov ax,data

mov ds,ax

mov si,0

call show_str

mov ax,4c00h

int 21h

dtoc:mov bx,10 ;dtoc的共能:先将各个位置的数字压入栈中,再调用

push ax

mov ax,dx ;将H放到低4位

mov dx,0

div bx ;此时ax中存储int(H/N),dx中存储rem(H/N)

mov bp,ax

;乘上65536=16^4,相当于左移四位,也就是将数据放入高4位

pop ax

div bx ;此时ax中存储int(rem(H/N)*65536+L)/N 的商,dx储存余数

add dx,30h

push dx

inc di

mov dx,bp

mov cx,ax ;判断商的低4位是否为0,为0则跳转到dtoc1,继续判断商的高4位是否为0

jcxz dtoc1

inc cx

loop dtoc

dtoc1:mov cx,dx

jcxz dtoc2 ;商的高4位也为0,说明dtoc的运算可以结束了

inc cx

loop dtoc ;否则继续运算

dtoc2:mov cx,di

dtoc3:pop ax

mov [si],ax

inc si

loop dtoc3

ret

show_str:mov ah,0

mov al,dl

mov bp,ax

sub bp,1

add bp,bp

mov ax,0b800h

mov es,ax

mov ch,0

push cx

mov cl,dh

sub cx,1

s:add bp,0a0h

loop s

str:mov ch,0

mov cl,ds:[si]

jcxz str1 ;获取当前元素后,判断是否为0

mov al,ds:[si]

mov es:[bp],al

pop cx ;取出字的属性

inc bp

mov es:[bp],cl

push cx ;保存字的属性

inc si

inc bp

loop str

str1:pop cx

ret

code ends

end start

显示字符串

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

mov si,0

call show_str

mov ax,4c00h

int 21h

show_str:mov ah,0

mov al,dl

mov bp,ax

sub bp,1

add bp,bp

mov ax,0b800h

mov es,ax

mov ch,0

push cx

mov cl,dh

sub cx,1

s:add bp,0a0h

loop s

str:mov ch,0

mov cl,ds:[si]

jcxz ok ;获取当前元素后,判断是否为0

mov al,ds:[si]

mov es:[bp],al

pop cx ;取出字的属性

inc bp

mov es:[bp],cl

push cx ;保存字的属性

inc si

inc bp

loop str

ok:pop cx

ret

code ends

end start

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值