汇编语言读书笔记(二)

关于本次阅读后的思考

 第三章

1 DS 数据段寄存器一次读取2个存储单元,CS是指令段寄存器

2 栈是先进后出,栈寄存器SS:SP 每次都是先进行SP+-=2 然后再进行PUSH或者POP的,切记先SP计算

3 栈其实也是一种写入数据的方式,可以理解为MOV,只不过SS:SP默认会有内存地址。

 第四章

1 下载MASM5.0工具,

执行masm.exe后关联上源文件生成.OBJ文件

执行link.exe后关联上刚生成的OBJ文件生成.EXE文件

执行.EXE文件

edit--test.asm----masm---test.obj----link----test.exe----run

2 通过DEBUG FILE执行单步调试

指令 -t

当int 21h时使用-p结束

第5、6章

代码的框架

assume cs:code

 code segment
    dw XXXXXXXXXXXXXXXXXXX  //数据层
..........
....... start : mov XXX //start 告知执行代码的入口 mov XXXX //代码层 mov XXXX mov ax,4c00h //结束写入 结束程序的时候默认写法 int 21h //结束程序的时候默认写法 code ends end start //代码结束的地方

 

 

第三章 寄存器

字是16位的所以在内存中需要2个单元来存放,且寄存器的高位对应高位地址,低位对应低位地址

 

DS寄存器

数据段地址寄存器

1 DS不能直接被送入数据,必须通过其他寄存器进行中转

例如 mov bx,1000h

      mov ds,bx

      mov al,[0] ---0处写偏移地址[]代表ds的段地址

 

指令 POP PUSH 

PUSH AX 表示把AX的值送入栈中

POP AX  表示把栈顶的值送入AX中

PUH/POP 寄存器/段寄存器/内存单元

栈是先进后出机制,以字为单位

栈地址是由高向低扩展

 

栈的寄存器

SS,SP

SS指向栈的段地址SP指向栈的偏移地址,永远指向栈顶sp+=2(注意:是先SP+-再PUSH或者PHP)

SS必须通过一般寄存器中转后送入值

如果000F为栈底,那么初始化的时候SP指向0010,有一个元素的时候是000E

 

个人理解

1 DS是数据段寄存器,一次读取2个存储单元

2 栈是先进后出,栈寄存器SS:SP 每次都是先进行SP+-=2 然后再进行PUSH或者POP的,切记先SP计算

3 栈其实也是一种写入数据的方式,可以理解为MOV,只不过SS:SP默认会有内存地址。

第四章 汇编程序

指令:

伪指令不被系统执行

汇编指令被翻译成机器代码被执行

 

简单代码

assume cs:abc

abc segment 

    mov ax,2
    add ax,ax
    add ax,ax

mov ax,4c00H
int 21H abc ends end

 

 

 

执行源程序

1 通过MASM5.0执行

edit--test.asm----masm---test.obj----link----test.exe----run

2 通过DEBUG FILE执行单步调试 -t 当int 21h时使用-p结束

 

个人理解

1 下载MASM5.0工具,

执行masm.exe后关联上源文件生成.OBJ文件

执行link.exe后关联上刚生成的OBJ文件生成.EXE文件

执行.EXE文件

edit--test.asm----masm---test.obj----link----test.exe----run

2 通过DEBUG FILE执行单步调试

指令 -t

当int 21h时使用-p结束

第五、六章 汇编程序II

LOOP指令

执行和CX有关,每次执行都会(CX)=(CX)-1

语法是先制定一个地址S:XXXXXX  LOOP S 

要点 CX决定+LOOP决定循环 S标记循环的地址

mov cx 11

s: add ax,ax

    add ax,bx

loop s

以上程序执行11次

 

[BX]

这个指令由于DEBUG和MASM解释的有歧义

MOV AX,[0] DEBUG是将DS:0的值放入AX,MASM则是把0送入AX

所以写编码的时候用 MOV AX,DS:[0] 

 

例1

累加5个数字

0123H,123H,312H,2131H,231H

assume cs:code

 code segment
    dw 0123H,123H,312H,2131H,231H   //在代码的初始位置上先定义数据,试数据能够初始化在0.2.4.6
start : mov ax,0 //start 告知执行代码的入口
mov bx,0
mov cx,5
s: add ax,cs:[bx] //AX累加CS指向的0.2.4.6
add bx,2
loop s
mov ax,4c00h //结束程序的时候默认写法
int 21h //结束程序的时候默认写法
code ends
end start //代码结束的地方


 

 个人理解 

代码的框架

assume cs:code

 code segment
    dw XXXXXXXXXXXXXXXXXXX  //数据层
..........
....... start : mov XXX //start 告知执行代码的入口 mov XXXX //代码层 mov XXXX mov ax,4c00h //结束写入 结束程序的时候默认写法 int 21h //结束程序的时候默认写法 code ends end start //代码结束的地方

 

 

 

 

 

posted on 2014-02-03 23:20  sunfan  阅读(304)  评论(0编辑  收藏  举报