鱼C论坛

 找回密码
 立即注册
查看: 5795|回复: 21

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

[复制链接]
发表于 2015-1-21 16:32:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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:[si],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:[si]                      ;将偏移地址为ES:SI的值放入CL中,并使CH为0,让JCXZ来判断es:[si]中的值是否为0,为0则跳转到标号为OK的偏移地址处
               mov ch,0                           
               jcxz okk                                             ;不为0则向下执行
               mov es:[bp+di],cl                             ;将(CL)的字符串放入es:[BP+DI]中
               mov bl,02h                                       ;BL为绿色字体  
               mov es:[bp+di+1],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时数据段里面的值为:
1.jpg

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

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

4.jpg


2.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-5 14:52:21 | 显示全部楼层
对啊,看帖回帖,不知不觉就升级了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-5 22:35:00 | 显示全部楼层
对啊,看帖回帖,不知不觉就升级了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-17 02:07:39 | 显示全部楼层

回帖奖励 +1 鱼币

顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-18 09:42:18 | 显示全部楼层

回帖奖励 +1 鱼币

支持lz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-18 09:48:32 | 显示全部楼层
支持lz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-2 16:13:20 | 显示全部楼层
这个好、!!额额,支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-3 21:40:58 | 显示全部楼层
加油~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-17 22:38:41 | 显示全部楼层

回帖奖励 +1 鱼币

ThanksForYOuYUB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-17 23:07:57 | 显示全部楼层
我还没有看到这里来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-2 08:46:33 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-5 02:51:38 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 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:[bp+si],cl这样的指令时,debug会显示“目标地址”的地址和操作前地址对应的数值。所以,右下角的es:03d0=39,表示的是目前这个地址中已存在的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 14:44:12 | 显示全部楼层

回帖奖励 +1 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-7 09:33:55 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-9 14:54:02 | 显示全部楼层

回帖奖励 +1 鱼币

路过学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-14 10:32:31 | 显示全部楼层
支持楼主!热爱鱼c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-16 12:05:01 | 显示全部楼层

回帖奖励 +1 鱼币

zhic 支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-30 13:37:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2018-11-30 14:11:03 | 显示全部楼层

回帖奖励 +1 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-22 15:49:42 | 显示全部楼层

回帖奖励 +1 鱼币

来参考答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 14:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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