注册 登录
编程论坛 汇编论坛

实验10

有容就大 发布于 2012-08-13 12:42, 372 次点击
下面是王爽汇编实验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 需要原始的寄存器数据?
 
9 回复
#2
pangding2012-08-13 13:20
好多系统调用都是通过寄存器传参数的。为了不破坏数据,保存一下也没什么关系。
也许你可以自己试试一下。

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


[ 本帖最后由 pangding 于 2012-8-13 13:23 编辑 ]
#3
有容就大2012-08-13 14:12
回复 2楼 pangding
谢谢p版解释
我去试着把几个push 和 pop 都去掉 程序也能运行 结果一样。
原来寄存器压栈是为了保证系统的正常调用啊。
不过程序里有push 和 pop 为什么不显示的写一个stack?比如
stack segment
……
stack ends

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

#4
zklhp2012-08-13 16:50
接分
#5
信箱有效2012-08-13 20:07
    .
#6
有容就大2012-08-13 21:42
回复 5楼 信箱有效
很热吗 ?
#7
有容就大2012-08-13 21:43
回复 4楼 zklhp
没事言语两声。
#8
pangding2012-08-13 22:42
push 和 pop 就是压栈上的。C 式调用一般是把参数压在栈上,系统调用大多都不利用内存传参数,而是利用寄存器。
先压上,再调用函数,返回之后可能先看看寄存器的值,然后再把之前压的恢复回来。这么做主要是担心系统调用会改变寄存器现在的值。

linux 的好多系统调用是这样的,不知道是不是 windows 的也是。
#9
有容就大2012-08-13 22:47
push 和 pop 就是压栈上的。

那么这个栈是不是就是SS:SP? 而不要自己显示的写一个。
#10
信箱有效2012-08-13 23:55
我是来蹭分的
1