一道题目,想很久没想出来结果
STACK SEGMENT AT 3000HSTA DW 32 DUP(?)
TOP EQU $-STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
START:
MOV AX,STACK
MOV SS,AX
MOV SP,TOP
XOR AL,AL
INC AL
MOV BX,0FFFFH
CALL SUB1
X1:
ADD AL,BL
X2:
MOV BL,AL
HLT
SUB1 PROC NEAR
MOV BX,OFFSET X2
PUSH BX
RET
SUB1 ENDP
CODE ENDS
END START
题目要求:画出堆栈最满时各单元的地址和内容;并写出程序执行完毕后,SP和AL的值 https://www.exam100.net/uploadfile/2021/1203/20211203111927609.png https://www.exam100.net/uploadfile/2021/1203/20211203111930583.png STACK SEGMENT AT 3000H;这应该是告诉段开始的位置在3000H
STA DW 32 DUP(?);定义了32个字的空间
TOP EQU $-STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
START:
MOV AX,STACK
MOV SS,AX
MOV SP,TOP
XOR AL,AL;AL=0FFH
INC AL;AL=00H
MOV BX,0FFFFH;BX=0FFFFH
CALL SUB1;转去执行SUB1
X1:
ADD AL,BL;由于段内偏移地址BX入栈了,那么这里BX=0FFFFH,AL=0FFH
X2:
MOV BL,AL
HLT
SUB1 PROC NEAR
MOV BX,OFFSET X2;获取X2的段内偏移地址给BX
PUSH BX;BX入栈保存
RET ;返回继续执行
SUB1 ENDP
CODE ENDS
END START 汇编吗这是 Gacy 发表于 2022-4-13 15:50
汇编吗这是
36题确实是汇编,没错 1. 最满是什么意思?
就是堆栈中保存的内容最多的那一次?
这个 “各单元” 指的是什么?
是要堆栈中有效数据的地址和内容,还是32个dw都要?
堆栈中只有两个数据,一个是 0x12,另一个是 0x14
其他空间全部没有使用
0x0000000000030000 <bogus+ 0>: 0x8955 0x50e5 0x0651 0x8b57 0x0a4e 0x09e3 0x7ec4 0x8a06
0x0000000000030010 <bogus+ 16>: 0x0446 0xf3fc 0x5faa 0x5907 0x5d58 0x55c3 0xe589 0x0651
0x0000000000030020 <bogus+ 32>: 0x1e57 0x8b56 0x0c4e 0x09e3 0x7ec4 0xc504 0x0876 0xf3fc
0x0000000000030030 <bogus+ 48>: 0x5ea4 0x5f1f 0x5907 0xc35d 0x8955 0x51e5 0x0014 0x0012
2. 这个程序可以执行完?
执行完是什么意思?这个程序可以返回给dos操作系统?
hlt指令要配合cli指令的话,可以认为是执行到这里就完成了,但是这个程序只有一个hlt指令
hlt指令执行后,一段时间之后程序会醒过来继续执行hlt后面的指令
这个程序不会执行完成
你非要认为执行了hlt指令后就算是执行完成的话
al 中的值一直都是 1
sp 执行到 hlt 的位置,sp 的值是 0x3e
rax: 00000000_00043001
rbx: 00000000_00000001
rcx: 00000000_0009001c
rdx: 00000000_00000000
rsp: 00000000_0000003e
下面是调试过程
========================================================================
Bochs x86 Emulator 2.7
Built from SVN snapshot on August1, 2021
Timestamp: Sun Aug1 10:07:00 CEST 2021
========================================================================
00000000000i[ ] BXSHARE not set. using compile time default '/usr/share/bochs'
00000000000i[ ] reading configuration from bochsrc
00000000000e[ ] bochsrc:16: ataX-master/slave CHS set to 0/0/0 - autodetection enabled
00000000000i[ ] installing x module as the Bochs GUI
00000000000i[ ] using log file /dev/null
Next at t=0
(0) f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0
<bochs:1> c
^CNext at t=2308337481
(0) f000:51ca (unk. ctxt): ret ; c3
<bochs:2> b 0x11aa:0x0000
<bochs:3> c
(0) Breakpoint 1, 0x0000000000011aa0 in ?? ()
Next at t=2370828743
(0) 11aa:0000 (unk. ctxt): mov ax, 0x3000 ; b80030
<bochs:4> s
Next at t=2370828744
(0) 11aa:0003 (unk. ctxt): mov ss, ax ; 8ed0
<bochs:5>
Next at t=2370828745
(0) 11aa:0005 (unk. ctxt): mov sp, 0x0040 ; bc4000
<bochs:6>
Next at t=2370828746
(0) 11aa:0008 (unk. ctxt): xor al, al ; 32c0
<bochs:7>
Next at t=2370828747
(0) 11aa:000a (unk. ctxt): inc al ; fec0
<bochs:8>
Next at t=2370828748
(0) 11aa:000c (unk. ctxt): mov bx, 0xffff ; bbffff
<bochs:9>
Next at t=2370828749
(0) 11aa:000f (unk. ctxt): call .+5(0x00011ab7) ; e80500
<bochs:10> s
Next at t=2370828750
(0) 11aa:0017 (unk. ctxt): mov bx, 0x0014 ; bb1400
<bochs:11>
Next at t=2370828751
(0) 11aa:001a (unk. ctxt): push bx ; 53
<bochs:12>
Next at t=2370828752
(0) 11aa:001b (unk. ctxt): ret ; c3
<bochs:13>
Next at t=2370828753
(0) 11aa:0014 (unk. ctxt): mov bl, al ; 8ad8
<bochs:14>
Next at t=2370828754
(0) 11aa:0016 (unk. ctxt): hlt ; f4
<bochs:15> reg
CPU0:
rax: 00000000_00043001
rbx: 00000000_00000001
rcx: 00000000_0009001c
rdx: 00000000_00000000
rsp: 00000000_0000003e
rbp: 00000000_00000000
rsi: 00000000_000e0000
rdi: 00000000_00000000
r8 : 00000000_00000000
r9 : 00000000_00000000
r10: 00000000_00000000
r11: 00000000_00000000
r12: 00000000_00000000
r13: 00000000_00000000
r14: 00000000_00000000
r15: 00000000_00000000
rip: 00000000_00000016
eflags 0x00007202: id vip vif ac vm rf NT IOPL=3 of df IF tf sf zf af pf cf
<bochs:16> x/32hx 0x3000:0x0000
:
0x0000000000030000 <bogus+ 0>: 0x8955 0x50e5 0x0651 0x8b57 0x0a4e 0x09e3 0x7ec4 0x8a06
0x0000000000030010 <bogus+ 16>: 0x0446 0xf3fc 0x5faa 0x5907 0x5d58 0x55c3 0xe589 0x0651
0x0000000000030020 <bogus+ 32>: 0x1e57 0x8b56 0x0c4e 0x09e3 0x7ec4 0xc504 0x0876 0xf3fc
0x0000000000030030 <bogus+ 48>: 0x5ea4 0x5f1f 0x5907 0xc35d 0x8955 0x51e5 0x0014 0x0012
<bochs:17> s
Next at t=2370828755
(0) 11aa:0017 (unk. ctxt): mov bx, 0x0014 ; bb1400
<bochs:18> s
Next at t=2371540006
(0) 04b3:1924 (unk. ctxt): cli ; fa
<bochs:19> u/10
0000000000006454: ( ): cli ; fa
0000000000006455: ( ): cmp word ptr cs:0x23b0, 0x0000 ; 2e833eb02300
000000000000645b: ( ): jnz .+16(0x0000646d) ; 7510
000000000000645d: ( ): inc byte ptr cs:0x23ba ; 2efe06ba23
0000000000006462: ( ): callf cs:0x23c8 ; 2eff1ec823
0000000000006467: ( ): dec byte ptr cs:0x23ba ; 2efe0eba23
000000000000646c: ( ): iret ; cf
000000000000646d: ( ): push ax ; 50
000000000000646e: ( ): push es ; 06
000000000000646f: ( ): mov es, word ptr cs:0x1921 ; 2e8e062119
<bochs:20> n
Next at t=2371540007
(0) 04b3:1925 (unk. ctxt): cmp word ptr cs:0x23b0, 0x0000 ; 2e833eb02300
<bochs:21> n
Next at t=2371540008
(0) 04b3:192b (unk. ctxt): jnz .+16(0x0000646d) ; 7510
<bochs:22>
Next at t=2371540009
(0) 04b3:192d (unk. ctxt): inc byte ptr cs:0x23ba ; 2efe06ba23
<bochs:23>
Next at t=2371540010
(0) 04b3:1932 (unk. ctxt): callf cs:0x23c8 ; 2eff1ec823
<bochs:24>
Next at t=2371540266
(0) 04b3:1937 (unk. ctxt): dec byte ptr cs:0x23ba ; 2efe0eba23
<bochs:25>
Next at t=2371540267
(0) 04b3:193c (unk. ctxt): iret ; cf
<bochs:26>
Next at t=2371540268
(0) 11aa:0017 (unk. ctxt): mov bx, 0x0014 ; bb1400
<bochs:27> n
Next at t=2371540269
(0) 11aa:001a (unk. ctxt): push bx ; 53
<bochs:28>
Next at t=2371540270
(0) 11aa:001b (unk. ctxt): ret ; c3
<bochs:29>
Next at t=2371540271
(0) 11aa:0014 (unk. ctxt): mov bl, al ; 8ad8
<bochs:30>
Next at t=2371540272
(0) 11aa:0016 (unk. ctxt): hlt ; f4
<bochs:31> s
Next at t=2371540273
(0) 11aa:0017 (unk. ctxt): mov bx, 0x0014 ; bb1400
<bochs:32> s
Next at t=2371580004
(0) 04b3:1924 (unk. ctxt): cli ; fa
<bochs:33> n
Next at t=2371580005
(0) 04b3:1925 (unk. ctxt): cmp word ptr cs:0x23b0, 0x0000 ; 2e833eb02300
<bochs:34>
Next at t=2371580006
(0) 04b3:192b (unk. ctxt): jnz .+16(0x0000646d) ; 7510
<bochs:35>
Next at t=2371580007
(0) 04b3:192d (unk. ctxt): inc byte ptr cs:0x23ba ; 2efe06ba23
<bochs:36>
Next at t=2371580008
(0) 04b3:1932 (unk. ctxt): callf cs:0x23c8 ; 2eff1ec823
<bochs:37>
Next at t=2371580253
(0) 04b3:1937 (unk. ctxt): dec byte ptr cs:0x23ba ; 2efe0eba23
<bochs:38>
Next at t=2371580254
(0) 04b3:193c (unk. ctxt): iret ; cf
<bochs:39>
Next at t=2371580255
(0) 11aa:0017 (unk. ctxt): mov bx, 0x0014 ; bb1400
<bochs:40> n
Next at t=2371580256
(0) 11aa:001a (unk. ctxt): push bx ; 53
<bochs:41>
Next at t=2371580257
(0) 11aa:001b (unk. ctxt): ret ; c3
<bochs:42>
Next at t=2371580258
(0) 11aa:0014 (unk. ctxt): mov bl, al ; 8ad8
<bochs:43>
Next at t=2371580259
(0) 11aa:0016 (unk. ctxt): hlt ; f4
<bochs:44>
人造人 发表于 2022-4-14 16:11
1. 最满是什么意思?
就是堆栈中保存的内容最多的那一次?
这个 “各单元” 指的是什么?
大佬,您能给个联系方式么?有些我没有搞懂,想咨询下,我的QQ:28911428,期望能够加个QQ 人造人 发表于 2022-4-14 16:11
1. 最满是什么意思?
就是堆栈中保存的内容最多的那一次?
这个 “各单元” 指的是什么?
1、我理解的各单元应该是32个dw都要;
2、这个程序执行完,我可以确定这个程序不能返回DOS,返回DOS的话应该还要加上INT语句这里显然没有,所以我也认为执行完hlt就完了
3、我不清楚的地方,堆栈中数据0x12,0x14是怎么来的
4、我尝试Emu8086这个软件去调试,但是报错,报错内容是MOV SP,TOP这句错误参数,软件直接将这句翻译成了MOV SP,$-STA
5、如果大佬方便的话,能给这些语句在后面注释一下么?现在看来,我自己写的注释全部是错误的 hg870827 发表于 2022-4-14 22:55
1、我理解的各单元应该是32个dw都要;
2、这个程序执行完,我可以确定这个程序不能返回DOS,返回DOS的话 ...
3. CALL SUB1 和 PUSH BX
4. 用bochs试试
5. 你哪里不懂?
人造人 发表于 2022-4-15 00:53
3. CALL SUB1 和 PUSH BX
4. 用bochs试试
5. 你哪里不懂?
BOCHS是配置DOS环境吗?有没有参考的配置文章,我今天尝试了半天也不行,这个只是个模拟器,还需要配置环境 本帖最后由 hg870827 于 2022-4-15 14:30 编辑
人造人 发表于 2022-4-15 00:53
3. CALL SUB1 和 PUSH BX
4. 用bochs试试
5. 你哪里不懂?
另外我不懂的地方在于:1、MOV SP,0040是怎么来的?如果确定出来的?
2、MOV BX,OFFSET X2这个是怎么计算出段内偏移地址的?
有好些这样的问题,没弄明白,学得一知半解的 hg870827 发表于 2022-4-15 14:28
BOCHS是配置DOS环境吗?有没有参考的配置文章,我今天尝试了半天也不行,这个只是个模拟器,还需要配置环 ...
bochs 就是一个模拟器
要先在bochs中安装一个dos操作系统
好像并没有什么教程,这些东西要自己去探索
hg870827 发表于 2022-4-15 14:28
另外我不懂的地方在于:1、MOV SP,0040是怎么来的?如果确定出来的?
2、MOV BX,OFFSET X2这个是怎么 ...
1. TOP EQU $-STA
equ用来定义常量
$就是当前位置,当前位置 - STA
STA 是在stack段的偏移为 0 的位置
这个当前位置是 32 个 dw 的位置
就是 偏移为64的位置,就是 0x40
2. 就是 X2 这个标号的位置
页:
[1]