漠水 发表于 2014-8-21 19:40:34

如何用masm向特定地址(如cs:ip 1000:0)写入指令(如mov ax,2)

我记得小甲鱼老师在视频里说过,一时忘了在哪个视频里,找不到,他说过可以用jmp,
不用dos,dos我知道是a指令就可以了
    但是还是有点不懂,求高人指点

流行语 发表于 2014-8-21 19:40:35

assume cs:code
code segment
start:
        mov ax,2000h
        mov ds,ax
        mov bx,0h
        mov ax,cs
        mov es,ax
        mov si,offset s
        mov cx,offset s1-offset s
       
s0: mov ax,cs:
        mov ,ax
        add bx,2
        loop s0
        jmp short s1
s:mov ax,2
        mov bx,3
s1: nop
        mov ax,4c00h
        int 21h
code ends
end start
不知道你说的是不是这个。

漠水 发表于 2014-8-23 20:46:02

流行语 发表于 2014-8-22 13:36
不知道你说的是不是这个。

多谢高手给力哈

漠水 发表于 2014-8-23 20:48:39

以下是我看了程序之后的一点注解,请各位大神指导一下对错
assume cs:code
code segment
start:
      mov ax,2000h   ;ax =2000
      mov ds,ax      ;ds=2000(段地址)
      mov bx,0h         ;bx=0
      mov ax,cs      ;ax=cs (当前程序段地址)
      mov es,ax      ;es=cs(将程序段地址存入附加段中)
      mov si,offset s   ;(将si的值等于我们所要存储指令s的偏移地址中)
      mov cx,offset s1-offset s;(cx=循环次数,等于所需存储的指令的字节/字所需的内存空间大小)   

s0: mov ax,cs:         ;(将cs:中的数据存入ax中,即将所需要存储的数据存入20000H,20002H)
      mov ,ax         ;(bx=程序段偏移地址)
      add bx,2             ;(bx=bx+2,存储下一个数据做准备)
      loop s0            ;(循环跳转到s0,因为每次只能存储2字节,所以,循环cx次,cx为16位(2字节))
      jmp short s1         ;(跳转到s1,跳过我们所需要存储的指令,因为不执行)
s:mov ax,2                ;(这里我有个疑问,mov指令是2字节,好像有的命令需要1字节或3字节这边的bx=bx+2不就有点小问题了?)
      mov bx,3
s1: nop                     ;(无操作,主要是为了offset s1-offset s)
      mov ax,4c00h      ;(中断类型为ah=4c)
      int 21h            ;(调用21号中断)
code ends
end start

流行语 发表于 2014-8-23 22:11:25

你还是没有分析数据和命令的概念。在计算机中不管什么都是用1,0来存储的,mov ax,2在计算机中也都是数据,你现在只是从偏移地址s处开始复制数据到2000:0处。把它处理成几个字节只是把计算机把它当成命令来用时,计算机自己会处理的、

漠水 发表于 2014-8-24 10:41:22

流行语 发表于 2014-8-23 22:11
你还是没有分析数据和命令的概念。在计算机中不管什么都是用1,0来存储的,mov ax,2在计算机中也都是数据, ...

我昨天后面才想通的,谢谢提醒{:9_228:}

gyixue 发表于 2014-8-24 22:11:33

都是有才的人
页: [1]
查看完整版本: 如何用masm向特定地址(如cs:ip 1000:0)写入指令(如mov ax,2)