shuiyu 发表于 2017-8-31 23:50:30

《零基础入门学习汇编语言》第四十九讲续(含检测点10.5与问题10.1)

本帖最后由 shuiyu 于 2017-12-12 17:25 编辑

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

一、call word ptr 内存单元地址
汇编语法解释:
push IP
jmp word ptr 内存单元地址


二、call dword ptr 内存单元地址
汇编语法解释:
push CS
push IP
jmp dword ptr 内存单元地址


检测点10.5

(1)下面的程序执行后,ax中的数值为多少?(不能用debug)
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:
   inc ax
   inc ax
   inc ax
   mov ax,4c00h
   int 21h
code ends
end start

解:ax=3由题目可知当执行到call时,先执行push IP 然后执行jmp word ptr ds: ;当执行push ip 时,ip=11h,sp=sp-2=ds:,因为ss=ds,故ds:=11h,所以执行jmp跳转到ip=11h内存单元,内存单元是第一个inc ax处,三次加1后,ax=3

至于为什么不能用debug:
根据单步跟踪发现,执行call word ptr ds:指令时,显示ds:=0543。ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?应该就是中断惹的祸了~~~


(2)下面的程序执行后,ax和bx中的数值为多少?

assume cs:codesg
stack segment
    dw 8 dup(0)
stack ends

codesg segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,10h
    mov word ptr ss:,offset s ;(ss:)=1ah
    mov ss:,cs                ;(ss:)=cs
    call dword ptr ss:      ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令,也就是标号s处。
    nop
s:mov ax,offset s            ;ax=1ah
    sub ax,ss:            ;ax=1ah-(ss:)=1ah-19h=1
    mov bx,cs                  ;bx=cs
    sub bx,ss:            ;bx=cs-cs=0
    mov ax,4c00h
    int 21h
codesg ends
end start

解:ax=1        bx=0
1.offset s是取标号s处的ip。
2.call dword ptr ss:释义:首先cs入栈,然后ip=19h入栈(IP=19h是因为ip指向本条指令的下一条指令处),最后jmp到刚刚入栈的的CS:IP处,即jmp到cs:19h处执行命令。
3.后面的是一些简单计算,说一说难理解的:ss:这个栈里放的是CS,ss:里放的是IP=19H(因为前面是CS先入栈IP后入的栈)。


问题10.1
程序返回前,bx中的值是多少?
assume cs:code
code segment
start:mov ax,1
        mov cx,3
        call s
        mov bx,ax       
        mov ax,4c00h
        int 21h
s:        add ax,ax
        loop s
        ret
code ends
end start

解:bx=8

PS:执行ret指令时,相当于进行:pop IP
        执行call s指令时,相当于进行:执行指令 “call 标号” ,相当于进行:
push IP
jmp near ptr 标号

分析call s和ret的过程:
执行到call s 处时跳转到标号s处执行命令。(ip入栈,ip指向下一条指令即mov bx,ax处入栈),执行完S标号处的命令后,loos s 循环3次(因为cx=3)。当第四次执行loop s时,cx=0不再循环,故往下执行ret(POP IP)。因为前面有IP入栈了.....所有IP指向mov bx,ax处执行命令了,程序结束。



谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}

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

weiiew 发表于 2017-12-11 21:40:14

call s.cs 不需要入栈,ip入栈.然后再跳转

shuiyu 发表于 2017-12-12 17:25:43

weiiew 发表于 2017-12-11 21:40
call s.cs 不需要入栈,ip入栈.然后再跳转

谢谢指正{:5_106:}已经改正过来了,谢谢

CHAOZHANG283 发表于 2018-9-26 22:20:16

需要补充的是nop指令占用一个字节,取指令call dword ptr ss: 会使得ip指向nop,而执行call dword ptr ss: 指令会使得ip指向s,中间正好差了一个nop指令(1个字节),所以ax=1

徒手拆高达 发表于 2019-8-21 10:12:07

题主做题的时候是怎么获取到IP值的?。。。。根据经验计算汇编指令的长度?

可卿救我 发表于 2019-8-22 22:09:51

mov ax,stack怎么理解

XT孓珏 发表于 2020-2-20 17:49:41

打卡
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第四十九讲续(含检测点10.5与问题10.1)