如何用masm向特定地址(如cs:ip 1000:0)写入指令(如mov ax,2)
我记得小甲鱼老师在视频里说过,一时忘了在哪个视频里,找不到,他说过可以用jmp,不用dos,dos我知道是a指令就可以了
但是还是有点不懂,求高人指点
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-22 13:36
不知道你说的是不是这个。
多谢高手给力哈 以下是我看了程序之后的一点注解,请各位大神指导一下对错
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
你还是没有分析数据和命令的概念。在计算机中不管什么都是用1,0来存储的,mov ax,2在计算机中也都是数据,你现在只是从偏移地址s处开始复制数据到2000:0处。把它处理成几个字节只是把计算机把它当成命令来用时,计算机自己会处理的、 流行语 发表于 2014-8-23 22:11
你还是没有分析数据和命令的概念。在计算机中不管什么都是用1,0来存储的,mov ax,2在计算机中也都是数据, ...
我昨天后面才想通的,谢谢提醒{:9_228:} 都是有才的人
页:
[1]