关于那个400多行的俄罗斯方块
dwing吧
全部回复
仅看楼主
level 1
xjx8599 楼主
@nextb: db 2eh
lodsb
我查资料说是lodsb把si指向的数据当做源操作数,si指向的不应该是ds:si么,但程序实现的是cs:si 请问这是怎么回事?那个db 2eh有什么用?
2012年05月31日 01点05分 1
level 13
cs:si是可以的, 只要加上2e前缀, 只是很少有这么用的, 一些编译器不支持, 所以用db方法写了
2012年05月31日 02点05分 2
level 1
xjx8599 楼主
恩 谢谢O(∩_∩)O~
2012年05月31日 02点05分 3
level 1
xjx8599 楼主
@dwing
我又来提问了。。。
mov cl,11 ;判断10次(10+1)
repnz scasw ;扫描一行
为什么cx要多1?
mov si,di
sub si,2*40 ;si=上一行屏幕偏移位置
mov cx,si ;cx=移动字符个数
std
rep movsb ;移下一行
cld
判断完之后di应该指向的是要消除行的下一个位置吧?movsb时不用先dec di两次么?
mov cx,si是不是游戏区域外面那些也进行了下移操作 只不过没变化而已?
2012年06月02日 06点06分 4
level 1
xjx8599 楼主
没召唤成功 再召唤一次
@dwing
2012年06月02日 06点06分 5
level 13
为什么要11次, 建议你好好理解repnz scasw的作用
下移一行其实就是把上面所有的屏幕字符(包括外框)都movsb下来
2012年06月02日 12点06分 6
level 1
xjx8599 楼主

repnz scasw
一行十个字符,如果cx是10的话,判断完第九个之后cx=1(判断一次减1),
接下来的操作应该是判断cx不为0 cx减1 判断第十个字符 di加2
这样正好是判断10个字符啊。
另外有个新问题,延时部分我用cx循环进行,但是在xp虚拟机下还是运行不正常,循环次数少会瞬间下落没有中间过程,循环次数多的话会一直闪烁,有什么办法能在xp下正常运行么?
2012年06月02日 15点06分 7
level 13
大概当时是认为CX会影响ZF标志, 看起来都可以
延时使用的是int 15h(ch=86h), 这个延时比较精确, 但有的虚拟DOS系统支持度不好, 所以还是建议在DOSBox下运行
2012年06月03日 00点06分 8
level 5
插一下,找到一个DOS下很短的hello程序,可执行文件只有27字节。
org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'

mov ah,4Ch
int 21h
可以直接以 int 20h代替。节省两个字节。这样改有什么隐患?
PS:这是最短的hello程序么?

2012年06月05日 03点06分 9
level 4
我不愿意来这个吧的原因就是总是忍不住会跪下。。。
2012年06月05日 04点06分 10
level 1
没事
我们 进来之后膝盖就没了
2012年06月05日 04点06分 11
level 13
int 21退出是最安全的, int 20一般也可以退出, 不过时间太久我也记不清有什么区别了
2012年06月05日 05点06分 12
level 1
没想到现在还有人在开发DOS汇编程序.
int 20h要程序员保证CS指向PSP,int 21h不用;
另外int21h可以设置退出码,方便编写批处理
2012年07月01日 01点07分 13
@paadssbb 我只是为了完成汇编课程的项目而已。。。
2012年07月01日 11点07分
1