执行MOV DS,AX 后为什么IP会变?
作者&投稿:干扶 (若有异议请与网页底部的电邮联系)
MOV DS,AX 是数据传送指令,意思是将寄存器AX的内容传送给寄存器DX。
……
jmp word ptr [bx+1]
……
jmp dword ptr ds:[0]
……
都是间接转移。是以存储单元的内容,当做目标地址。
而指令指定的存储单元,其内容,就是“程序的第一条指令”的地址。
IP(instruction pointer)是指令指针寄存器,是一个16位寄存器,用来存放代码段中的偏移地址。他与CS连用才能确定下一条指令的地址,根据这一地址,控制器从指定的存储器中,取出下一条要执行的指令,并修改IP,以便指向下一条要执行的指令。这样就能达到自动执行下去的目的了。
所以,每次执行一条指令,IP的值都会变,但也有特殊情况:原地转移(执行JMP $语句
),进入死循环,这时IP就不会变了。
一般来说,每执行一条指令,IP,都会变化。
只有执行:JMP $,即原地转移的指令,IP,才不会变。
每执行一行代码 IP值都会变 IP=(IP+代码对应机器码长度)
不然程序怎么往下执行
聂中双黄: 这题很简单啊. mov ax,0100h指的是把立即数0100h传给寄存器ax,此时ax=0100h.接着下一条指令 mov ax,[0100]指的是把偏移地址为0100的内存单元中的内容传给ax,由于段地址存放在DS中,所以段地址为1000h,那么这个内存单元的物理地址为1000h*16+0100h=10100h,其内容为20h. 但由于ax是16位寄存器,ax分为al和ah两个8位寄存器,而一个内存单元的内容只能是8位,所以al=20h. 接下来这个内存单元的下一个单元(10101)的内容10h会传给ah. 合起来ax=1020h.
黔西南布依族苗族自治州17713159768: 微机原理中DS=6000H,SI=1200H,执行指令:MOV AX,[SI,执行结果为什么是AX=3344H?
聂中双黄: 这道题你条件没有给全 应该有存储单元61200H=44H,61201H=33这两个条件吧 这是一道寻址的问题,MOV AX,[SI] 这传送的[SI]不是指SI寄存器里面的内容了,而是寄存器中地址所指向的内容 段基址为6000H,偏移地址(si里面的内容)=1200H 所以是传送存储单元61200H的数据给AX 61200H单元的数据给AL,61201H单元的数据给AH 这是很基础的题目啦..你要多看书啊
黔西南布依族苗族自治州17713159768: 关于汇编语言MOV指令的问题? - ?
聂中双黄: MOV AX,DS是把数据段的段地址取到AX中,后面应该有把AX再送其他段寄存器,这样,指向同一段地址.MOV AH,DS,这是错误指令,AH是八位的,不能送十六位的数.MOV DS,AX 把AX里面的数据赋到DS,前面应该有取段地址给AX,经过AX初始化DS.
黔西南布依族苗族自治州17713159768: MOV AX,DATAS MOV DS,AX 这两句是什么意思? - ?
聂中双黄: mov ax, datas ;将伪段地址放入ax中,datas不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先其地相放入到ds中,但是内存数不能放入段地址.所以 mov ds,ax ;就是将段地址装入段寄存器,最终达到了段地址装入段寄存器的目的!在80X86中规定,内存数不可以直接装入段寄存器,所以才会有这样的一次中转! datas不是指令字,而是伪指令,实际上你可以理解他为一个标签,将这个标签装入AX中,实际装入的就是数据段的首地址!指令与伪指令的区别在在于,指令是属性指令集(属于CPU的),而伪指令则是属于编译软件的,扫描后由编译软件进行的操作.
黔西南布依族苗族自治州17713159768: 在汇编语言的串操作中, MOV DI, DS MOV ES, DI 这两条指令到底有什么作用? - ?
聂中双黄: (1)这两条指令没有上下文的情况下,无法为您判断它们的实际意义.看不出与串操作有什么直接关系.在串操作中,一般是将两个串分别放在DS:SI和ES:DI寻址的内存单元中,以方便于串的比较、移动等操作.(2)mov si,ds指令的意义是:将数...
黔西南布依族苗族自治州17713159768: 汇编语言 问题如下 - ?
聂中双黄: 1: ds是段寄存器,不能直接对其赋值,只能中转.这里是用ax寄存器做的中转,这两句执行之后,ds=1,. 2:mov ax,[0]是 mov ax,ds:[0]的缩写(默认为ds寄存器,可省略)当ds=1时,则结果是2662(mov ax,[0000+ds*10])
黔西南布依族苗族自治州17713159768: 汇编语言 设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:麻烦高手 不要只写个结果 - ?
聂中双黄: ;假设多字节数据存放为小端序(little endian) mydata segment ORG 100H VARW DW 1234H,5678H ;100H~103H,存放内容依次为34H, 12H, 78H, 56H VARB DB 3,4 ;104H~105H,存入内容依次为03H, 04H AGLIN 4 ;地址按4字节对齐,那...
黔西南布依族苗族自治州17713159768: 下列汇编代码的MOV AX,DSEG是什么意思,操作后AX发生了什么变化,请解释一下 - ?
聂中双黄: 编程时,可以编写许多、许多的段,如:DSEG SEGMENT、CSEG....在操作系统管理下,执行本程序时,操作系统,在存储器中,安排了这些段.需要用这些段地址,设定 DS、SS、ES.MOV AX,DSEG MOV DS,AX 这两句,就是把操行系统安排给 DSEG 的地址,送到 DS.
黔西南布依族苗族自治州17713159768: 汇编问题:"mov ax,ds:[0]"该命令会不会报错呢?ax是一个字单元,ds:[0]是一个字节型数据 - ?
聂中双黄: 不会报错,因为这条指令语法上正确.ds:[0]只是给出了内存的地址,并没有限定内存单元是字还是字节.由于前面AX是16位的寄存器,所以汇编程序可以认定这是一条字传送指令.仅在无法判别数据类型时,汇编才会报错.比如:mov ds:[0], 12H 这一条指令,后面的12H可能是8位也可能是16位,汇编时就会报告错误了.这时,必须在存储单元前面加上 byte ptr或者word ptr才行.如果你要执行8位数据传送,必须写 mov al, ds:[0] 如果你要执行16位数据传送,必须写 mov ax, ds:[0] 若错用,因为语法都正确,汇编程序不会报错,但算法结果会是错的.
黔西南布依族苗族自治州17713159768: 为什么汇编语言mov[0],ax错误 - ?
聂中双黄: 这个指令中,方括号中的内容只能是一个寄存器,而不能是一个立即数.所以这个语句会提示错误,如果要寻址:ds:0000 的话可以先给一个寄存器赋值,再在这个语句的方括号中输入这个寄存器.若是要给ax寄存器赋值0可以直接用立即寻址方式,语句为:MOV AX,0. 望采纳!