鱼C论坛

 找回密码
 立即注册
查看: 3706|回复: 2

[学习笔记] 《零基础入门学习汇编语言》第四十四讲及检测点9.1

[复制链接]
发表于 2017-8-14 01:12:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2017-8-14 11:45 编辑

越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢

一、jmp far ptr 标号(段间转移,又称为远转移)

(1)指令 “jmp far ptr 标号” 功能如下:
        (CS)=标号所在段的段地址;
        (IP)=标号所在段中的偏移地址。
        far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。

(2)机器码中:EA表示远转移

(3) jmp word ptr 内存单元地址(段内转移,只改变IP)
         功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
         其实就是不改变CS,只改变IP。和JMP AX一样

(4) jmp dword ptr 内存单元地址(段间转移,改变CS和IP)
            功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
        (CS)=(内存单元地址+2)
        (IP)=(内存单元地址)
       
检测点9.1

(1)若要使jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?
程序如下。

assume cs:code

data segment
答案①db 3 dup (0)
答案②dw 2 dup (0)
答案③dd 0

data ends

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

code ends
end start

解: 因为jmp word ptr [bx+1]是字型的数据占两个字节,且取内存单元的值为[BX+1];则我们应该把[bx+1]和[bx+2]内存单元的数据赋值为零。故有上面三种答案。


(2)补全程序,使用jmp指令执行后,CS:IP指向程序的第一条指令。
程序如下。

assume cs:code

data segment
   dd 12345678h
data ends

code segment
  start: mov ax,data
         mov ds,ax
         mov bx,0
         mov [bx], bx
         mov [bx+2],cs

         jmp dword ptr ds:[0]

code ends
end start

解:
这题我们只要记住:jmp dword ptr ds:[0]为双字型数据占4个字节,且高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。(CS)=(内存单元地址+2)(IP)=(内存单元地址)。所以把[bx+2]赋值为CS,使jmp指向CS段,把[bx]赋值为零,使IP指向零也就是程序的第一条指令。


(3)
用Debug查看内存,结果如下:(因为我的2000:1000处被占用了,所以改为2000:1050;对结果不会有影响的)

2000:1000 BE 00 06 00 00 00 ......

则此时,CPU执行指令:
mov ax,2000h
mov es,ax
jmp dword ptr es:[1000h]

理论上答案应该为:(cs)= 0006H ,(ip)= 00BEH
因为高位存放段地址(后2个字节为高位),低位存放偏移地址(前2个字节为低位)
(cs)=(内存单元地址+2),(ip)=(内存单元地址)

但是我用自己用DEBUG单步实现,发现CS没有发生变化,只有IP变成00BE了。见下图:

这是还没有开始运行前的:CS为000AH,IP为0000H

3.PNG

程序执行了以后,CS还是000AH,IP正常变化为00BEH。

4.PNG

原因我看答案说的是:
jmp dword ptr es:[1000H]对应的debug下的指令并不是你给出的
jmp dword ptr 2000:[1000H]这样的形式,可以看出,当你写出上述指令后,运行的时候其指令仅仅变成了jmp 1000,缺少了一个指定段地址的指令。
也就是说在debug模式下,debug根本就不认识jmp dword ptr 2000:[1000H]这样的形式。


谢谢小甲鱼带来的视频教程,感谢!!


   
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢

评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-15 13:27:55 | 显示全部楼层
assume cs:codesg
codesg segment
               start: mov ax,2000h
                       mov es,ax
                       mov bx,1000h
                       mov word ptr es:[2],es
                       jmp dword ptr es:[bx]
codesg ends
end start

用这个源程序也可以调出CS IP的目的地址和目的偏移地址
CS:IP  0006:00BE
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-24 11:00:42 | 显示全部楼层
感谢,答案很完美
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表