鱼C论坛

 找回密码
 立即注册
查看: 4188|回复: 6

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

[复制链接]
发表于 2017-8-31 23:50:30 | 显示全部楼层 |阅读模式

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

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

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

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

一、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:[0eh]
     inc ax
     inc ax
     inc ax
     mov ax,4c00h
     int 21h
code ends
end start

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

至于为什么不能用debug:
根据单步跟踪发现,执行call word ptr ds:[0eh]指令时,显示ds:[0eh]=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:[0],offset s ;(ss:[0])=1ah
    mov ss:[2],cs                ;(ss:[2])=cs
    call dword ptr ss:[0]        ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令,也就是标号s处。
    nop
s:  mov ax,offset s              ;ax=1ah
    sub ax,ss:[0ch]              ;ax=1ah-(ss:[0ch])=1ah-19h=1
    mov bx,cs                    ;bx=cs
    sub bx,ss:[0eh]              ;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:[0]释义:首先cs入栈,然后ip=19h入栈(IP=19h是因为ip指向本条指令的下一条指令处),最后jmp到刚刚入栈的的CS:IP处,即jmp到cs:19h处执行命令。
3.后面的是一些简单计算,说一说难理解的:ss:[0eh]这个栈里放的是CS,ss:[0ch]里放的是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处执行命令了,程序结束。



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

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

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-12-11 21:40:14 | 显示全部楼层
call s.cs 不需要入栈,ip入栈.然后再跳转
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-12 17:25:43 | 显示全部楼层
weiiew 发表于 2017-12-11 21:40
call s.cs 不需要入栈,ip入栈.然后再跳转

谢谢指正已经改正过来了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-26 22:20:16 | 显示全部楼层
需要补充的是nop指令占用一个字节,取指令call dword ptr ss:[0] 会使得ip指向nop,而执行call dword ptr ss:[0] 指令会使得ip指向s,中间正好差了一个nop指令(1个字节),所以ax=1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-21 10:12:07 | 显示全部楼层
题主做题的时候是怎么获取到IP值的?。。。。根据经验计算汇编指令的长度?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 22:09:51 From FishC Mobile | 显示全部楼层
mov ax,stack怎么理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 17:49:41 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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