|
主题 : : 实验10_3DW,求找茬 [待解决] |
回复[ 1次 ]
点击[ 358次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2013-05-23 13:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29 |
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,12666
mov dx,0
mov bx,data
mov ds,bx
mov si,0
call dtocdw ;调用双字数据转换字符串
mov dh,8
mov dl,3
mov cl,2 ;设置输出格式
call show_str ;调用字符输出
mov ax,4c00h
int 21h
;=========================================双字数据转换字符串
dtocdw: push ax
push cx
push dx
push di
push si ;保护现场
mov di,0 ;字符串长度计数器
chance: ;转换
mov cx,0ah ;设置为以十进制转换
call divdw ;调用双字除法
add cx,30h ;转换为字符
push cx ;保存字符
inc di ;计数器加一
mov cx,ax
add cx,dx
jcxz dtocdw_ok ;判断完成
jmp chance
dtocdw_ok: mov cx,di ;设置计数器
writ: ;写入指定位置并整理格式
pop [si]
inc si
loop writ
pop si
pop di
pop dx
pop cx
pop ax ;恢复现场
ret ;返回
;==============================================双字除法
divdw: push bx ;保护现场
mov bx,ax
mov ax,dx
mov dx,0h
div cx ;被除数高位除法
push ax ;保存高位除法商
mov ax,bx ;恢复被除数低位,高位为高位除法余数
div cx ;被除数低位除法
mov cx,dx ;以CX保存余数
pop dx ;恢复商的高位
pop bx ;恢复现场
ret ;返回
;==============================================字符输出
show_str: push ax
push bx
push cx
push si
push es ;保护现场
mov ax,0b800h
mov es,ax ;定位显存
mov al,0a0h
mul dh
mov bx,ax ;设置行号
mov al,2h
mul dl ;设置列号
add bx,ax ;设置显示位置基址
mov al,cl ;设置字体属性
show: ;输出字符
mov cl,[si]
mov ch,0h
jcxz show_str_ok ;判定字符串结尾
mov es:[bx],cl
inc bx ;显示字符
inc si ;指向下一字符
mov es:[bx],al
inc bx ;设置字体属性
jmp show
show_str_ok:
pop es
pop si
pop cx
pop bx
pop ax ;恢复现场
ret ;返回
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2013-05-24 10:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06 |
自己看吧, 你那个好像很长
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,12666
mov dx,123 ;方便以后显示大于65525的数据,做16位除法运算,di为被除数高16位
mov bx,data
mov ds,bx
sub si,si
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
;输出指定字符与颜色到指定位置
show_str:
push cx
push dx
add dh,3
mov al,0AH
mul dh
mov ah,0b8H
mov es,ax
mov al,2
mul dl
mov si,ax
sub bx,bx
show:
push cx
mov al,[bx]
sub ch,ch
mov cl,al
jcxz ok
pop cx
mov es:[si],al
mov es:[si].1,cl;00000010b绿色
inc si
inc si
inc bx
jmp short show
ok:
pop dx
pop cx
ret
;防止除法溢出,并保护子程序中将用到的寄存器
dtoc:
push ax
push dx
push si
push ax
push bx
push bp
s:
push ax
mov bx,10 ;转化十进制,被除数-除数=余为要显示的字符串
mov ax,dx ;要计算被除数高16位
sub dx,dx
div bx ;高16位结果的余数
mov bp,ax ;暂存高16位的商
pop ax ;还原被除数低16位
div bx ;(高16位余数+低16位原被除数)/n 得出商
add dx,30H ;ascii码
;判断跳转
mov [si],dl ;改变原字符串的字符,转化为要显示的十进制字符
push dx
mov dx,bp ;还原高16位的商
mov cx,ax
jcxz o
inc si
jmp short s ;循环至jcxz o指令跳转
;进行数值倒序,还原子程序中用到的寄存器,子程序运行结束
o:
inc si
mov cx,si
sub si,si ;归0
x:
pop [si]
inc si
loop x
pop bp
pop bx
pop ax
pop si
pop dx
pop ax
ret
code ends
end start
;debug调试时候如果要执行g命令请g 到第一个ret的位置(就是跳转到mov ax,4c00h指令的那一个ret) | | |
|