汇编的小程序提问

assume cs:code

stack segment
db 16 dup(0)
stack ends

code segment
mov ax,4c00h
int 21h

start : mov ax,stack
mov ss,ax
mov sp,16
mov ax,0 ;把0放入ax寄存器含义?
push ax ;这个入栈有什么作用?
mov bx,0 ;这个bx寄存器在这里有什么意思?
ret
code ends

end start

这是王爽第二版,第十章的开头,前面看的都不错。突然这里看不懂了
assume cs:code

stack segment
db 16 dup(0)
stack ends

code segment
mov ax,4c00h
int 21h

start : mov ax,stack
mov ss,ax
mov sp,16
mov ax,0 ;把0放入ax寄存器含义?
push cs ;少了这行!这个cs寄存器地址入栈什么意思???
push ax ;这个入栈有什么作用?
mov bx,0 ;这个bx寄存器在这里有什么意思?
ret
code ends

end start

还有最后那个bx寄存器没有用,为什么要出现么?我觉得一本书里的例子,出现的代码都应该有点用吧,

第1个回答  2010-08-30
就在标题10.1下面讲的很清楚,
ret指令时用堆栈中的数据修改ip的内容,实现近转移
retf指令时用堆栈中的数据修改cs和ip的内容,实现远转移

(你抄程序也错,的细心啊,不然在调程序上会浪费很多时间的!)

所以不难想象,这两个 push的作用,push cs是cs段地址入栈,push ax是指执行retf是pop出的ip值也就是0(mov ax,0),实现远跳。

至于这个bx在这没什么用,可能是从哪截过来的一段程序,这段程序旨在说明ret和retf,所以不用纠缠bx。

还有很重要的一点,想写好汇编,你的学会使用debug。

好了就这么多吧!
第2个回答  2010-08-30
......
mov ax,0 ;把0放入ax寄存器含义?
;PUSH 0是被允许的,但8086不可以,所以需要中转
push ax ;这个入栈有什么作用?
;与ret配合用于修改IP,即控制程序流,使其执行偏移0处的指令,在这里就是返回OS
mov bx,0 ;这个bx寄存器在这里有什么意思?
;没有什么用,我确定!
ret
......
--------------------------
谁晓得作者那时在想啥!
也许你需要参考该书的新版本或最新的勘误表。
尽信书不如无书,多好的格言阿!本回答被提问者采纳
第3个回答  2010-08-29
我觉得现在的80x86汇编的书籍都是很扯淡的,其上面的程序是DOS时代的程序,而且好像举的例子不是没有意义就是没有输出,看的很累。现在学汇编主要还是学的是那些指令,用不同的编译器上面的伪操作是不同的。
我喜欢看罗云斌的《windows32位汇编语言程序设计》,虽然说专门指定的根本就没有,不过好在我以前看过8086汇编,看起来还是简单的

一般我练习汇编代码是在VC里面写的,这样的话在C程序中嵌入汇编,把汇编的功能单独写一个小的函数,让C语言去调用,这样跟踪以及书写都是很好的。
以前反汇编程序我看不懂,都是因为看了那个该死的80x86汇编,搞得我知道这句话是干嘛的,具体整个程序是干嘛的啥都不知道
第4个回答  2010-08-29
程序执行时从start处执行,cs和0入栈,执行ret时,要出栈到cs:ip,cs=入栈的cs,即当前段地址,ip=入栈的0,所以,执行ret后,cs:ip指向cs:0处的mov ax,4c00h,程序才能结束。至于那bx,貌似是没用的