|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 hosoo 于 2015-1-21 17:02 编辑
assume cs:code,ds:data
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 cx
push si
push ax
push bx
push dx
s:
mov cx,10 ;除数BX的值为10
call divdw ;执行divdw子程序
push cx
pop cx
add cx,30h ;将余数加30H,得到十进制的ASCII码
mov ds:[si],cl ;将DX放入数据段中
inc si
mov cx,ax ;将AX/BX的商放入CX中做JCXZ的循环条件
jcxz ok ;JCXZ为0时程序跳转到标号为OK的偏移地址处
jmp short s ;跳转到标号为S的偏移地址处
ok:
pop dx ;将DX、BX、AX、SI、CX出栈
pop bx
pop ax
pop si
pop cx
ret
divdw:push ax ;将AX压栈
mov ax,dx ;将高16位放入AX中
mov dx,0 ;DX置0,方便下面的程序
div cx ;H/N得到的商在AX中,余数在DX中
mov bx,ax ;将AX的值保存在BX中
pop ax ;将栈里面的AX出栈
div cx ;L/N得到的商在AX中,(AX)低16位,余数在DX中
mov cx,dx ;将DX的值放入CX中,(CX)余数
mov dx,bx ;将BX的值放入DX中,(DX)高16位
ret
show_str:push cx
push si
push ax
push bx
push dx
mov ax,0b800h
mov es,ax ;把AX的值转给ES段
mov ax,0a0h ;0A0H为每一行的值
mov dx,6 ;字符串显示在DX第6行
mul dx ;将6乘以0A0h,AX得到第6行的偏移地址
add ax,16
mov di,ax ;将第八行的偏移地址放入DI中
mov bp,0 ;赋予ES的偏移地址BP为0
jmp short show_ste ;跳转到SHOW_STR
show_ste:mov cl,ds:[si] ;将偏移地址为ES:SI的值放入CL中,并使CH为0,让JCXZ来判断es:[si]中的值是否为0,为0则跳转到标号为OK的偏移地址处
mov ch,0
jcxz okk ;不为0则向下执行
mov es:[bp+di],cl ;将(CL)的字符串放入es:[BP+DI]中
mov bl,02h ;BL为绿色字体
mov es:[bp+di+1],bl
inc si
add bp,2
jmp short show_ste ;跳转到SHOW_STE偏移地址处
okk:pop dx ;将DX、BX、AX、SI、CX出栈
pop bx
pop ax
pop si
pop cx
ret ;从栈中取出IP的值后跳转到CS:IP处
code ends
end start
当程序执行完标号:Dtoc时数据段里面的值为:
当程序执行到标号show_str中这里的时候
CL在debug时是36H,但是在CL放入es:[bp+di]中的时候,CL和BL的值怎么发生改变了,这是什么原因导致的,论坛里的大侠请指点一下,谢谢
|
-
|