. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->基础知识
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  新的开始,开始学汇编,努力2个星期学完,这是起点!  [待解决] 回复[ 78次 ]   点击[ 2620次 ]  
ssguo
[帖 主]   [ 发表时间:2010-01-27 06:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
大家好,我叫勇牛!~
学习汇编的原因现在只有一个:做免杀!

因为汇编知识太差,导致我在免杀这条道路上走得十分坎坷!!!!
所以立誓一定要把汇编学好,学精!~~
从今天学起,从现在学起,今天是我的新起点!~~
发誓:不把汇编学到手,学精,誓不为人!
今后我会不断上来看我的这张贴子,把我的学习进度和学习笔记写在这里!。。。

如果半途放弃了,,那我觉得我这一生做什么事都不会成功了。。。

好了,现在去学习了。。 

我会不断更新这张贴子的。。。
                                              by 2010-1-27
                                        勇牛 注
ssguo
[第1楼]   [ 回复时间:2010-01-27 07:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
1.1 - 1.10 小结
1 汇编指令是机器指令的助词符,同机器指令一一对应。
2 每一种CPU都有自己的汇编指令集。
3 CPU可以直接使用的信息在存储器中存放
4 在存储器中指令和数据没有任何区别,都是二进制信息。
5 存储单元从零开始顺序编号。
6 一个存储单元可以存储8个bit,即8位二进制数。
7 1 Byte =8 bit 1KB=1024 Byte 1MB=1024 KB 1GB=1024MB
8 每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线,一个

CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能:
   地址总线的宽度决定了CPU的寻址能力;
   数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量;
   控制总线的宽度决定了CPU对系统中其它器件的控制能力。
在汇编课程中,我们从功能的角度介绍了3类总线,对实际的连接情况不做讨论。

检测点1.1  
(1) 1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 ( 13  )
因为: 一个CPU有N根地址总线,则可以说这个CPU的地址总线宽度为N,这样的CPU寻址能力为
2的N次方个。
所以寻址能力为8KB(即8*1024)个的CPU的地址总线宽度为:
2的X次方=8*1024
X=13

(2) 1KB的存储器有(1024 )个存储单元,存储单元的编号从(0 ) 到 (1023)

因为:微型机存储器的1个存储单元可以存储1个Byte(字节),即8个二进制位(8bit)。一个存储

器有128个存储单元,它可以存储128个Byte。所以1KB=1024 byte = 1024 个存储单元。


(3) 1KB的存储器可以存储( 8192)个 bit, ( 1024)个Byte

同上 1KB=1024 Byte = 1024 * 8 Bit

(4) 1GB 1MB 1KB分别是 ( 1024*1024*1024  1024*1024  1024 ) Byte.


(5) 8080 8088 80286 80386 的地址总线宽度分别为16根 20根 24根 32根
则它们的寻址能力分别为 

分析
同1,因为一个CPU有N根地址总线,则可以说这个CPU的地址总线宽度为N,这样的CPU寻址能力为
2的N次方个Byte。
所以它们的寻址能力分别为 
(2的16次方/1024 KB)  (2的20次方/1024*1024 MB) (2的24次方/1024*1024MB)
(2的24次方/1024*1024*1024 GB)


(6)8080 8088 8086 80286 80386 的数据总线宽度分别为8根 8根 16 根 16根 32根
则它们一次可以传送的数据为 (1B)(1B)(2B)(2B)(4B)
因为8根数据总线可传送1个8位二进制即1Byte, 16根数据总线一次可传2Byte



(7)从内存中读取1024字节的数据,8086至少要读(512)次,80386至少要读(256)次

因为 8086宽度是16 ,一次可传2Byte, 所以要传 1024/2 = 512 次
80386宽度是32 ,一次可传4Byte,所以要传 1024/4 = 256次

(8)在存储器中,数据和程序以(二进制)形式存放。
versaariel
[第2楼]   [ 回复时间:2010-01-27 09:08 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
呵呵
regex
[第3楼]   [ 回复时间:2010-01-27 22:22 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
好羡慕贴主。。。我学了一个月啦, 才学到第十章~~~
ssguo
[第4楼]   [ 回复时间:2010-01-28 15:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点2.1
mov ax,62627  AX= 62627 F4A3
mov ah,31H    AX= 31A3
mov al,23H    AX= 3123
add ax,ax     Ax= 6246
mov bx,826CH  BX= 826C
mov cx,ax     CX= 6246
mov ax,bx     AX= 826C
add ax,bx     AX= 04D8
mov al,bh     AX= 0482
mov ah,bl     AX= 6C82
add ah,ah     AX= D882
add al,6      AX= D888
add al,al     AX= D810
mov ax,cx     AX= 6246

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
mov ax,2
add ax,ax
add ax,ax
add ax,ax
ssguo
[第5楼]   [ 回复时间:2010-01-28 15:16 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点2.2
(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为(00010)到(1000F)。
分析:偏移地址为16位,16位二进制数可表示的最大数范围是:2^16 = 2^6×2^10 = 2^3×2^3×2^10=8×8×1K= 64KB,变化范围为0~FFFFH。根据公式:段地址×16+偏移地址=物理地址。题目中段地址为0001H,即:CUP的寻址范围为:0001H×16+0H=00010H  0001H×16+FFFFH=1000FH。


(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。
则SA满足的条件是: 最小为(1001),最大为(2000)。

分析:理论上说,偏移地址为16位,16位地址的寻址能力为64KB,变化范围应该为0~FFFFH。题目中给出段地址为SA,数据存放的物理地址为20000H,即:SA×16+(0~FFFFH)=20000H。
理论上SA(min)=(20000H-FFFFH)/16=10001H/16
因为一个段地址的起始地址一定是(10进制16)或者说(10H )的倍数,一个数据的16进制形式左移1位,相当于乘以16,即是左移后的段地址能被10H整除,所以偏移地址就不能取到FFFFH了,即偏移地址的取值范围为 0H~FFF0H了。
所以,
SA(min)=(20000H-FFF0H)/16=10010H/16=1001H
SA(max)=(20000H-0H)/16=20000H/16=2000H



先明确一个概念:偏移地址的范围是0H到FFFFH. 

(1)已知:段地址SA=1000H.求:可访问的内存单元的范围? 
可访问的内存单元的范围是:最小值:1000H×16+0H=10000H 
                       最大值:1000H×16+FFFFH=1FFFFH 
可见20000H单元不在这个可访问范围内,所以答案最小值1000H是错的。 
(2)已知:段地址SA=2000H.求:可访问的内存单元的范围? 
可访问的内存单元的范围是:最小值:2000H×16+0H=20000H 
                       最大值:2000H×16+FFFFH=2FFFFH 
可见20000H单元在这个可访问范围内,而且仅当偏移地址取最小值0H时(此时段地址取最大值),才能访问到20000H单元,所以答案最小值2000H是正确的。


(3)提示,反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻到20000H
单元?
1001H≤SA≤2000H
ssguo
[第6楼]   [ 回复时间:2010-01-28 15:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答: 4次       最后IP中的值是0


分析: 
读入mov ax, bx前,IP已指向指令mov ax, bx的首地址A 
第1次:读入mov ax, bx后,IP指向指令sub ax, ax的首地址B;    
第2次:执行完mov ax, bx后,读入sub ax, ax, 此时IP指向指令jmp ax的首地址C;   
第3次:执行完sub ax, ax后,读入jmp ax,此时IP指向指令jmp ax的下一条指令的首地址D;   
第4次:执行完jmp ax后; IP等于寄存器ax的值,为0000H。   
最后IP的值为0000H。
ssguo
[第7楼]   [ 回复时间:2010-01-28 15:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点3.1

(1)在Debug中,用"d 0:0 1f"查看内存,结果如下。
-d 0:0 1f
0000:0000  68 10 A7 00 BB 13 54 05-16 00 96 03 B1 13 54 05   h.....T.......T.
0000:0010  8B 01 70 00 B9 06 0C 02-40 07 0C 02 FF 03 0C 02   ..p.....@.......

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值。

mov ax,1
mov ds,ax
mov ax,[0000]  AX= 018BH
mov bx,[0001]  BX= 7001H
mov ax,bx      AX= 7001H
mov ax,[0000]  AX= 018BH
mov bx,[0002]  BX= 0070H
add ax,bx      AX= 01FBH
add ax,[0004]  AX= 08B4H
mov ax,0       AX= 0000H
mov al,[0002]  AX= 0070H
mov bx,0       BX= 0000H
mov bl,[000c]  BX= 00FFH
add al,bl      AX= 006FH


(2)内存中的情况如图3.6所示。各寄存器的初始值: 
CS=2000H ,IP=0,DS=1000H,AX=0,BX=0

1 写出CPU执行的指令序列(用汇编指令写出)。
mov ax,6622H
jmp 0ff0:0100
mov ax,2000h
mov ds,ax
mov ax,[0008]
mov ax,[0002]

2 写出CPU执行每条指令后,CS,IP和相关寄存器中的数值。
mov ax,6622H
CS=2000H ,IP=3,DS=1000H,AX=6622H,BX=0

jmp 0ff0:0100
CS=1000H ,IP=0,DS=1000H,AX=6622H,BX=0

mov ax,2000h
CS=1000H ,IP=3,DS=1000H,AX=2000H,BX=0


mov ds,ax
CS=1000H ,IP=5,DS=2000H,AX=2000H,BX=0

mov ax,[0008]

CS=1000H ,IP=8,DS=2000H,AX=C389H,BX=0


mov ax,[0002]
CS=1000H ,IP=11,DS=2000H,AX=EA66H,BX=0

3 再次体会: 数据和程序有区别吗?如何确定内存中的信息
哪些是数据,哪些是程序?
我加答:个人理解: 表面看上去没有区别(因为都是以二进制形式存储的) 但又有区别,它们的区别是CPU把它们谁当作数据或者程序看待。
哪些是数据由DS:决定,哪些是程序由CS:IP 决定。

其它参考答案:
1 数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪,CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断. 数据和程序在内存中都是已2进制的数据存贮,只有当2进制的数据被CS:IP指向时,才成为可执行的指令或程序。
在现在CPU的保护模式中,每个内存段都其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这最就变相的指定了哪个些内存中存储的是指令哪些是数据.

2
CS(CodeString)指向的是指令段地址,指令段寄存器DS(DataString)指向的是数据段地址,数据段寄存器SS(StackString)指向的是栈顶段地址,栈段寄存器内存中的数据和程序没有区别,说都是以2进制形式存储的!答案补充 
CS指向的段地址里,存的是指令DS指向的段地址里,存的是数据回答完毕!!!
ssguo
[第8楼]   [ 回复时间:2010-01-28 16:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点3.2
(1)

mov ax,2000h
mov ss,ax
mov sp,0010h

(2)
mov ax,1000h
mov ss,ax
mov sp,0000h
ssguo
[第9楼]   [ 回复时间:2010-01-28 17:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
第三章实验
1 使用Debug,将上面的程序段写入内存,啄条执行,根据指令执行后的实验
运行情况填空。

mov ax,ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]  ;ax=5BEAH
add ax,[2]  ;bx=5CCAH
mov bx,[4]  ;bx=30F0H
add bx,[6]  ;bx=6028H

push ax     ;sp=00FEH  ;修改的内存单元的地址是2200:00FE   内容为 5CCAH
push bx     ;sp=00FCH  ;修改的内存单元的地址是2200:00FC   内容为 6028H
pop ax      ;sp=00FEH  ;ax=6028H
pop bx      ;sp=0100H  ;bx=5CCAH

push [4]    ;sp=00FE  ;修改的内存单元的地址是00FE   内容为30F0H
push [6]    ;sp=00FC  ;修改的内存单元的地址是00FC   内容为2F38H


(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

答:认真观察,发现 08 01 39 0B 分别是IP的值 和CS的值 至于为什么不知道。
ssguo
[第10楼]   [ 回复时间:2010-01-29 04:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
例子5.3
计算ffff:0006单元中的数乘以3,结果存储在dx中。

assume cs:code
code segment
      mov ax,0ffffH
      mov ds,ax

      mov dx,0
      mov cx,3

      mov al,ds:[0006]
      mov ah,0
s:    add dx,ax
      loop s
      
      mov ax,4c00H
      int 21H
code ends
     end



例子5.4 计算ffff:0006单元中的数乘以123,结果存储在dx中。


assume cs:code
code segment
      mov ax,0ffffH
      mov ds,ax

      mov dx,0
      mov cx,123

      mov al,ds:[0006]
      mov ah,0
s:    add dx,ax
      loop s
      
      mov ax,4c00H
      int 21H
code ends
     end


例子5.8 将内存 ffff:0 - ffff:b 单元中的数据复制到0:200 - 0:20b单元中。

算法分析: 
0000:0200 - 0000:020b 等于 0020:0000 - 0020:000b
bx 存放变量0 - b

循环12次
ffff:0 - ffff:b 用 ds:[bx] 表示
al=ds:[bx]
0:200 - 0:20b 用 ds:[bx] 表示
ds:[bx]=al

程序如下:


assume cs:code
code segment
     mov bx,0
     mov ax,0
     mov cx,12

s:   mov ax,0ffffH
     mov ds,ax
     mov dl,ds:[bx]

     mov ax,0020H
     mov ds,ax
     mov ds:[bx],dl

     int bx
     loop s

     mov ax,4c00H
     int 21H
code ends
     end
ssguo
[第11楼]   [ 回复时间:2010-01-29 04:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
实验4
1 编程,向内存0:200 - 0:23F依次传送数据 0-63 (3FH)。

分析: 0000:0200 - 0000:023F = 0020:0000 - 0020:003F  
ds=0020  bx=0   初始化 bx 用作变量 0 - 3FH  
0020:0000 - 0020:003F 表示为:DS:[bx]
cx=64
s:mov ds:[bx],bx
  inc bx
  loop s

程序如下:

assume cs:code
code segment
     mov ax,0020H
     mov ds,ax

     mov bx,0
     mov cx,64
     
s:   mov ds:[bx],bl
     inc bx
     loop s
 
     mov ax,4c00H
     int 21H
code ends
end


2 编程 向内存0:200 - 0:23F依次传送数据 0-63 (3FH)。程序只能使用9条指令包含 
mov ax,4c00H int 21H


程序:
   mov ax,0020H
     mov ds,ax

     mov bx,0
     mov cx,64
     
s:   mov ds:[bx],bl
     inc bx
     loop s
 
     mov ax,4c00H
     int 21H


3  下面的程序的功能是将 "mov ax,4c00h"之前的指令复制到内存 0:200 处,补全
程序。上机调试,跟踪运行结果。

assume cs:code
code segment

  mov ax,( )
  mov ds,ax

  mov ax,0020h
  mov es,ax

  mov bx,0
  mov cx,()

s: mov al,[bx]
   mov es:[bx],al
   inc bx
   loop s
   mov ax,4c00h
   int 21h

code ends
end

分析: mov ax,4c00h 之前的指令存放在内存 cs:0000 - cs:0016 共17个字节
所以第一个空为: mov ac,(cs) ,第二空为 mov cx,(17)
关于第二个空我是这样想的,开始cx,()乱填一个数,然后编译连成exe用debug加载
然后用U命令查看mov ax,cs mov ax,4c00h 是: cs:0000 - cs:0016 所以长度为17个字节

(1)复制的是什么?从哪里到哪里
答:复制的是cs:0000 - cs:0016中的内容,从cs:0000 - cs:0016
(2)复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
答: 复制的是cs:0000 - cs:0016中的内容 共17个字节  用U命令查看
mov ax,cs 到 loop s结束 所占的字节数。
ssguo
[第12楼]   [ 回复时间:2010-01-29 04:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
当前进度:  开始学习第6章
ssguo
[第13楼]   [ 回复时间:2010-01-29 06:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
6.2例子:完成下面的程序,利用栈,将程序中定义的数据逆序存放。

assume cs:codesg
codesg segment
  dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

codesg ends
end




程序如下:

assume cs:codesg
codesg segment
  dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
       mov ss,ax
       mov sp,30h

       mov ax,cs
       mov ds,ax

       mov cx,8
       mov bx,0
s:     
       push [bx]
       add bx,2
       loop s

       add bx,8
       mov bx,0
s2     
       pop [bx]
       add bx,2
       loop s2

       mov ax,4c00h
       int 21h

codesg ends
end start
ssguo
[第14楼]   [ 回复时间:2010-01-29 06:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点6.1 
1 下面的程序实现依次用内存0:0 - 0:15 单元中的内容改写程序中的数据,完成程序:
assume cs:codesg
codesg segment
     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

start: mov ax,0
       mov ds,ax
       mov bx,0
       
       mov cx,8
s:     mov ax,[bx]
       mov cs:[bx],ax  填空
       add bx,2
       loop s
 
       mov ax,4c00h
       int 21h
codesg ends
end start
       

2 下面的程序实现依次用内存 0:0 - 0:15单元中的内容改写程序中的数据,数据的传
送用栈来进行。栈空间设置在程序内。完成程序:

assume cs:codesg
codesg segment
 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
 dw 0,0,0,0,0,0,0,0,0,0

start: mov ax,cs 填空
       mov ss,ax
       mov sp,24h 填空

       mov ax,0
       mov ds,ax
       mov bx,0
       mov cx,8

s:     push [bx]
       pop cs:[bx]  填空
       add bx,2
       loop s

      mov ax,4c00h
      int 21h

codesg ends
end start
versaariel
[第15楼]   [ 回复时间:2010-01-29 08:53 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
羡慕LZ好多时间学习
gqpdanche
[第16楼]   [ 回复时间:2010-01-29 09:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-28 11:56
今天 我也来过
ssguo
[第17楼]   [ 回复时间:2010-01-29 10:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
6.4 完成下面的程序,利用栈,将程序中定义的数据逆序存放。

0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

程序代码:

assme cs:code ds:data ss:stack

data segment
     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
      dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

code segment
     start: 
            mov ax,stack
            mov ss,ax
            mov sp,20h

            mov ax,data
            mov ds,ax
            mov bx,0

           mov cx,8

s:         push [bx]
           add bx,2
           loop s

           add cx,8
           add bx,-16

s1:        pop [bx]
           inc bx
           inc bx
           loop s1
        mov ax,4c00h
        int 21h
code ends
end start
ssguo
[第18楼]   [ 回复时间:2010-01-29 10:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
实验五 第1小题
1 将下面的程序编译连接,用Debug加载,跟踪,然后回答问题。
assume cs:code,ds:data,ss:stack
data segment
   dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
   dw 0,0,0,0,0,0,0,0
stack ends

code segment

start: mov ax,stack
       mov ss,ax
       mov sp,16

       mov ax,data
       mov ds,ax
       
       push ds:[0]
       push ds:[2]
       pop ds:[2]
       pop ds:[0]

       mov ax,4c00h
       int 21h
code ends
end start

下面是debug中的过程
一,开始加载,用r查看如下
-r
AX=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B3C  ES=0B3C  SS=0B4C  CS=0B4E  IP=0000   NV UP EI PL NZ NA PO NC
0B4E:0000 B84D0B        MOV     AX,0B4D
-


二,U命令查看
-u
0B4E:0000 B84D0B        MOV     AX,0B4D
0B4E:0003 8ED0          MOV     SS,AX
0B4E:0005 BC1000        MOV     SP,0010
0B4E:0008 B84C0B        MOV     AX,0B4C
0B4E:000B 8ED8          MOV     DS,AX
0B4E:000D FF360000      PUSH    [0000]
0B4E:0011 FF360200      PUSH    [0002]
0B4E:0015 8F060200      POP     [0002]
0B4E:0019 8F060000      POP     [0000]
0B4E:001D B8004C        MOV     AX,4C00
-

三, 执行到 mov ax,4c00h 前

-t

AX=0B4C  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B4C  ES=0B3C  SS=0B4D  CS=0B4E  IP=001D   NV UP EI PL NZ NA PO NC
0B4E:001D B8004C        MOV     AX,4C00
-


四, data段中的内容
-t

AX=0B4C  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B4C  ES=0B3C  SS=0B4D  CS=0B4E  IP=001D   NV UP EI PL NZ NA PO NC
0B4E:001D B8004C        MOV     AX,4C00

-d 0b4c:0000 f
0B4C:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09   #.V.............
-




问题:
1) CPU执行程序,程序返回前,data段中的数据为多少?
0B4C:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09

2) CPU执行程序,程序返回前,cs=0B4E  ss=0B4D ds=0B4C

3) 设程序加载后,code段的段地址为X,则data段的段地址为X-12, stack段的段地址为X-2
ssguo
[第19楼]   [ 回复时间:2010-01-29 10:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
2 将下面的程序编译连接,用Debug加载,跟踪,然后回答问题。



assume cs:code,ds:data,ss:stack
data segment
   dw 0123h,0456h
data ends

stack segment
   dw 0,0
stack ends

code segment

start: mov ax,stack
       mov ss,ax
       mov sp,16

       mov ax,data
       mov ds,ax
       
       push ds:[0]
       push ds:[2]
       pop ds:[2]
       pop ds:[0]

       mov ax,4c00h
       int 21h
code ends
end start






一,debug加载后,用r查看如下:
C:\>debug 1.exe
-r
AX=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B3C  ES=0B3C  SS=0B4C  CS=0B4E  IP=0000   NV UP EI PL NZ NA PO NC
0B4E:0000 B84D0B        MOV     AX,0B4D
-

二,U命令查看如下:

-u
0B4E:0000 B84D0B        MOV     AX,0B4D
0B4E:0003 8ED0          MOV     SS,AX
0B4E:0005 BC1000        MOV     SP,0010
0B4E:0008 B84C0B        MOV     AX,0B4C
0B4E:000B 8ED8          MOV     DS,AX
0B4E:000D FF360000      PUSH    [0000]
0B4E:0011 FF360200      PUSH    [0002]
0B4E:0015 8F060200      POP     [0002]
0B4E:0019 8F060000      POP     [0000]
0B4E:001D B8004C        MOV     AX,4C00
-

三,查看数据段如下
-d 0b4c:0000 f
0B4C:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   #.V.............
-

四 运行至 mov ax,4c00h 然后用 -d 0b4c:0000 f 查看data中的数据,内容如下:

-t

AX=0B4C  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B4C  ES=0B3C  SS=0B4D  CS=0B4E  IP=001D   NV UP EI PL NZ NA PO NC
0B4E:001D B8004C        MOV     AX,4C00

-d 0b4c:0000 f
0B4C:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   #.V.............
-








问题:
1 CPU执行程序,程序返回前,data段中的数据为多少?
0B4C:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00

2 CPU执行程序,程序返回前,CS=0b4e SS=0b4d DS= 0b4c。
3 设程序加载后,code段的段地址为X,则data段的段地址为X-12 stack段的段地址为(X-2)
4 对于如下定义的段

name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(一个段最小为16字节,而

且一个段的开辟空间的大小总是16字节的整数倍。)。
ssguo
[第20楼]   [ 回复时间:2010-01-29 12:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
实验5 第3小题目
3 将下面的程序编译连接,用Debug加载,跟踪,然后回答问题。
assume cs:code,ds:data,ss:stack

code segment
start: mov ax,stack
       mov ss,ax
       mov sp,16

       mov ax,data
       mov ds,ax

       push ds:[0]
       push ds:[2]
       pop ds:[2]
       pop ds:[0]

       mov ax,4c00h
       int 21h
code ends

data segment
dw 0123h,0456h
data ends

stack segment
dw 0,0
stack ends

end start


问题: 
1 CPU执行程序,程序返回前,data段中的数据为多少?
0B4C:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00
2 CPU执行程序,程序返回前,cs=0B4C   ss= 0B50 ds= 0B4F
3 设程序加载后,code段的段地址为X,则data段的段地址为()stack段的段地址为()
xcl007
[第21楼]   [ 回复时间:2010-01-29 14:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-28 18:00
楼主加我qq,459519182!!志同道合的朋友!!哈哈,我学汇编也是为了做免杀啊!!才学了第一章!!
ssguo
[第22楼]   [ 回复时间:2010-01-29 16:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
加了
ssguo
[第23楼]   [ 回复时间:2010-01-29 16:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
实验6
将datasg段中每个单词的前4个字母改为大写字母。


assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends

datasg segment
db '1. display      '
db '2. brows        '
db '3. replace      '
db '4. modify       '
datasg ends

codesg segment
start: mov ax,stacksg
       mov ss,ax
       mov sp,16

       mov ax,datasg
       mov ds,ax
       
       mov bx,0
       mov cx,4
       
s:     push cx
       mov cx,4
       mov si,0

s0:    mov al,3[bx+si]
       and al,11011111b
       mov 3[bx+si],al
       inc si
       loop s0

       add bx,16
       pop cx
       loop s

       mov ax,4c00h
       int 21h

codesg ends

end start
ssguo
[第24楼]   [ 回复时间:2010-01-29 16:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
当前进度: 第8章开始学习中
hz88988650
[第25楼]   [ 回复时间:2010-01-30 10:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-29 17:37
两天时间就学到第八章了,佩服!!!向你学习
ssguo
[第26楼]   [ 回复时间:2010-01-30 11:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
实验7
算法分析:
 data段用数组表示方法:    idata[di]  行idata常量 列 di变量

 table段用数组表示方法:  bp[idata]  行bp变量,列idata常量

assume cs:code,ds:data,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends


table segment
  db 21 dup ('year sume ne ?? ')
table ends

stack segment
db 16 dub (0)
stack ends

code segment
start:  mov ax,data
        mov bs,ax

        mov ax,table
        mov es,table

        mov ax,stack
        mov ss,stack

        mov di,0
        mov bp,0
        mov si,0
        mov cx,21
copy:
       ;复制年份
       push 0[di]
       push 0[di+2]
       pop  es:bp[2]
       pop  es:bp[0]


      ;复制收入
      push 54H[di]
      push 54H[di+2]
      pop  es:bp[7]
      pop  es:bp[5]

      ;复制雇员
      push 0A8H[di]
      pop  es:bp[0ah]


      ;计算人均收入
      mov bx,es:bp[7]
      mov ax,es:bp[5]
      div word ptr es:bp[0ah]
      mov es:bp[0dh],ax

     add di,4
     add si,2
     add bp,10h

     loop copy

     mov ax,4c00h
     int 21h
code ends
end start
gqpdanche
[第27楼]   [ 回复时间:2010-01-30 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-28 11:56
我也来了
ssguo
[第28楼]   [ 回复时间:2010-01-30 14:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点9.1

(1)程序如下。
assume cs:code
data segment
?
data ends

code segment
 start:mov ax,data
       mov ds,ax
       mov bx,0
       jmp word ptr [bx+1]
code ends
end start

若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?
分析: 要使CS:IP指向程序的第一条指令 即[bx+1]等于第一条指令的地址。
第一条指令的地址ip=0000; 所以要使[bx+1]=0000;
所以 data段中的定义的数据为:
data segment
db 0,0,0
data ends

(2)程序如下。
assume cs:code

data segment
dd 12345678H
code ends

code segment
start: mov ax,data
       mov ds,ax
       mov bx,0
       mov [bx],(   )
       mov [bx+2],(     )
       jmp dword ptr ds:[0]

code ends
end start
补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令。
分析: CS:IP 指向程序的第一条指令的地址为:  CS:0
所以补全的程序如下
mov [bx],bx
mov [bx+2],cs

(3)用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 .......
则此时,CPU执行指令:
mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]

后,(CS)=? , (IP)=?
答 cs=0006H IP=00BEH
ssguo
[第29楼]   [ 回复时间:2010-01-30 14:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点9.2
补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后
将它的偏移地址存储在dx中。

assume cs:code
code segment
start: mov ax,2000H
       mov ds,ax
       mov bx,0
s: ___________________
  
   ____________________

   _______________________

   _______________________
   jmp short s
ok:  mov dx,bx
     mov ax,4c00h
     int 21h
code ends
end start

回答:
mov cl,[bx]
mov ch,0
jcxz ok
inc bx
ssguo
[第30楼]   [ 回复时间:2010-01-30 15:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点9.3
补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到
后,将它的偏移地址存储在dx中。

assume cs:code
code segment
  start: mov ax,2000H
         mov ds,ax
         mov bx,0

s:      mov cl,[bx]
        mov ch,0
        (inc cx 或 add cx,1)   ;填空
        inc bx
        loop s
ok:     dec bx
        mov dx,bx
        mov ax,4c00h
        int 21h
code ends
end start
j03106
[第31楼]   [ 回复时间:2010-01-30 18:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-13 23:10
佩服啊!!!!我学了一个星期都没有悟到什么!!!!
ssguo
[第32楼]   [ 回复时间:2010-01-30 21:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
实验9
编程: 在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串'welcome to masm!'



分析:

绿色: 0 000 0 010b(二进制) 十六进制 02h
绿底红色:0 010 0 100(二进制)十六进制 24h
白底蓝色:0 111 0 001(二进制)十六进制 71h

2 程序要求在屏幕中间分别显示;
所以效果图应该这样:

***************************************************
*                                                 *                   
*                                                 *
*                                                 *
*                                                 *                                           
*                                                 *
*
*
*
*
*
*                 welcome to masm!
*                 welcome to masm!
*                 welcome to masm!
*
*
*
*
*
*
*
*                                                *
*                                                *
*                                                *
**************************************************
因为每行有80个字符,每个字符占2个字节(分别存放ASCIL码和属性,所以每行有160个字节;
所以,'welcome to masm!'共有16个字符所以需要32个字节来存放。


题目中写出:
" 显示缓冲器分为8(0-7)页地址从[B8000H - BFFFFH ,共32KB],在第0页( B8000H - B8F9FH 共占4000字节)显示缓冲区中:
偏移000H-09FH对应显示器上的第1行(80个字符占160个字节A0H个字节);
偏移0A0H-13FH对应显示器上的第2行;
偏移140H-1DFH对应显示器上的第3行;
依此类推,可知,偏移F00 - F9F 对应显示器上的第25行。"

现在,我们要把 'welcome to masm!' 写在第0页中,当然也可写在其它页(0 - 7 )页都可以

现在我们要写在第0页中。第0页地址从  B8000H - B8F9FH 共占4000字节而我们的需要把三行写到40000个字节的中间!
所以这个起始地址为 (4000-3*160)/2=1760 ==> 1760+(160-32)/2=1824 = 720H + B8000H = B8720H
地址为:B8720H 段地址表示为: B872H:0000H


现在可以开始写代码:

assume cs:code,ds:data

data segment
db 'welcome to masm!'
data ends

code segment

start:  mov ax,data    
     mov ds,ax
    
     mov ax,0B872H
     mov es,ax
      
     mov di,0
     mov si,0
     mov cx,16

s:   mov al,[di]   ;循环16次把welcome to masm!复制到3行
     mov es:[si],al
     mov es:[si+0A0H],al
     mov es:[si+140H],al
     add si,2
     inc di
     loop s

              
     mov si,1
     mov cx,16

s0:  mov al,02h   ;循环16次修改它们的色彩属性
     mov es:[si],al

     mov al,24h
     mov es:[si+0A0H],al

     mov al,71h
     mov es:[si+140H],al
     
     add si,2
     loop s0

     mov ax,4c00h
     int 21h
code ends
end start
qiangzi
[第33楼]   [ 回复时间:2010-01-30 22:56 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
楼主的速度实在佩服,做免杀。。。。。这事低调啊,呵呵
ssguo
[第34楼]   [ 回复时间:2010-01-30 23:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点10.1

补全程序,实现从内存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,________
       push ax
       mov ax,_________
       push ax
       retf
code ends
end start

答:  mov ax,1000h
     mov ax,0000h


检测点10.2 下面的程序执行后,ax中的数值为多少?
内存地址    机器码    汇编指令
1000:0      b8 00 00  mov ax,0
1000:3      e8 01 00  call s
1000:6      40        inc ax
1000:7      58        s:pop ax

答: ax=0006H


检测点10.3 
下面的程序执行后,ax中的数值为多少?
内存地址    机器码             汇编指令
1000:0      b8 00 00           mov ax,0
1000:3      9a 09 00 00 10     call far ptr s
1000:8      40                 inc ax
1000:9      58                 s:pop ax
                               add ax,ax
                               pop bx
                               add ax,bx
答 1006





检测点10.4
下面的程序执行后,ax中的数值为多少?
内存地址       机器码      汇编指令
1000:0         b8 06 00    mov ax,6
1000:2         ff d0       call ax
1000:5         40          inc ax
1000:6                     mov bp,sp
                          add ax,[bp]



答000BH
ssguo
[第35楼]   [ 回复时间:2010-01-31 01:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-27 01:57
检测点10.5
(1)下面的程序执行后,ax中的数值为多少?(注意:用call指令的原理来分析,不要在Debug
中单步跟踪来验证你的结论。对于此程序,在Debug中单步跟踪的结果,不能代表CPU的实际执

行结果。)
assume cs:code

stack segment
dw 8 dup (0)
stack ends

code segment
start:  mov ax,stack
        mov ss,ax
        mov sp,16

        mov ds,ax
        mov ax,0
        call word ptr ds:[0EH]
        inc ax  ;假设这一行地址为hao123
        inc ax
        inc ax
        mov ax,4c00h
        int 21h
code ends
end start

分析:
CPU在把call word ptr ds:[0EH]关于指令缓冲器时,
IP=hao123(inc ax的地址)
然后执行指令call word ptr ds:[0EH]后所做的操作为:
push ip (把 地址hao123放入ds:[0EH] )
jmp ds:[0EH] ,此时IP=ds:[0EH]=hao123
此时要执行的命令为: cs:hao123 即
in ax 
in ax 
in ax
然后结束
所以,ax=3

(2)下面的程序执行后,ax和bx中的数值为多少?
assume cs:code
data segment
  dw 8 dup (0)
data ends
code segment
  start: mov ax,data
         mov ss,ax
         mov sp,16
         mov word ptr ss:[0],offset s
         mov ss:[2],cs
         call dowrd ptr ss:[0]
         nop ;地址hao123
s:       mov ax,offset s
         sub ax,ss:[0cH]
         mov bx,cs
         sub bx,ss:[0eH]
         mov ax,4c00h
         int 21h
code ends
end start

分析:
mov word ptr ss:[0],offset s ;此时ss:[0]字单元存放s的地址
mov ss:[2],cs ;此时ss:[2]字单元存放cs内容
call dowrd ptr ss:[0] ; 把cs入栈,把 ip入栈,ip=hao123 
此时ss:[0EH]=cs ss:[0CH]=hao123 sp=0CH
然后jmp ss:[0] 即跳转到 s处开始执行 
mov ax,offset s
此时 ax = s的地址
sub ax,ss:[0cH] 此时ax=1; 因为 hao123 占1字节
mov bx,cs   ;bx=cs
sub bx,ss:[0eH] ; bx=0
然后程序返回结束;
所以 ax=1 ; bx=0 ;
anywhere
[第36楼]   [ 回复时间:2010-01-31 16:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-31 11:24
强!就一个字!兴趣同好 望加我772832806
hz88988650
[第37楼]   [ 回复时间:2010-02-02 11:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-29 17:37
楼主怎么到第10章就不发了啊,我看到第7章了,一起加油,我QQ:41900439
regex
[第38楼]   [ 回复时间:2010-02-04 16:13 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
贴主对自己的要求太严格啦, 个人认为, 没有一定的基础学汇编, 要花很长一段时间才能掌握的,
我打算用一年的时间来学这本书。⊙﹏⊙b汗,
likeineedyou
[第39楼]   [ 回复时间:2010-02-06 17:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-01 17:27
估计lz 最近太忙了
amfk2006
[第40楼]   [ 回复时间:2010-02-14 02:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-08 14:21
相信他能坚持
xzlt21
[第41楼]   [ 回复时间:2010-02-17 21:08 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-02-17 09:42
强!太严格啦!一起加油,我QQ:631957202 我刚入门!- -!!~\(^o^)/~
mgf1988629
[第42楼]   [ 回复时间:2010-02-17 23:37 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:2
注册日期:2009-11-30 11:46
加油啊!加你们
xzlt21
[第43楼]   [ 回复时间:2010-02-19 22:29 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-02-17 09:42
分析的很专业!不会的可以看看就会了!可惜后面没更新!
lishuhai
[第44楼]   [ 回复时间:2010-02-21 14:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-10 15:20
期待中...
xiaomao3166
[第45楼]   [ 回复时间:2010-02-23 15:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-19 18:15
mov ax,62627  AX= 62627 F4A3 
为什么我用DEBUG的-A命令输入这指令会出错?
my_rone
[第46楼]   [ 回复时间:2010-03-01 10:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-30 21:15
我顶你!
my_rone
[第47楼]   [ 回复时间:2010-03-01 10:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-30 21:15
我来监你哈~~
sparkl
[第48楼]   [ 回复时间:2010-03-01 14:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-23 12:51
lz继续啊,又一个星期过去了。
denger2010
[第49楼]   [ 回复时间:2010-03-08 13:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-08 13:38
我打算两个月学完它,大家一起加油吧
sb123
[第50楼]   [ 回复时间:2010-03-10 09:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-06 07:47
1
sb123
[第51楼]   [ 回复时间:2010-03-10 09:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-06 07:47
还以为是什么天才,又是一个自欺欺人的人~如果你真的3-2天就可以学完第10章还要把每一章的作业都完成了还有有这么多闲时间上来灌水~不要说什么要理解什么要消化~我想你是纯粹上来炫耀吧!
phoenixbsd
[第52楼]   [ 回复时间:2010-03-10 12:11 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:0
注册日期:2010-03-04 13:34
我觉得此贴回复比平常帖子多些,缘由在于楼主的标题,标题的重点有个时限,那就是两个星期,吸引大家进来观阅,各种心态的都有,有钦佩的,有怀疑,有纯粹看看的。

个人以为,如果在程式设计方面只是初学,那么二个星期完成就比较难了,也许有,那即是天赋过人,当然参照小弟我来说的;但如果对高级语言等程式设计比较纯熟,,只是汇编没什么基础,那么有一些知识就不必重复去掌握,学习汇编的过程已有的知识可以互相印证,学习比较快,也是正常的,加之此书难度较其余同类书籍低些(非贬低,实则入门之神器),二个星期也并非无可能,只是理解程度还看自己造化。

其实,并非要拘泥二个星期这个字眼,也不一定要死抠二个星期能否完成,楼主有信心与决心那就是好的起点,至于能否二个星期完成,并不重要,至于大家看楼主的结果,其实也无太大意义,于自己的学习也无助益,大家说是不是这样。
cswxzx
[第53楼]   [ 回复时间:2010-06-24 23:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-24 23:35
实验五 第1小题
1 将下面的程序编译连接,用Debug加载,跟踪,然后回答问题。
assume cs:code,ds:data,ss:stack
data segment
   dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
   dw 0,0,0,0,0,0,0,0
stack ends

code segment

start: mov ax,stack
       mov ss,ax
       mov sp,16

       mov ax,data
       mov ds,ax
       
       push ds:[0]
       push ds:[2]
       pop ds:[2]
       pop ds:[0]

       mov ax,4c00h
       int 21h
code ends
end start

下面是debug中的过程
一,开始加载,用r查看如下
-r
AX=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B3C  ES=0B3C  SS=0B4C  CS=0B4E  IP=0000   NV UP EI PL NZ NA PO NC
0B4E:0000 B84D0B        MOV     AX,0B4D
-


二,U命令查看
-u
0B4E:0000 B84D0B        MOV     AX,0B4D
0B4E:0003 8ED0          MOV     SS,AX
0B4E:0005 BC1000        MOV     SP,0010
0B4E:0008 B84C0B        MOV     AX,0B4C
0B4E:000B 8ED8          MOV     DS,AX
0B4E:000D FF360000      PUSH    [0000]
0B4E:0011 FF360200      PUSH    [0002]
0B4E:0015 8F060200      POP     [0002]
0B4E:0019 8F060000      POP     [0000]
0B4E:001D B8004C        MOV     AX,4C00
-

三, 执行到 mov ax,4c00h 前

-t

AX=0B4C  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B4C  ES=0B3C  SS=0B4D  CS=0B4E  IP=001D   NV UP EI PL NZ NA PO NC
0B4E:001D B8004C        MOV     AX,4C00
-


四, data段中的内容
-t

AX=0B4C  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B4C  ES=0B3C  SS=0B4D  CS=0B4E  IP=001D   NV UP EI PL NZ NA PO NC
0B4E:001D B8004C        MOV     AX,4C00

-d 0b4c:0000 f
0B4C:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09   #.V.............
-




问题:
1) CPU执行程序,程序返回前,data段中的数据为多少?
0B4C:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09

2) CPU执行程序,程序返回前,cs=0B4E  ss=0B4D ds=0B4C

3) 设程序加载后,code段的段地址为X,则data段的段地址为X-12, stack段的段地址为X-2
------------------
回复:第3个问题是不是错了啊?data段的段地址是不是X-2,stack段的地址为X-1?
cswxzx
[第54楼]   [ 回复时间:2010-06-24 23:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-24 23:35
不好意思,是我理解错了。
设程序加载后,code段的段地址为X,则data段的段地址为X-12, stack段的段地址为X-2是正确的。
masmaster
[第55楼]   [ 回复时间:2010-06-25 10:19 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
快半年啦, LZ的进度很慢哟~~
asm99
[第56楼]   [ 回复时间:2010-06-27 00:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-26 23:58
楼主消失了?
sxtyxy
[第57楼]   [ 回复时间:2010-06-27 13:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-27 12:33
楼主不会放弃吧!
heiok.com
[第58楼]   [ 回复时间:2010-06-27 20:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
估计被免杀了....呵
mess
[第59楼]   [ 回复时间:2010-06-28 14:46 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
百度: 
免杀,也就是反病毒(AntiVirus)与反间谍(AntiSpyware)的对立面,英文为Anti-AntiVirus(简写Virus AV),逐字翻译为“反-反病毒”,我们可以翻译为“反杀毒技术”。单从汉语“免杀”的字面意思来理解,可以将其看为一种能使病毒木马避免被杀毒软件查杀的技术。但是不得不客观地说,免杀技术的涉猎面非常广,您可以由此轻松转型为反汇编、逆向工程甚至系统漏洞的发掘等其他顶级黑客技术。
masmaster
[第60楼]   [ 回复时间:2010-06-28 14:54 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
百度: 
免杀,也就是反病毒(AntiVirus)与反间谍(AntiSpyware)的对立面,英文为Anti-AntiVirus(简写Virus AV),逐字翻译为“反-反病毒”,我们可以翻译为“反杀毒技术”。单从汉语“免杀”的字面意思来理解,可以将其看为一种能使病毒木马避免被杀毒软件查杀的技术。但是不得不客观地说,免杀技术的涉猎面非常广,您可以由此轻松转型为反汇编、逆向工程甚至系统漏洞的发掘等其他顶级黑客技术。
------------------
回复:
免杀,就是避免被杀的意思吧, 看来LZ要做病毒呀~
z60107983
[第61楼]   [ 回复时间:2010-06-30 21:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-25 20:23
牛人 加油 ,
如果你看到我的话, 希望你能继续完成这份心,  
大家都希望看着你完成, 不要让现实磨灭你的目标、梦想。坚持下去 ,你可以的,因为你是勇牛,
awoofa3
[第62楼]   [ 回复时间:2010-07-01 16:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-23 11:33
你的名字真帅!
byzero
[第63楼]   [ 回复时间:2010-07-06 12:14 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-07-04 09:31
免杀的涉猎貌似挺广,学好汇编不一定能够弄好免杀,没学好也不一定弄不好免杀。像特征码分析这些比较简单的,熟悉下汇编指令应该没问题,写高级壳这些可能要艰难点,最好是有免杀的基础, 再像源码免杀,这些就不只只汇编了,可能还需要其他语言。而且在免杀过程中分析杀软的杀毒方式以及查杀方法这些都是很重要的。
mengzhisuoliu
[第64楼]   [ 回复时间:2010-07-07 18:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-03 13:01
顶一下
xueyx
[第65楼]   [ 回复时间:2010-08-02 16:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-02 15:38
强人,顶
gao35ban
[第66楼]   [ 回复时间:2010-08-03 00:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-02 21:12
支持你。。。。。。。顶上。
我学习汇编是为了理解物理层面上的电气逻辑~~~~
如果有机会的话。希望可以向你学习下免杀~~~~~~~
int20
[第67楼]   [ 回复时间:2010-08-03 20:12 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-07-25 14:15
两个星期就学到第9章了?严重怀疑楼主是初学者或本贴的真实性.
cro
[第68楼]   [ 回复时间:2010-08-08 18:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-08 17:59
同学。顶你!!
masmaster
[第69楼]   [ 回复时间:2010-08-08 18:32 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
进来膜拜一下
cro
[第70楼]   [ 回复时间:2010-08-20 09:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-08 17:59
来支持一下,同免
drugker
[第71楼]   [ 回复时间:2011-01-14 09:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-26 14:46
我两天学了两章。但是觉得没看一次都会有不同的理解。。
kingkongk
[第72楼]   [ 回复时间:2011-02-09 16:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-09 09:10
楼主并没有说是没有基础,是说要学好汇编,我速度比楼主还快,一共5天,第十章,不过理解的还是有偏差,上学学过微型机原理与接口技术
ylsec
[第73楼]   [ 回复时间:2011-02-14 13:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-14 13:48
我也是哦 就是为了免杀  大家加油吧
starsli
[第74楼]   [ 回复时间:2011-02-14 21:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-04 11:49
我也正在学
fjnsae
[第75楼]   [ 回复时间:2011-02-21 20:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-11 14:42
一个月?太强悍了
顶起!
panwill300
[第76楼]   [ 回复时间:2011-03-23 15:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-07-22 10:27
每天学几个小时?
bigeq1
[第77楼]   [ 回复时间:2011-03-23 15:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-19 15:45
我倒是希望问问LZ的答案在哪里找到的,给个地址,慢慢去理解消化!
beiye1234
[第78楼]   [ 回复时间:2011-04-18 09:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-17 15:08
楼主,勇气可嘉!但不是一个好方法?学习讲究循序渐进的,看完一章弄懂一章,多加思考,越是简单的
里面蕴含的知识越多,让我们一起努力吧!呵呵    看完了几章,已经着迷了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved