远山 发表于 2016-4-28 19:17:35

实验10.3 有个问题呢

本帖最后由 远山 于 2016-4-28 19:36 编辑

assume cs:code,ds:data,ss:stack

data segment
db 10 dup (0)
data ends

stack segment
db 16 dup (0)
stack 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 ax
      push cx
      push dx
      push si    ;用入栈指令来保存子程序中所用到的寄存器的内容。
      mov si,4;因为12666连续除以10所取得余数的顺序依次为66621,与我们所需要的相反,故si赋值为4,然后再减1定位到前一位,以此类推。

s:mov dx,0       ;初始化dx(我在想不初始化可不可以,一会试试)
mov cx,10      
div cx             ;ax/cx,商放在ax中,余数放在dx中。
add dl,30h   ;将余数6与30h相加得到6对应的ASCII码。
mov ds:,dl ;将ASCII码放入数据段的内存字节中。
sub si,1         ;si-1,定位到前一字节。
mov cx,ax       ;将商转存到cx中,用于jccxz指令判断商是否为零。
jcxz s0            ;若cx=0,即商为零,则跳转,反之,继续执行。
jmp short s    ;无条件跳转。

s0:pop si
   pop dx
   pop cx
   pop ax
   ret                ;取出寄存器值,返回主程序。

show_str:push ax
         push bx
         push cx
         push dx
         push si
         push di

         mov al,160
         mul dh
         mov bx,ax
         mov al,2
         mul dl   
         add bX,ax
         mov ax,0b800h
         mov es,ax
         mov di,0
         mov ah,cl

t:mov ch,0
mov cl,ds:
jcxz t0
mov es:,cl
mov es:,ah
inc si
add di,2
jmp short t

t0:pop di
   pop si
   pop dx
   pop cx
   pop bx
   pop ax
   ret

code ends
end start

第二个子程序有问题,本来应该在第八行显示,结果在第四行显示了,至于问题在哪我还没有找出来,路过的朋友有时间帮着看一下{:10_277:}

兰陵月 发表于 2016-5-5 09:35:54

本帖最后由 兰陵月 于 2016-5-5 09:51 编辑

我原样拷贝你的程序~编译后运行~

没~~~有~~~错~~~啊~~~啊~~~啊~~啊~

运行结果


看来是你编译器的问题~~

远山 发表于 2016-5-5 15:05:31

兰陵月 发表于 2016-5-5 09:35
我原样拷贝你的程序~编译后运行~

没~~~有~~~错~~~啊~~~啊~~~啊~~啊~


十分感谢!我想了好久都觉得程序是对的,果然没有错{:10_256:}

zzzz76 发表于 2016-5-11 11:15:49

显示的字符被后来显示的内容挤上去了{:5_97:}

zhouxcpython 发表于 2016-6-1 07:31:27

感谢分享

xhbsingle 发表于 2016-6-1 21:05:03

学习
页: [1]
查看完整版本: 实验10.3 有个问题呢