hosoo 发表于 2015-1-21 16:32:54

请教关于汇编第十章实验十第三个子程序‘数值显示’的问题

本帖最后由 hosoo 于 2015-1-21 17:02 编辑

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 cl,2
               call show_str
                                 
               mov ax,4c00h
               int 21h
               
    dtoc:push cx
               push si
               push ax
               push bx
               push dx
         s:
                mov cx,10                         ;除数BX的值为10         
               call divdw                        ;执行divdw子程序
               push cx
               pop cx
               add cx,30h                         ;将余数加30H,得到十进制的ASCII码
               mov ds:,cl                     ;将DX放入数据段中
               inc si
               mov cx,ax                        ;将AX/BX的商放入CX中做JCXZ的循环条件
               jcxz ok                            ;JCXZ为0时程序跳转到标号为OK的偏移地址处                           
               jmp short s                         ;跳转到标号为S的偏移地址处
          ok:
               pop dx                              ;将DX、BX、AX、SI、CX出栈
               pop bx
               pop ax
               pop si
               pop cx
               ret
               
       divdw:push ax                ;将AX压栈
               mov ax,dx            ;将高16位放入AX中
               mov dx,0               ;DX置0,方便下面的程序
               div cx               ;H/N得到的商在AX中,余数在DX中
               mov bx,ax            ;将AX的值保存在BX中
               pop ax               ;将栈里面的AX出栈
               div cx               ;L/N得到的商在AX中,(AX)低16位,余数在DX中
               mov cx,dx            ;将DX的值放入CX中,(CX)余数
               mov dx,bx            ;将BX的值放入DX中,(DX)高16位
               ret      
               
show_str:push cx
               push si
               push ax
               push bx
               push dx
               mov ax,0b800h                     
               mov es,ax                           ;把AX的值转给ES段
               mov ax,0a0h                         ;0A0H为每一行的值
               mov dx,6                           ;字符串显示在DX第6行
               mul dx                              ;将6乘以0A0h,AX得到第6行的偏移地址
               add ax,16
               mov di,ax                           ;将第八行的偏移地址放入DI中
               mov bp,0                            ;赋予ES的偏移地址BP为0
               jmp short show_ste                  ;跳转到SHOW_STR
show_ste:mov cl,ds:                      ;将偏移地址为ES:SI的值放入CL中,并使CH为0,让JCXZ来判断es:中的值是否为0,为0则跳转到标号为OK的偏移地址处
               mov ch,0                           
               jcxz okk                                             ;不为0则向下执行
               mov es:,cl                           ;将(CL)的字符串放入es:中
               mov bl,02h                                       ;BL为绿色字体
               mov es:,bl               
               inc si
               add bp,2
               jmp short show_ste                        ;跳转到SHOW_STE偏移地址处
      okk:pop dx                                             ;将DX、BX、AX、SI、CX出栈
            pop bx
            pop ax
            pop si
            pop cx
            ret                                                       ;从栈中取出IP的值后跳转到CS:IP处

code ends
end start


当程序执行完标号:Dtoc时数据段里面的值为:


当程序执行到标号show_str中这里的时候


CL在debug时是36H,但是在CL放入es:中的时候,CL和BL的值怎么发生改变了,这是什么原因导致的,论坛里的大侠请指点一下,谢谢




635178917 发表于 2015-2-5 14:52:21

对啊,看帖回帖,不知不觉就升级了

睿小子 发表于 2015-2-5 22:35:00

对啊,看帖回帖,不知不觉就升级了

d5zhao 发表于 2015-4-17 02:07:39

顶一下

zd0307 发表于 2015-4-18 09:42:18

支持lz

zd0307 发表于 2015-4-18 09:48:32

支持lz

Ryans 发表于 2015-5-2 16:13:20

这个好、!!额额,支持楼主

citian3094 发表于 2015-5-3 21:40:58

加油~~

StartUp 发表于 2015-5-17 22:38:41

ThanksForYOuYUB

零度非安全 发表于 2015-5-17 23:07:57

我还没有看到这里来
{:9_239:}

0洛枫0 发表于 2016-12-2 08:46:33

学习

zealstar 发表于 2016-12-5 02:51:38

本帖最后由 zealstar 于 2016-12-5 02:54 编辑

我去,这2015年的问题居然还没人回答……另外,我同样做了实验10.3,感觉楼主的思路和我差不多,但是细节上的问题很多。

看得下去我就逐一解释吧,希望楼主把问题能最终设置为“已解决”

1、为何执行完第一段call dtoc之后,es内的数值会是66621?
解释:因为每次除法之后是取余数,那么先取到的是个位余数6,然后是十位余数6,以此类推。
比如:12345/10取余数,第一次取到5,那么5就会被放在es:0,然后第二次除取到4,那么4被放到了ds:1;这样解释应该比较清楚了吧。

2、关于bl,cl值为何改变?
看楼主的截图来看,是在debug中,cl,bl值于我看来没有改变,而是楼主看错了debug右下角的信息的意思。 所谓当执行到指令 mov es:,cl这样的指令时,debug会显示“目标地址”的地址和操作前地址对应的数值。所以,右下角的es:03d0=39,表示的是目前这个地址中已存在的数据。

L丶 发表于 2016-12-5 14:44:12

学习学习{:10_254:}

猫三壮 发表于 2018-8-7 09:33:55

支持

CCCFC 发表于 2018-8-9 14:54:02

路过学习{:10_266:}

常德水鱼村 发表于 2018-9-14 10:32:31

支持楼主!热爱鱼c

whdd 发表于 2018-9-16 12:05:01

zhic 支持

whdd 发表于 2018-9-30 13:37:51

{:9_227:}

学学看看 发表于 2018-11-30 14:11:03

X用户 发表于 2018-12-22 15:49:42

来参考答案
页: [1] 2
查看完整版本: 请教关于汇编第十章实验十第三个子程序‘数值显示’的问题