chunhuaqiuyue 发表于 2021-12-26 21:37:31

汇编语言实验10第三题,代码问题.求大神指导!!!

本帖最后由 chunhuaqiuyue 于 2021-12-26 22:33 编辑

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 dtoc

        mov dh,8
        mov dl,3
        mov ch,2
        call show_str

        mov ax,4c00h
        int 21h

dtoc:
        mov di,10
s0:
        mov dx,0
        div di    ;商存放在ax中,余数存放在dx中
        mov cx,ax      ;商存放在cx中,用来判断除法结束
        add dx,30h
        mov ,dl ;将ASCII码保存,注意与数据对应位置是逆序排放
        inc si
        jcxz ok
        jmp short s0

show_str:
        mov ax,0b800h ; set to screen start position
        mov es,ax

        mov bl,dl; 解决 后面 30行 mul 后 ,bx会因为保存乘法高位而被置0的问题; 所以先把值存入bl
        mov bh,0
        mov dl,0
        mov dl,dh
        mov dh,0
        mov ax,160 ; 160 bytes per row; 因为一行80个列,每一列 是 16位组成,低8位代表字符 高8位代表颜色属性
        mul dx

        add bx,bx ; mul 2 ; 原因和29行一样

        add ax,bx
        mov bx,ax
        mov ax,cx
        mov cx,0

show_str_s:
        mov al,ds:
        mov cx,si
        mov es:,ax
        jcxz ok
        sub si,1
        add bx,2
        jmp short show_str_s

ok:        ret

code ends
end start

jackz007 发表于 2021-12-26 22:00:01

本帖最后由 jackz007 于 2021-12-26 22:02 编辑

      那还用说,一定是溢出了,就是说商的数值太大,以至于 ax 寄存器无法进行保存。
      十六位的除法是一定会用到 dx 寄存器的,如果你没有用到,在做除法运算前,必须专门将 dx 寄存器的值清零。
dtoc_s1:
      push cx
      mov cx,10
      xor dx,dx      ; 添加此指令
      div cx
      add dl,30h
      mov ds:,dl
      sub bx,1
      pop cx
      loop dtoc_s1

chunhuaqiuyue 发表于 2021-12-26 22:16:59

jackz007 发表于 2021-12-26 22:00
那还用说,一定是溢出了,就是说商的数值太大,以至于 ax 寄存器无法进行保存。
      十六位的 ...

感谢!!
发现了

chunhuaqiuyue 发表于 2021-12-26 22:17:38

jackz007 发表于 2021-12-26 22:00
那还用说,一定是溢出了,就是说商的数值太大,以至于 ax 寄存器无法进行保存。
      十六位的 ...

ok,学到了.感谢
页: [1]
查看完整版本: 汇编语言实验10第三题,代码问题.求大神指导!!!