鱼C论坛

 找回密码
 立即注册
查看: 1777|回复: 2

汇编实验10(3)没用正常结束

[复制链接]
发表于 2014-7-15 01:44:22 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 枫叶情 于 2014-7-15 02:49 编辑

汇编实验10(3)没用正常结束,求大神帮忙解决。谢谢!
代码:
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 dtocl
   mov dh, 8 ;设置显示的行
   mov dl, 3  ;设置显示的列
   mov cl, 4  ;设置颜色为红色
   mov di, 0  ;将目标偏移地址置0
   call show
   
   mov ax, 4c00h
   int 21h
  
show:
   mov ax, 0b800h ;设置显存地址
   mov es, ax  ;将显存的地址给es
   mov ax, 160 ;每行的有160字节
   mul dh   ;乘以dh得到行
   mov bx, ax  ;将行给目标偏移地址
   mov ax, 2  ;两个字节为一列
   mul dl   ;乘以dl得到列
   add bx, ax  ;将列加入到目标偏移地址锁定行跟列的偏移地址
   mov al, cl
   mov cl, 0
   
  s1: mov ch, [si] ;将源地址中的ascii码给到显存的偏移地址
   jcxz return
   mov es:[bx], ch
   mov es:[bx+1], al   ;设置显示的属性
   inc si
   add bx, 2
   loop s1
   
return:   ret
     
dtocl: push ax
   push bx
   push cx
   push dx
   push si
   push di  ;将寄存器的值保存避免子程序影响主程序
   
   mov bx, 0  ;用作记位数
  d1: mov cx, 0ah
   mov dx, 0  ;高位置0
   div cx   ;除以10
   mov cx, ax ;判断商是否为0
   jcxz d2  ;如果为0则跳转到d2
   add dx, 30h ;将余数加上30变为ascii码
   push dx
   inc bx   ;bx递增1 用作计数
   jmp short d1
   
  d2: add dx, 30h ;将商为0的余数变为ascii码
   push dx
   inc bx
   mov cx, bx  ;将位数给cx用作循环次数
   mov si, 0
   
  d3: pop ax   ;取出栈中的数据
   mov ds:[si], al ;将低位给目标位置
   inc si    ;目标偏移地址加1
   loop d3
   
  ok: pop di
   pop si
   pop dx
   pop cx
   pop bx
   pop ax
   ret
code ends
end start   

cl的值在跳转后改变

cl的值在跳转后改变

结果

结果

最佳答案

查看完整内容

把show子程序中的 loop s1 改为jmp s1就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-15 01:44:23 | 显示全部楼层
把show子程序中的 loop s1 改为jmp s1就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-15 07:29:01 | 显示全部楼层
支持一个。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表