目录
- 1、下面的程序执行后,ax中的数值为多少?
- 2、下面的程序执行后,ax和bx中的数值为多少?
正文
1、下面的程序执行后,ax中的数值为多少
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:[0H]
inc ax
inc ax
inc ax
mov ax, 4c00h
int 21h
code ends
end start
解答
- 1、先指出每个指令
IP
寄存器的值
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax, stack ; IP:0000
mov ss, ax ; IP:0003
mov sp, 16 ; IP:0005
mov ds, ax ; IP:0008
mov ax, 0 ; IP:000A
call word ptr ds:[0EH] ; IP:000C
inc ax ; IP:0011
inc ax ; IP:0012
inc ax ; IP:0013
mov ax, 4c00h
int 21h
code ends
end start
- 2、在执行
call word ptr ds:[0H]
的之前,栈空间的值为下
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- 3、在执行
call word ptr ds:[0H]
的时候,做了以下两步操作
push IP
jmp word ptr ds:[0EH]
push IP
00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00
jmp word ptr ds:[0EH]
ds 就是指向 stack
ds:[0EH] 就是指向的 stack:[0EH]对应的值,也就是 0011
- 4、最终也就是让 IP指向0011的位置。就是inc ax,继续执行代码。所以ax = 0003
2、下面的程序执行后,ax和bx中的数值为多少?
assume cs:code
data segment
dw 8 dup (0)
data ends
code segment
start:
mov ax, data
mov ss, ax
mov sp, 16
mov word ptr ss:[0], offset s
mov ss:[2], cs
call dword ptr ss:[0]
nop
s:
mov ax, offset s
sub ax, ss:[0CH]
mov bx, cs
sub bx, ss:[0EH]
mov ax, 4c00h
int 21h
code ends
end start
解析前先了解一下常见指令占用多少个字节
- 1、
mov ax, data
占用3
个字节。data是数据段、栈段也就是内存地址,跟立即数一样的结果。
内存地址只能对以下寄存器直接赋值:
ax、bx、cx、dx、sp、bp、si、di
2、
mov ss, ax
, 对寄存器直接赋值的, 占用2
个字节。3、
mov sp, 16
占用3个
字节。
立即数只能对以下寄存器直接赋值:
ax、bx、cx、dx、sp、bp、si、di
-
4、
mov word ptr ss:[0], offset s
占用7
个字节。小于255是1个字节
mov ss:[0], 16
1、立即数16,小于256,所以是占用1个字节,机器码为:10
2、偏移地址:[3]占用2个字节,机器码为: 0300
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用5个字节
mov ss:[0], 16
大于255且小于65535是2个字节
mov ss:[0], 256
1、立即数256,大于255且小于65535,所以是占用2个字节,机器码为:0100
2、偏移地址:[0]占用2个字节,机器码为: 0000
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用7个字节
mov ss:[0], 256
那么如果小于256,如何让立即数占用2个字节呢?
mov word ptr ss:[0],16
1、立即数16,小于256,所以是占用1个字节,但是有指令word ptr,所以是占用2个字节
2、偏移地址:[0]占用2个字节,机器码为: 0000
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用7个字节
mov word ptr ss:[0],16
- 5、
mov ss:[2], cs
,其中cs
如果是bx
、cx
、dx
、ds
、ss
,都是占用5
个字节。
1、偏移地址:[2]占用2个字节,最大值为65535,机器码为: 0002
2、总共占用5个字节
mov ss:[2], cs
- 6、注意:
mov ss:[2], ax
,占用的是4
个字节
mov ss:[2], ax
答案分析
- 1、先把对应IP的值写上
assume cs:code
data segment
dw 8 dup (0)
data ends
code segment
start:
mov ax, data ; IP:0000
mov ss, ax ; IP:0003
mov sp, 16 ; IP:0005
mov word ptr ss:[0], offset s ; IP:0008
mov ss:[2], cs ; IP:000F
call dword ptr ss:[0] ; IP:0014
nop ; IP:0019
s:
mov ax, offset s ; IP:001A
sub ax, ss:[0CH] ; IP:001D
mov bx, cs ; IP:0022
sub bx, ss:[0EH] ; IP:0024
mov ax, 4c00h
int 21h
code ends
end start
- 2、假如data对应的内存为
0710H
, 那么CS对应的内存0711H
assume cs:code
data segment
dw 8 dup (0)
// 0710:0000内存空间: 00 00 00 00 | 00 00 00 00| 00 00 00 00 | 00 00 00 00
data ends
code segment
start:
mov ax, data // ax = 0710H
mov ss, ax // ss = 0710H
mov sp, 16 // sp = 16
mov word ptr ss:[0], offset s
// 0710:0000内存空间: 1A 00 00 00 | 00 00 00 | 00 00 00 00 | 00 00 00 00
mov ss:[2], cs
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00
call dword ptr ss:[0]
// IP : 0CH
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00 | 00 00 11 07
// 1、先把CS的值0711H,push到栈中,SP = 0EH
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00| 00 00 11 07
// 2、再把IP的值0019,push到栈中,SP = 0CH
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00| 19 00 11 07
// 3、dword ptr ss:[0] 对应的是 001A,jmp 0711:001A
// CS = 0711, IP: 001A
// 4、也就是直接执行到 mov ax, offset s 指令
nop
s:
mov ax, offset s
; ax = 001AH
sub ax, ss:[0CH]
// ss:[0CH] = 0019
// ax = 001AH - 0019H = 0001H
mov bx, cs
// bx = 0711H
sub bx, ss:[0EH]
// ss:[0EH] = 11H
// bx = 0711H - 0711H = 0000H
mov ax, 4c00h
int 21h
code ends
end start