枫叶情 发表于 2014-7-15 01:44:22

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

本帖最后由 枫叶情 于 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, ;将源地址中的ascii码给到显存的偏移地址
   jcxz return
   mov es:, ch
   mov es:, 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:, al ;将低位给目标位置
   inc si    ;目标偏移地址加1
   loop d3
   
ok: pop di
   pop si
   pop dx
   pop cx
   pop bx
   pop ax
   ret
code ends
end start   

vkevke_3437 发表于 2014-7-15 01:44:23

把show子程序中的 loop s1 改为jmp s1就行了

Angel丶L 发表于 2014-7-15 07:29:01

支持一个。。。
页: [1]
查看完整版本: 汇编实验10(3)没用正常结束