1. PUSH指令格式:
PUSH DS/CS/SI/SP;
PUSH [BX];
说明:入栈实质是双操作数指令,PUSH后面的操作数是源操作数,而目的操作数是堆栈栈顶单元;
POP DS/CS/SI/SP;
POP [BX];
说明:源地址和目的地址刚好和PUSH相反;但是注意CS不能作为目的操作数;
进栈的过程是:SP = SP – 2-将AX的内容送SS:SP
出栈的过程是:将SS:SP的内容送AX中-SP = SP – 2
注意栈顶的位置:假设把10000H-1000H当做栈使用,则SP指向的是10010H;另外我们还需要设置SS
之前我们经常使用M...


[2011-01-15 21:14] 栈
阅读全文 |
评论次数(0) |
浏览次数(351) |
所属类型(默认类型)
[2011-01-13 23:57] 第10章笔记及总结---上
1. ret
POP IP
retf
POP IP
POP CS
补全程序,实现从内存1000:0000处开始执行指令。
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax, 1000h
push ax
mov ax, 0
push ax
retf
code ends
end start
注意先出栈的是IP,所以CS必须先入栈,先进后出嘛。
2. ...
POP IP
retf
POP IP
POP CS
补全程序,实现从内存1000:0000处开始执行指令。
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax, 1000h
push ax
mov ax, 0
push ax
retf
code ends
end start
注意先出栈的是IP,所以CS必须先入栈,先进后出嘛。
2. ...
阅读全文 |
评论次数(0) |
浏览次数(394) |
所属类型(默认类型)
[2011-01-13 20:15] 第9章笔记及总结
1.可以修改IP或者同时可以修改CS和IP的指令叫做转移指令
我的疑问是短转移和近转移的范围是否与高级语言有什么关系啊,因为其范围和c++的char与int是一样的;
2.操作符offset,其实还有一个seg,表示的意义不一样,但原理是一样的;
3.对于问题9.1的nop指令我刚开始不知道,后来才知道他什么也不做,有点像c++语言的分号语句;但留有一个字节
4.jmp无条件指令,其实呢本章全部都是围绕转移的几种类型展开的,他的格式有以下几种:
Jmp short 标号;注意范围
这里要注意位移是怎么得来的;
段内近转移 jmp near ptr 标号;我把ptr给忘记了
Jm...
我的疑问是短转移和近转移的范围是否与高级语言有什么关系啊,因为其范围和c++的char与int是一样的;
2.操作符offset,其实还有一个seg,表示的意义不一样,但原理是一样的;
3.对于问题9.1的nop指令我刚开始不知道,后来才知道他什么也不做,有点像c++语言的分号语句;但留有一个字节
4.jmp无条件指令,其实呢本章全部都是围绕转移的几种类型展开的,他的格式有以下几种:
Jmp short 标号;注意范围
这里要注意位移是怎么得来的;
段内近转移 jmp near ptr 标号;我把ptr给忘记了
Jm...
阅读全文 |
评论次数(0) |
浏览次数(384) |
所属类型(默认类型)
[2011-01-12 07:12] 第8章笔记及总结
1. 数据处理的长度和位置需要注意;
2. 本章其实是寻址方式的延续,很多东西之前已经学过,直接进入实验吧;
3. 关于div指令,老实说我知道原理,也看得懂,就是记不住,所以用的时候再查查吧;
4. 对于伪指令我已经掌握了,诸如dd,db等等
5. 关于dup这个指令很重要,之前在另一本汇编书上看过了。。基本没有问题
6. 实验:
这个实验看着那么复杂,我必须得下手试试;
首先开始算法分析:
根据我的智商,还是从一而终吧;
哈哈,先把年入栈,然后一个个出栈到该位置;这个总没有错吧;
空格我给忘记了,是不是什么也不做啊,先不管他,到时候我什么也不写;
不行,得休息几分钟再...
2. 本章其实是寻址方式的延续,很多东西之前已经学过,直接进入实验吧;
3. 关于div指令,老实说我知道原理,也看得懂,就是记不住,所以用的时候再查查吧;
4. 对于伪指令我已经掌握了,诸如dd,db等等
5. 关于dup这个指令很重要,之前在另一本汇编书上看过了。。基本没有问题
6. 实验:
这个实验看着那么复杂,我必须得下手试试;
首先开始算法分析:
根据我的智商,还是从一而终吧;
哈哈,先把年入栈,然后一个个出栈到该位置;这个总没有错吧;
空格我给忘记了,是不是什么也不做啊,先不管他,到时候我什么也不写;
不行,得休息几分钟再...
阅读全文 |
评论次数(0) |
浏览次数(375) |
所属类型(默认类型)
[2011-01-12 07:11] 第7章笔记及总结
1. 关于逻辑运算指令,书上在进行大小写转化时很有创意,这里不多的去描述,之前写了好几遍。
2. 关于ASCII码也很简单,不多说,此外我感觉还应该知道UNICODE,BCD,GB2312等编码最好,可惜的是GB2312我也没认真去研究;
3. 另外si,di我做了很多遍,两个的位置关系要注意,本章其实换成寻址方式估计还好点;呵呵;
4. 一个重要的问题就是CX循环时,其值可能会改变,所以我们可以将其入栈;这很重要;
编程,完成问题7.9中的程序。
(编程,将datasg段中每个单词的前4个字母改为大写字母。)
assume cs:codesg,ds:datasg,ss:stack...
2. 关于ASCII码也很简单,不多说,此外我感觉还应该知道UNICODE,BCD,GB2312等编码最好,可惜的是GB2312我也没认真去研究;
3. 另外si,di我做了很多遍,两个的位置关系要注意,本章其实换成寻址方式估计还好点;呵呵;
4. 一个重要的问题就是CX循环时,其值可能会改变,所以我们可以将其入栈;这很重要;
编程,完成问题7.9中的程序。
(编程,将datasg段中每个单词的前4个字母改为大写字母。)
assume cs:codesg,ds:datasg,ss:stack...
阅读全文 |
评论次数(0) |
浏览次数(396) |
所属类型(默认类型)
[2011-01-12 07:10] 第6章笔记及总结
1. 关于程序的入口,这个书上很详细,已经全部掌握,但还是得练习一下:
ASSUME CS:code
code SEGMENT
DW 0123h,000ah,100bh,2cd4h,5566h,7788h,6669h,1111h
DW 0,0,0,0,0,0,0,0。。。。。。。。。
start:
MOV AX,CS
MOV SS,AX
MOV SP,30h
...
ASSUME CS:code
code SEGMENT
DW 0123h,000ah,100bh,2cd4h,5566h,7788h,6669h,1111h
DW 0,0,0,0,0,0,0,0。。。。。。。。。
start:
MOV AX,CS
MOV SS,AX
MOV SP,30h
...
阅读全文 |
评论次数(0) |
浏览次数(380) |
所属类型(默认类型)
[2011-01-12 07:08] 第五章笔记及总结
1.[bx]表示内存单元,他的偏移地址是:bx
例:MOV AX,[0]; 将一个内存单元的内容送入AX,长度是两个字节
MOV AL,[0]; 将一个内存单元的内容送入AL,长度是1个字节
MOV AX[BX];偏移地址在BX中,存放一个字
MOV AL,[BX];同上,存放一个字节;
总结:完整的描述一个内存单元,需要:
1) 说明内存单元地址
2) 内存单元的长度(类型)
2.(20000H)表示内存单元的内容,括号里面的数值表示物理地址
例:PUSH AX等价于:
(SP) = (SP)-2
((SS)*16+(SP)) = (AX)
另外约定IDATA表示...
例:MOV AX,[0]; 将一个内存单元的内容送入AX,长度是两个字节
MOV AL,[0]; 将一个内存单元的内容送入AL,长度是1个字节
MOV AX[BX];偏移地址在BX中,存放一个字
MOV AL,[BX];同上,存放一个字节;
总结:完整的描述一个内存单元,需要:
1) 说明内存单元地址
2) 内存单元的长度(类型)
2.(20000H)表示内存单元的内容,括号里面的数值表示物理地址
例:PUSH AX等价于:
(SP) = (SP)-2
((SS)*16+(SP)) = (AX)
另外约定IDATA表示...
阅读全文 |
评论次数(0) |
浏览次数(420) |
所属类型(默认类型)
[2011-01-12 07:01] 第四章笔记及总结
第四章 第一个程序
1.一个程序从写出到执行的过程;
1)编写汇编源程序:
2)进行编译连接:编译后产生目标文件,连接后产生可执行文件
说明:可执行文件包含:程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
相关的描述信息(程序大小,占据空间)
3)执行可执行文件中的程序;操作系统依照可执行文件的描述信息,将其机器码和数据加载进入内存,并进行相关的初始化(比如设置CS:IP指向第一条要执行的指令),然后由CPU执行程序;
2.伪指令
XXX SEGMENT
……..
XXX ENDS
定义一个段,SEG...
1.一个程序从写出到执行的过程;
1)编写汇编源程序:
2)进行编译连接:编译后产生目标文件,连接后产生可执行文件
说明:可执行文件包含:程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
相关的描述信息(程序大小,占据空间)
3)执行可执行文件中的程序;操作系统依照可执行文件的描述信息,将其机器码和数据加载进入内存,并进行相关的初始化(比如设置CS:IP指向第一条要执行的指令),然后由CPU执行程序;
2.伪指令
XXX SEGMENT
……..
XXX ENDS
定义一个段,SEG...
阅读全文 |
评论次数(0) |
浏览次数(384) |
所属类型(默认类型)
[2011-01-11 21:45] 第三章笔记及总结
第三章 寄存器(内存访问)
1.高地址放高字节,低地址放低字节;
2.[0]表示一个内存单元,0表示内存单元的偏移地址;
3.mov add sub等指令,比较简单;
4. 在DEBUG中,用 "D 0:0 lf" 查看内存,结果如下:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值
mov ax,1
...
1.高地址放高字节,低地址放低字节;
2.[0]表示一个内存单元,0表示内存单元的偏移地址;
3.mov add sub等指令,比较简单;
4. 在DEBUG中,用 "D 0:0 lf" 查看内存,结果如下:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值
mov ax,1
...
阅读全文 |
评论次数(0) |
浏览次数(480) |
所属类型(默认类型)
[2011-01-11 19:54] 第二章笔记及总结
第二章 寄存器
1.通用寄存器中的几个寄存器AX,BX,CX,DX之所以可以分解,是因为为了和前面的CPU兼容;
2.1个字=2个字节,即16位;
3.16进制出现的原因就是为了方便程序员观看数据(这样说不是很恰当,但意思是对的)
4. 计算AX
mov ax,62627 AX=F4A3H ;注意这里是一个10进制的数据,要转换为16进制;
mov ah,31H AX=31A3H ;这里只是改变了ah,al还是a
mov al,23H AX=3123H ;同上
add ax,ax AX=6246H ;
mov bx,826CH B...
1.通用寄存器中的几个寄存器AX,BX,CX,DX之所以可以分解,是因为为了和前面的CPU兼容;
2.1个字=2个字节,即16位;
3.16进制出现的原因就是为了方便程序员观看数据(这样说不是很恰当,但意思是对的)
4. 计算AX
mov ax,62627 AX=F4A3H ;注意这里是一个10进制的数据,要转换为16进制;
mov ah,31H AX=31A3H ;这里只是改变了ah,al还是a
mov al,23H AX=3123H ;同上
add ax,ax AX=6246H ;
mov bx,826CH B...
阅读全文 |
评论次数(0) |
浏览次数(324) |
所属类型(默认类型)
『 查看更多文章 』