| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 372 人关注过本帖
标题:实验10
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:20 回复次数:9 
实验10
下面是王爽汇编实验10.1的答案 :在屏幕指定的行列 输出数据段的一串字符
程序代码:
assume  cs:code, ds:data
data segment
    db 'Welcome to masm!', 0
data ends

code segment
       start:  mov dh, 8
               mov dl, 3
               mov cl, 2
               mov ax, data
               mov ds, ax
               mov si, 0
               call  show_str
              

               mov ah, 1
               int 21h
               mov ax, 4c00h
               int 21h
              

         show_str:
                  push ax
                  push bx
                  push es
                  push si
                  mov ax, 0b800h
                  mov es, ax
                  mov ax, 160
                  mul dh ; ax = 160 * dh
                  mov bx, ax  ; save ax
                  mov ax, 2
                  mul dl  ; ax = dl * 2
                  add bx, ax ; bx = (160 * dh + 2 * dl) head address
                  mov al, cl
                  mov cl, 0
          show0: 

                  mov ch, [si]
                  jcxz show1
                  mov es:[bx], ch
                  mov es:[bx].1, al
                  inc si
                  add bx, 2
                  jmp show0
          show1:
                  pop si
                  pop es
                  pop bx
                  pop ax
                  ret
                 

code ends

end start
程序能正常运行 并且俺看到了结果
就是想问下 在show_str子程序里为什么要用4个push把寄存器入栈 然后再在show1里pop出来 看了下show_str的过程 貌似不入栈也无影响吧 难道int 21h 需要原始的寄存器数据?
 
2012-08-13 12:42
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:7 
好多系统调用都是通过寄存器传参数的。为了不破坏数据,保存一下也没什么关系。
也许你可以自己试试一下。

pusha (push all) 好像能保存所有的寄存器,与 popa 对应的。


[ 本帖最后由 pangding 于 2012-8-13 13:23 编辑 ]
2012-08-13 13:20
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 2楼 pangding
谢谢p版解释
我去试着把几个push 和 pop 都去掉 程序也能运行 结果一样。
原来寄存器压栈是为了保证系统的正常调用啊。
不过程序里有push 和 pop 为什么不显示的写一个stack?比如
stack segment
……
stack ends

莫非是系统内存里有一个默认的stack?


梅尚程荀
马谭杨奚







                                                       
2012-08-13 14:12
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:7 
接分
2012-08-13 16:50
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:7 
    .
2012-08-13 20:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 5楼 信箱有效
很热吗 ?

梅尚程荀
马谭杨奚







                                                       
2012-08-13 21:42
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 4楼 zklhp
没事言语两声。

梅尚程荀
马谭杨奚







                                                       
2012-08-13 21:43
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
push 和 pop 就是压栈上的。C 式调用一般是把参数压在栈上,系统调用大多都不利用内存传参数,而是利用寄存器。
先压上,再调用函数,返回之后可能先看看寄存器的值,然后再把之前压的恢复回来。这么做主要是担心系统调用会改变寄存器现在的值。

linux 的好多系统调用是这样的,不知道是不是 windows 的也是。
2012-08-13 22:42
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
push 和 pop 就是压栈上的。

那么这个栈是不是就是SS:SP? 而不要自己显示的写一个。

梅尚程荀
马谭杨奚







                                                       
2012-08-13 22:47
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:0 
我是来蹭分的
2012-08-13 23:55
快速回复:实验10
数据加载中...
 
   



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

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