首页
社区
课程
招聘
王爽汇编语言中的一个菜鸟问题
发表于: 2011-5-1 00:50 3901

王爽汇编语言中的一个菜鸟问题

2011-5-1 00:50
3901
初学汇编语言 希望大家给予解答  衷心感谢
这是一个要在第8行第3列以绿色显示welcome to masm!字符  编译调试后却是在第4行显示 why?
让我费解的是在标号s中的这个mov es:[bx+di],cl传值 明明是将77h传到es:0464处  但是用des:0464查看却发现不是77h
如下图


assume cs:c
d segment
db 'welcome to masm!',0
d ends
c segment
start:
mov dh,8
mov dl,3
mov cl,2
mov ax,d
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
        push cx
        push si
        mov al,0a0h
        dec dh
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        sub ax,2
        add bx,ax
        mov ax,0b800h
        mov es,ax
        mov di,0
        mov al,cl
        mov ch,0
s:        mov cl,ds:[si]
        jcxz ok
        mov es:[bx+di],cl
        mov es:[bx+di+1],al
        inc si
        add di,2
        jmp short s
ok:       
        pop si
        pop cx
        ret
c ends
end start

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个方便大家看
data segment
        db 'welcome to masm!',0
data ends
code segment
        assume cs:code,ds:data
start:
        mov dh,8             ;dh装行号(范围:1--25)
        mov dl,3             ;dl装列号(范围:1--80)
        mov cl,2          ;cl中存放颜色属性)
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str
        mov ax,4c00h
        int 21h
      
show_str:   ;显示字符串的子程序[定义开始]

        push cx
        push si
        mov al,0A0h
        dec dh          ;行号在显存中下标从0开始,所以减1
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
        add bx,ax      ;此时bx中存放的是行与列号的偏移地址
     mov ax,0B800h
        mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址
        mov di,0
        mov al,cl
        mov ch,0

s:      mov cl,ds:[si]

        jcxz ok
        mov es:[bx+di],cl       ;偶地址存放字符
        mov es:[bx+di+1],al     ;奇地址存放字符的颜色属性
        inc si
        add di,2
        jmp short s

ok:     pop si

        pop cx
        ret    ;显示字符串的子程序[定义结束]
code ends
end start
2011-5-1 01:12
0
雪    币: 859
活跃值: (304)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
3
.....想想

--------------
debug 调试的dos界面里的显示缓冲区 B800 。。。。
你虽然 mov 了一个数值到这个显示缓冲区的某个位置
但是 debug 显示一次 时马上 更新缓冲区 为它的黑底白字~~ 就是说背后还是那个地方的内容还是被改变了的

你看-des  时此时显示缓冲区的ASCII~~ 有 J.C.X.Z.  这不正是你这个屏幕的第二行的指令吗?
2011-5-1 01:17
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
传值是这个mov es:[bx+di],cl
此时cl中值为77h  传给的是es:[bx+di],bx值为0464h,di值为0
执行这条后查看es:0464h值不是77h
2011-5-1 01:20
0
雪    币: 859
活跃值: (304)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
5
2011-5-1 01:29
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢 这个解释合理  但是为什么在第4行显示呢   明明是要在第8行显示的
2011-5-1 01:32
0
雪    币: 859
活跃值: (304)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
7
我测试了一下是在第八行显示的~~
你 debug  XX.exe 不要单步~~~ 直接 -g 执行之~
2011-5-1 01:39
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我明白了  原来必须要在全屏下才是第8行 谢谢3楼
2011-5-1 01:40
0
游客
登录 | 注册 方可回帖
返回
//