| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 802 人关注过本帖
标题:一个很奇怪的问题。
只看楼主 加入收藏
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:15 
一个很奇怪的问题。
;功能 显示用0结束的字符串 子程序名字. show_str
;参数 (dh)=行号(0-24) (dl)=列号 (0-79)(cl)=颜色,ds:si指向字符串首地址
;返回 无
;b8000 bffff
;b800:0-b800:9f
;b800:a0-b800:13f
;行号:bx=dh*0a0h 显示位置:bx+dl | es:[bx][di]
assume cs:code ss:stack
stack segment
dw 128 dup(0)
stack ends
date segment
db'Welcom to masm!',0
date ends
code segment
start:mov dh,8
mov dl,3
mov cl,2
mov ax,date
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,128
call show_str

mov ax,4c00h
int 21h

show_str:  ;子程序开始
push ax
push di
push es
push bx
push cx
push si
push dx

;设置dh在B800里面的对应行
mov al,0a0h
mul dh
mov bx,ax
mov ax,0b800h
mov es,ax

;设置对应列
mov ah,0
mov dh,0
mov al,2
mul dl
;sub ax,2   ;这先看这一句,如果不使用这一句,程序正常。如果使用了这一句 下面的add dx,2 在DEBUG里面就变成了add dx,-32
mov di,ax

;设置颜色
mov ah,cl

;把字符移动显存里面
s:
mov cl,ds:[si]
mov ch,0

;遇到0就结束
jcxz ok

mov al,ds:[si]
mov es:[bx][di],ax ;把数据移入B800:x
inc si
add di,2  ;如果使用了sub ax,2 那么这句在内存里面就变成了 add di,-32
loop s

ok:
pop dx
pop si
pop cx
pop bx
pop es
pop di
pop ax
ret
code ends
end start
搜索更多相关主题的帖子: 子程序 字符串 
2012-01-16 02:02
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:10 
程序代码:
F:\>debug cc.exe
-g

Program terminated normally
-u 17c1:0038 0043
17C1:0038 2D0200        SUB     AX,0002
17C1:003B 8BF8          MOV     DI,AX
17C1:003D 8AE1          MOV     AH,CL
17C1:003F 8A0C          MOV     CL,[SI]
17C1:0041 B500          MOV     CH,00
17C1:0043 E30B          JCXZ    0050
-u 17c1:004b 0057
17C1:004B 83C702        ADD     DI,+02
17C1:004E E2EF          LOOP    003F
17C1:0050 5A            POP     DX
17C1:0051 5E            POP     SI
17C1:0052 59            POP     CX
17C1:0053 5B            POP     BX
17C1:0054 07            POP     ES
17C1:0055 5F            POP     DI
17C1:0056 58            POP     AX
17C1:0057 C3            RET
没出现你说的问题

技术问题,请不要以短消息方式提问
2012-01-16 09:44
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 2楼 zaixuexi
难道是机器的问题,在我这机器的确是这样

我是win7系统,masm编译的,版本好像是5.1吧。

后来我又更改了一下
不用 sub ax,2
而是用sub di,2
结果下面的  add di,2 也一样会变成 add di,-32


你在你的机器试试 g 4D(跳到4D) 看看字符是否按照设置的行列位置显示出来。谢谢。

因为我这里由于 add di,2变成了add di,-32 所以显示都乱套。
2012-01-16 13:58
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
程序代码:
F:\>debug cc.exe
-g 4d

AX=0221  BX=0500  CX=0000  DX=0003  SP=0070  BP=0000  SI=000F  DI=0024
DS=17C0  ES=B800  SS=17B0  CS=17C1  IP=004D   NV UP EI PL NZ NA PE NC
17C1:004D 5A            POP     DX
-q
   Welcom to masm!
F:\>

技术问题,请不要以短消息方式提问
2012-01-16 14:05
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 2楼 zaixuexi
刚用反汇编打开EXE看了一下,里面没问题,但运行载入内存的时候的确变成了add di,-34
运行图
图片附件: 游客没有浏览图片的权限,请 登录注册


左边是反汇编工具里面显示的,右边是进入内存之后的显示
图片附件: 游客没有浏览图片的权限,请 登录注册
2012-01-16 14:09
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
你看看是debug一加载是这个情况,还是指令跑到哪句后修改了这条代码,如果是前者,masm5.1的问题,或者你加句.8086试下

技术问题,请不要以短消息方式提问
2012-01-16 14:14
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
我用的masm5.0,表短消息我

技术问题,请不要以短消息方式提问
2012-01-16 14:19
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 6楼 zaixuexi
按道理来说。
正确的机器码 83c702 载入 x:4b-4d里面。 4D里面装的应该是02的
但真正加入内存之后 机器码却变成了83c7cc  4D里面装的是CC。那这个CC是怎么来的。我计算了一下:
2 的8位2进制是 0000 0010  34 的是 0010 0010  -34 是 1010 0010
34和2 的2进制很相似。
2012-01-16 14:42
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
你这算什么计算,先去看手册
一会32,一会34,你蛮会搞的

技术问题,请不要以短消息方式提问
2012-01-16 14:52
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 9楼 zaixuexi
是-34,之前打错了。
应该是这样
在第一次执行 add di,02 0000 0010 之前(理想情况)
di里面的值是 4 即是 0000 0100

之后执行了 add di,-34 1 010 0010 (实际情况)

到了这里,既然内存里面坚决是-34 那就 加上-34吧。
照理说 4+ -34 应该是-30 但是执行之后ID就变成了FFD0

图片附件: 游客没有浏览图片的权限,请 登录注册



我这样分析可不是为了装逼啊,完全是一个讨论的心态。
2012-01-16 15:13
快速回复:一个很奇怪的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023074 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved