汇编 assume cs:code, ds:data,ss:stack的理解 请大家进来看看,问题我描述的比较清楚了,不会占用您太多时间

ndl1302732 2012-08-12 05:06:23
先把程序贴上来:
assume cs:code, ds:data,ss:stack

data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment

start:mov ax,stack
mov ss,ax
mov sp,16

mov ax,data
mov ds,ax

push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]

mov ax,4c00h
int 21h

code ends

end start

谈谈我的理解,以及我碰到的问题:

理解: assume cs:code, ds:data,ss:stack

这句的含义应该是指定让 cs寄存器保持code段的段地址, ds寄存器保存data段的段地址,ss保存stack段的段地址,这个我理解错误了吗,请高手一定帮忙分析下


1、编译,连接 使用 debug调试,使用r命令查看寄存器结果如下:

DS = 14AB SS = 14BB CS = 14BD, 这个结果我感觉很意外, 我觉得这三个值应该是连续的才对, 请高手解答下。

2 、使用d ds:0查看内存结果如下:
-d ds:0
14AB:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 76 0E 8A 03
这个结果我感到很不理解, 如果说ds保存的是data段的段地址,那么 d ds:0查看到得数据应该是在程序中定义的数据:
0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h。 可是显然我查询得到的数据和定义的数据没半毛钱关系,ds不是应该存放的是data段的段地址码?查出来的应该是data段的数据才对啊
这个也请高手帮忙分析下

3、使用d ss:0 查看堆栈段数据结果如下:
14BB:0000 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
14BB:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

请看这两行数据, 我想哭了, 为什么14BB:0000 开始的16个字节存放的是程序定义的数据:
0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
而 14BB:0010开始的16个字节才是堆栈数据:
0,0,0,0,0,0,0,0

我的理解是使用d ss:0 查看到得14bb:0000开始的16个字节应该是:00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
结果为什么是我们data段的数据呢? 请高手指点迷津


愿意帮忙分析的朋友情积极跟帖,也希望您跟帖时分析问题时分析清楚明白一点,我是个汇编新手,csdn好像没汇编板块,我在c/c++板块发表了
...全文
3591 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ActorKeyy 2012-08-29
  • 打赏
  • 举报
回复 5
理解: assume cs:code, ds:data,ss:stack

这句的含义应该是指定让 cs寄存器保持code段的段地址, ds寄存器保存data段的段地址,ss保存stack段的段地址,这个我理解错误了吗,请高手一定帮忙分析下
===================================
你错了,assume只是伪指令,是假设的意思,相关段寄存器与段地址的绑定还是需要在代码段里面用mov、push 、pop等指令来操作的。
ndl1302732 2012-08-13
  • 打赏
  • 举报
回复
看雪 好像几年前打算学汇编时,注册过账号, 去看看, 先自己顶起来。

工作了, 想学点其它东西不容易, 需要挤时间
titer1 2012-08-12
  • 打赏
  • 举报
回复
帮楼主顶起,现在看着汇编头大。

发到 看雪 里,估计那里更喜欢。
实验一 两个多位十进制数相加的实验 一、实验目的 学习数据传送和算术运算指令的用法 熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过 程。 二、实验内容 将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自 顺序存放在以DATA1、DATA2为首的5个内存单元中(低位在前),结果 送回DATA1处。 三、程序框图 图 3-1 四、参考程序清单 DATA SEGMENT DATA1 DB 33H,39H,31H,37H,34H;被加数 DATA1END EQU $-1 DATA2 DB 34H,35H,30H,38H,32H;加数 DATA2END EQU $-1 SUM DB 5 DUP(?) DATA ENDS STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV SI,OFFSET DATA1END MOV DI,OFFSET DATA2END CALL ADDA MOV AX,4C00H INT 21H ADDA PROC NEAR MOV DX,SI MOV BP,DI MOV BX,05H AD1: SUB BYTE PTR [SI],30H SUB BYTE PTR [DI],30H DEC SI DEC DI DEC BX JNZ AD1 MOV SI,DX MOV DI,BP MOV CX,05H CLC AD2: MOV AL,[SI] MOV BL,[DI] ADC AL,BL AAA MOV [SI],AL DEC SI DEC DI LOOP AD2 MOV SI,DX MOV DI,BP MOV BX,05H AD3: ADD BYTE PTR [SI],30H ADD BYTE PTR [DI],30H DEC SI DEC DI DEC BX JNZ AD3 RET ADDA ENDP CODE ENDS END START 五、实验结果如图: 六、心得体会:这次实验初步接触到上机操作。首先第一次编 程中可能会出现很多的错误,慢慢的认真检查与修改,这次实验熟 练了操作流程,而且这次实验的结果为:两个数相加后结果放在内 存中DS:0000处,且结果应给为84256,实验结果与理论分析一致。 实验二 排序实验 一、实验目的 掌握用汇编语言编写排序程序的思路和方法。 二、实验内容 将指定内存出开始的数据(最多为4位数)按从大到小的顺序排 列。第一个数字表示数据的个数(不是要比较的数值!!!)。 三、程序流程图 图 3-2 四、程序清单 DATA SEGMENT ADDR DW 8,234,35,67,876,54,39,765,237 DATA ENDS STACK SEGMENT STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV CX,WORD PTR ADDR[0] DEC CX LOOP1: MOV DI,CX MOV BX,2 LOOP2: MOV AX,WORD PTR ADDR[BX] CMP AX,WORD PTR ADDR[BX+2] JGE CCC XCHG AX,WORD PTR ADDR[BX+2] MOV WORD PTR ADDR[BX],AX CCC: ADD BX,2 LOOP LOOP2 MOV CX,DI LOOP LOOP1 EXIT: MOV AX,4C00H INT 21H CODE ENDS END START 五、实验结果如图: 六、心得体会:这次的实验比上次的稍微要复杂点,首先要先看懂程 序,在此程序中,用了一个循环,首先第一个数与第二个数相比较,然 后第三个数再与第一第二个数分别比较,依次类推 实验三 自编程序上机调试 一、实验目的 掌握用汇编语言编写排序程序的思路和方法。 二、实验内容 data segment x dw 600 y dw 25 z dw -2000 s dw ? data ends code segment assume ds:data,cs:code start:mov ax,data mov ds,ax mov

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧