将一个word型数据转换成十进制形式的字符串并显示出来,报错:error A2019: Wrong type of register

「已注销」 2018-08-02 10:53:03
报错:
exp103.ASM(25): error A2019: Wrong type of register

50088 + 450328 Bytes symbol space free

0 Warning Errors
1 Severe Errors



;将数据12666以十进制的形式在屏幕的8行列,用绿色显示出来。显示时调用子程序show_str。
;转换方法:用12666除以10,循环5次,记下每次的余数,即12666每一位的值;将每次的余数分别加30H,就得到了表示十进制数的ASCII字符串。
;dtoc功能:将word型数据转变为表示十进制数的字符串,字符串以0为结束符。参数:(ax)=word型数据 ds:si指向字符串的首地址 返回:无
assume cs:code,ds:data
data segment
dw 6 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:
mov bx,10
mov ss,ds
mov sp,0BH
s1: div bx
mov cx,ax
add dx,30H
push dx
jcxz done
loop s1
done:
ret

show_str: ;显示字符串的子程序定义开始
;子程序的功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。参数:(dh)=行号(取值范围0-24)
;(dl)=列号(取值范围0-79),(cl)=颜色,ds:si指向字符串的首地址,返回:无
push cx
push si
mov al,0A0h ;先计算行地址,一行占160字节(80*2)
dec dh ;行号在显存中下标从0开始,所以减1
mul dh ;ax=460h
mov bx,ax ;行地址存在bx中
mov al,2 ;后计算列地址,字符和颜色共两个字节
mul dl ;ax=6,计算列地址
sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2,列地址已计算好
add bx,ax ;此时bx中存放的是行与列号的偏移地址
mov ax,0b800h
mov es,ax ;es中存放的是显存的第0页(共0--7页)的起始的段地址
mov di,0 ;di是一行中的列(字符)的偏移
mov al,cl ;al暂存颜色
mov ch,0
s: mov cl,ds:[si] ;cl暂时存放字符
jcxz ok
mov es:[bx+di],cl ;偶地址存放字符
mov es:[bx+di+1],al ;奇地址存放字符的颜色属性
inc si
add di,2 ;字符和颜色共两个字节
jmp short s
ok: pop si ;输出字符串完成,出栈并返回
pop cx
ret ;显示字符串的子程序定义结束
code ends
end start



...全文
503 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-08-04
  • 打赏
  • 举报
回复
我估计mov sp,0200h是为了避免无意间把不该覆盖的地方覆盖了,以免程序自动退出。
「已注销」 2018-08-04
  • 打赏
  • 举报
回复
谢谢!又学了一些技巧,原来不用栈也可以正向输出字符串。
「已注销」 2018-08-03
  • 打赏
  • 举报
回复
我按照楼上的试了以后能编译通过了,但是debug单步运行到push dx就自动退出debug了,退到cmd里了。
  • 打赏
  • 举报
回复
稍加修改:
assume cs:code,ds:data
data segment
dw 6 dup (0)
data ends

code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov ss,bx
mov sp,0200h
mov si,4
call dtoc

mov dx,0803h
mov cx,5
mov si,0
call show_str

mov ax,4c00h
int 21h

dtoc:
mov bx,10
s1:
xor dx,dx
div bx
mov cx,ax
add dl,30H
mov [si],dl
dec si
jcxz done
jmp s1
done:
ret

; 其余部分没有改动
  • 打赏
  • 举报
回复
mov ss,ds不行,删掉这行
在开始部分
start: mov ax,12666
mov bx,data
mov ds,bx
mov ss,bx ; 加上这行

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧