. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->更灵活的定位内存地址的方法
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  问题7.7  [待解决] 回复[ 6次 ]   点击[ 370次 ]  
wxenck
[帖 主]   [ 发表时间:2009-12-31 00:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2008-06-18 16:30
assume cs:code,ds:data
data segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             ' 
    dw 0 
    data ends
code segment
    start:
    mov ax,data
    mov ds,ax
    mov bx,0
    
    mov cx,4 
    
 s0:mov si,0
    mov cx,3
    
   s:mov al,[bx+si]
    and al,11011111b
    mov [bx+si],al
    inc si 
    
    loop s
    
    add bx,16
    loop s0
    mov ax,4c00h  
    int 21h
    code ends
end start
    这里执行完内循环s到cx=1时,往下执行扫行到add bx,16时cx=0,再往下执到到loop s0时,cx已经为0了按书上的说法应该执行下面的指令的,实际调试时是跳转到去执行s0:mov si,0 这个怎么解释?
scuzg
[第1楼]   [ 回复时间:2009-12-31 09:44 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
内循环把外循环的 cx 值破坏了,进入内循环前要通过堆栈保护 cx :
        mov cx,4  
     
s0:     mov si,0 
        push cx           ;保护外循环的 cx 值
        mov cx,3 
     
s:      mov al,[bx+si] 
        and al,11011111b 
        mov [bx+si],al 
        inc si  
        loop s 
        
        pop cx            ;恢复外循环的 cx 值     
        add bx,16 
        loop s0
wxenck
[第2楼]   [ 回复时间:2009-12-31 15:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2008-06-18 16:30
我问的不是这个啊.你说的这个我知道.....
scuzg
[第3楼]   [ 回复时间:2009-12-31 16:49 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
退出内循环时cx=0,楼主的意思因为cx=0程序也应该退出外循环,但loop指令的功能是:
① cx <- (cx)-1,即先将 cx 减一;
② 如果 cx 不等于 0 ,则跳转到目标地址继续循环,否则退出循环。
也就是说 loop 指令在判断 cx 是否为零时先要将其减一,零减一就成了0ffffh, 自然就不会退出循环,而是跳转到 s0 继续循环。
regex
[第4楼]   [ 回复时间:2010-01-11 17:27 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
用栈来保护CX,看来是最安全恰当的。
versaariel
[第5楼]   [ 回复时间:2010-01-11 18:29 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
保存在哪里最合理,还要看当前系统内存的使用情况,个人意见
goodbye
[第6楼]   [ 回复时间:2010-01-20 09:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-30 08:49
书中的程序是错误的,只能陷入死循环将所有内存的前三位都改写,进入内循环前必须保存CX的值才行
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved