. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->更灵活的定位内存地址的方法
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第七章问题7.9另一种解法  [待解决] 回复[ 4次 ]   点击[ 578次 ]  
regex
[帖 主]   [ 发表时间:2010-01-13 01:20 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
在第七章里最后一个问题, 书里的思路是先定位行后定位列的完成4X4的两层循环。 我的这个方法是采用【逐列】的算法。即,先用si定位列, 用bx来定位行(思路跟书里基本一致),但是内外循环是相反的, 即, 书里bx作为外层循环的计数, 而我这里用si作为大循环的计数。 呵呵,我不善于言语, 还是上代码吧:

--------------------------------------------------------------------------------

root@yeah /cygdrive/d/asm
$ cat 79a.asm
assume  cs:codesg,ds:datasg,ss:stacksg

datasg  segment
        db      '1. display      '
        db      '2. brows        '
        db      '3. replace      '
        db      '4. modify       '
datasg  ends

stacksg segment
        dw      0,0,0,0,0,0,0,0
stacksg ends

codesg  segment

start:  mov ax,datasg
        mov ds,ax

        mov si,3          ;初始化列, 从第三列开始逐列循环
        mov cx,4          :需要变化的是4个字符

s:      push cx           ;保存外层循环计数器
        mov cx,4          ;内层循环计数开始

        mov bx,0          ;从第一行开始, 地址为ds:bx
s0:     mov al,[bx+si]    ;开始与运算
        and al,11011111b  ;
        mov [bx+si],al    ;
        add bx,10h        ;由于逐列处理, bx的值需加10h
        loop s0           ;当cx不为零继续循环,否则, 进入下一步。

        pop cx            ;恢复cx的值
        inc si            ;下一列
        loop s            ;同s0

        mov ah,4ch
        int 21h

codesg  ends
end     start

root@yeah /cygdrive/d/asm
$
--------------------------------------------------------------------------
实验结果略。
简单的说, 书里的思路是先行后列, 我的思路是先列后行, 算个对自己的一个练习吧。 
有不对的地方, 还希望大家指正。
(另, 对栈段的空间是不是有些大了点呢, 这程序没用几个字节呀)
versaariel
[第1楼]   [ 回复时间:2010-01-13 09:08 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
1.蛮好的,换一种方向考虑,但是可能从逻辑上有点奇怪,其实也不奇怪,也是一段连续的空间,所以交换一下没问题
2.对于栈的大小,你可以按照你所认为的大小进行修改,并在DEBUG下调试,如果有问题,可以先放着,继续往后看,会有新发现
regex
[第2楼]   [ 回复时间:2010-01-13 10:52 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
嗯, 是呀, 现在的水平对栈的理解是非常肤浅。 就知道开大点好。 呵呵~~
okenny
[第3楼]   [ 回复时间:2010-04-08 15:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
看完LZ的代码后,我有个问题,你所用到的栈段应该不是你自己所设置的段空间吧,stacksg段你有用上吗? 你所PUSH的数据应该存在系统所指派的地址上。。。。这是我个人的意见。。。。望指教
okenny
[第4楼]   [ 回复时间:2010-04-08 15:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
补充一点:不知道是不是一开始就ASSUME SS:STACKSG后就不用在CODESG里再定义以下部分:
mov ax,stacksg
mov ss,ax
mov sp,16h
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved