大家好~我是一位新手,刚接触汇编现在遇到了一个小小的问题,希望你们能给我提供下帮助

来源:百度知道 编辑:UC知道 时间:2024/07/01 01:20:07
今天,在汇编中,呵呵!也就是,今天,开始学习汇编的,遇到了一个问题,
也就是关于push and pop的,不废话,我先说明小我的原因所在,
堆栈操作指令 PUSH和POP

格式: PUSH OPRD

POP OPRD

功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令

说明:
1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数.

2. PUSH的操作过程是: (SP)<--(SP)-2,((sp))<--OPRD 即先修改堆栈指针SP(压入时为自动减2),然后,将指定的操作数送入新的栈顶位置.

此处的((SP))<--OPRD,也可以理解为: [(SS)*16+(SP)]<--OPRD 或 [SS:SP]<--OPRD
oprd 说是16位操作数,我还是有点不懂,

最下面的列式我想问下,ss是指的是什么?
为什么要*16?sp是不是 push oprd 的缩写?我觉得好像不是,一般英文的缩写都是头一个字母的,
还有,为什么最后还小于oprd?
我刚才瞎想了一会,大家看看,呵呵!属于瞎想,如果不对,请指教,

{(ss)*16+(sp)}<--oprd

ss2个push 也就是2个堆栈

乘以16 是 16ss

+sp 也就是加个堆栈个弹出

也就是什么都没做,
那这么说 16ss<---oprd?

为什么?

大家一定要帮帮我的~非常谢谢你们!还有,我想在好像有为会汇编的朋友,
有的时候,很简单的问题,去百度,还有可能都找不出什么原因,哎。。气愤啊~有兴趣的朋友请加Q396508218 我天天晚上在的,希望能一起讨论汇编
,虽然我现在还刚接触,但是,我想,我会坚持的~

8086cpu中,有两个寄存器,段寄存器ss和寄存器sp,栈顶的段地址存放在ss中,偏移地址存放在sp中。
上面说的是ss和sp的作用;

你不明白ss为什么要*16,那问题在于你没有搞懂内存地址是怎么存放的
8086cpu中所有的寄存器都是16位的,而地址确是20位,那怎么用16位的寄存器来表示20位的地址呢?
此时就用到了为什么*16了
*16即为左移4位;
所以ss*16就是左移四位,再加上sp的偏移地址即可表示20位的地址。
学汇编就是打基础,一定要把基础打牢,这样在以后的学习中才不会影响深度思考