您现在的位置是:主页 > news > 企业网站 备案/网络推广理实一体化软件
企业网站 备案/网络推广理实一体化软件
admin2025/6/21 23:51:41【news】
简介企业网站 备案,网络推广理实一体化软件,新媒体推广,大庆网站开发制作1. 显示字符串 名称:show_str 功能:在指定位置,指定颜色,显示一个0结尾的字符串 参数:dh行号,dl列号,cl颜色 如:在8号3列显示数据段的字符串。 assume cs:code,ds:data,ss:stack d…
1. 显示字符串
名称:show_str
功能:在指定位置,指定颜色,显示一个0结尾的字符串
参数:dh=行号,dl=列号,cl=颜色
如:在8号3列显示数据段的字符串。
assume cs:code,ds:data,ss:stack
data segmentdb 'Hello world!',0
data endsstack segmentdb 128 dup(0)
stack endscode segment
start:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axmov si,0;dh行号,dl列号,cl颜色mov dh,8mov dl,3mov cl,00010010Bcall show_strmov ax,4c00hint 21hshow_str:mov ax,0b800hmov es,ax ;数据目的地址;将此程序段中用到的寄存器都入栈保存push cxpush sipush dipush espush dx;设置行号mov al,160mul dh ;ax=160*dh行号偏移ax中(8位乘法)push ax ;ax=160*dh保存mov al,2mul dl ;ax=2*dlpop bx ;将ax=160*dh保存放入bx中add ax,bx ;ax=160*dh+2*dlmov di,ax ;di为es偏移地址mov ah,cl ;颜色存放在ah中,字符存放al中。mov cx,0change:mov al,ds:[si]mov cl,aljcxz ok ;用cx判断mov es:[di],axinc siadd di,2push cxjmp short change
ok:pop dxpop espop dipop sipop cxret
code ends
end start
解决除法溢出问题
Div指令会存在溢出的可能,100000/10 就会溢出,如何解决溢出呢?解决方法是用书中提供的公式:
名称:divdw
功能:进行不会产生溢出的除法运算。
参数:
Ax=dword型 低16位
Dx=dword型高16位
Cx=除数
返回:
Dx = 结果高16位存放,ax=结果低16位
Cx=余数
范围:被除数X:Ffffffff
除数N:ffff
商:高16H:ffff
低16位L:ffff
Init():取商,比如,init(38/10)=3;
Rem():取余数,rem(38/10)=8
公式:
X/N=init(H/N) * 65535 + [rem(H/N) * 65535 +L]/N
assume ds:data,cs:code,ss:stack
stack segmentdb 128 dup(0)
stack endsdata segmentdw 8 dup(0)
data endscode segment
start:;数据段存放商高16,低16,余数mov ax,datamov ds,ax;计算100 0000/10mov ax,4240h ;低16位Hmov dx,000fh ;高16位Lmov cx,0ah ;除数Ncall divdwmov ax,4c00hint 21h;X/N=init(H/N) * 65535 + [rem(H/N) * 65535 +L]/N
divdw: push ax;手下计算(H/N),让ax存放余数,dx存放商;这也是一个32位除法mov ax,dxmov dx,0div cx ;ax存放商(商的高16位),dx存放余数mov ds:[0],ax ;商的高16位;下一次除法,余数作为高16位,低16位还是axpop axdiv cxmov ds:[2],ax ;商的低16位mov ds:[4],dx ;dx为余数mov ax,ds:[2]mov dx,ds:[0]mov cx,ds:[4]ret
code ends
end start
3. 显示数值
该程序将data段中的字型数据,输出为十进制数据,如最下图所示。
分三步:
第一,逐个读取每个字符;
第二,对读取到的字符,除10取模,存放在string段中;
第三,输出string段中的数据。
程序如下(目前没有将每个子功能都封装为函数,这样不便于理解):
assume cs:code,ds:data,ss:stackdata segmentdw 1230,12666,1321,243,86,9888
data ends;存放dw中每个余数,从右向左存放
string segmentdb 10 dup('0'),0
string endsstack segmentdb 128 dup(0)
stack endscode segment
start:mov ax,stackmov ss,axmov sp,128call clear_screencall init_regcall show_numbermov ax,4c00hint 21h;========================================
;名称:clear_screen
;功能:清除当前显存
;参数:无
;返回:无
;应用举例:清空屏幕
;========================================
clear_screen:mov bx,0b800hmov es,bx ;显存位置mov bx,0 ;显存地址 mov dx,0700h mov cx,2000
clearScreen:mov es:[bx],dxadd bx,2loop clearScreenret ;========================================
;名称:init_reg
;功能:初始化参数,指明数据源和数据的目的地址
;参数:无
;返回:无
;应用举例:清空屏幕
;========================================
init_reg:mov bx,data ;数据源mov ds,bxmov bx,string ;目的位置:来存放余数mov es,bxret;========================================
;名称:show_number
;功能:在屏幕的中间位置显示转换后的十进制数
;参数:ds=data 数据源;es=string 数据目的
;返回:无
;应用举例:如显示‘12366’
;========================================
show_number: mov bx,0 ;bx访问data中每个地址mov si,9 ;string中最后一个字符位置mov di,160*10 + 30*2 ;显示的位置mov cx,6 ;控制循环次数,显示data中的数据。showNumber: push cxpush dspush esmov ax,ds:[bx]mov dx,0
;开对对ax中字数据做除法,然后存入到string:[si]
short_div:mov cx,10 ;被除数div cx ;ax存放商,dx为余数add dl,30h ;将余数加30H,转换为ascii码,存放如string中mov es:[si],dlmov cx,ax ;利用cx判断,ax是否为0,0则停止jcxz shortDivRet ;否则,将ax作为新除数,继续除dec simov dx,0 jmp short_divshortDivRet:pop espop dspop cx;开始输出的结果string中结果push dspush espush cxpush dipush bxmov bx,stringmov ds,bx ;ds由data,改为指向stringmov bx,0b800hmov es,bx ;es由string,改为指向显存mov cx,0
show_string:mov cl,ds:[si] ;判断待输出的字符是否为0jcxz showStirngRet ;如果非0,送至es中mov byte ptr es:[di+0],clmov byte ptr es:[di+1],00100100Badd di,2inc sijmp show_stringshowStirngRet:pop bxpop dipop cxpop espop dsadd di,160 ;显示下一行add bx,2 ;读取下一个字符loop showNumberret
;======================================= code ends
end
这个程序有点问题,明天看