| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 802 人关注过本帖
标题:一个很奇怪的问题。
取消只看楼主 加入收藏
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:7 
一个很奇怪的问题。
;功能 显示用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
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
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 2楼 zaixuexi
刚用反汇编打开EXE看了一下,里面没问题,但运行载入内存的时候的确变成了add di,-34
运行图
图片附件: 游客没有浏览图片的权限,请 登录注册


左边是反汇编工具里面显示的,右边是进入内存之后的显示
图片附件: 游客没有浏览图片的权限,请 登录注册
2012-01-16 14:09
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
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
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 11楼 zaixuexi
-30h?
应该是
1011 0000B这样吧? (算错)
如果是一个字节存储的话,

刚看汇编一星期,其他书还没看,就看了王爽的书,和2进制16进制的加减,互转什么的,这还需要看什么?。-30h?
应该是
1011 0000B这样吧? (算错)
如果是一个字节存储的话,

刚看汇编一星期,其他书还没看,就看了王爽的书,和2进制16进制的加减,互转什么的,这还需要看什么?。

[ 本帖最后由 lin_zhong 于 2012-1-16 15:53 编辑 ]
2012-01-16 15:49
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 11楼 zaixuexi
哦,搞错了,-30H不是1011 0000
我忘记了补码
应该是 原码取反+1=补码。
 1110 0000B 这样对吧?。
2012-01-16 15:51
lin_zhong
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-1-13
收藏
得分:0 
回复 14楼 zaixuexi
这个我看了,刚才是一时忘记了,
第二次又算错了。
我记成了,原码+符号位就变成负数。

-30H 应该是 :

30h=0011 0000b
取反1100 1111b
+1 1101 0000b

这样没错吧。
2012-01-16 15:58
快速回复:一个很奇怪的问题。
数据加载中...
 
   



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

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