13977075227 发表于 2023-11-13 23:24:34

求助,字节长度的定义


问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对 CS:IP、SS:SP、DS 等寄存器的设置来决定的。完全可以将程序 6.4 写成下面的样子,实现同样的功能。
转为Word
assume cs:b,ds:a,ss:c
a segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;>>>>>>>>>>>>>>>>>>>>(请解析下,该处与20h的关系怎么理解)
a ends
c segment
dw 0,0,0,0,0,0,0,0,0,0,0,00,0,0,0
c ends

b segment
d: mov ax,c

mov ss,axmov'sp,20h;       >>>>>>>>>>>>>>>>该处与20h的关系是怎么理解
;希望用c段当作栈空间,设置 ss:sp 指向 c:20
mov ax,a
mov ds,ax
mov bx,0
mov cx,8s: push
add bx,2loop s
;希望用 ds:bx 访问a 段中的数据,ds 指向 a 段
;ds:bx 指向 a 段中的第一个单元
;以上将 a 段中的 0~15 单元中的 8 个字型数据依次入栈
mov bx,0
mov cx,8
s0: pop
add bx,2
loop s0
;以上依次出栈 8 个字型数据到 a 段的 0~15 单元中
mov ax,4c00h
int 21h
b ends
end d
;d 处是要执行的第一条指令,即程序的入口
实验5编写、调试具有多个段的程序

isdkz 发表于 2023-11-13 23:24:46

这个问题中涉及到汇编语言的一些概念和指令,主要是关于段寄存器和栈的操作。在这段代码中,我们可以看到b段的代码中有一行mov ss,ax和mov sp,20h的指令,这两行指令的作用是设置栈的段寄存器和栈指针。 mov ss,ax将ax寄存器中的值赋给栈段寄存器ss , mov sp,20h将栈指针寄存器sp设置为20h 。

在这段代码中, c段被当作栈空间,通过设置ss寄存器和sp寄存器的值,来指向c段的起始位置。这样程序就可以使用c段来作为栈空间,进行栈操作。

需要注意的是, 20h是一个十六进制数,表示的是栈指针的初始位置。这里的20h可能是作者根据具体的程序需求选择的一个初始栈指针位置。根据具体的程序需求,初始栈指针位置可能会有所不同。

另外, assume cs:b,ds:a,ss:c这一行是用来定义段寄存器和段的关联关系的,它告诉汇编器如何将段名和段寄存器联系起来。

总的来说,这段代码中的mov ss,ax和mov sp,20h的作用是设置栈段寄存器和栈指针,将c段作为栈空间,并将栈指针初始化为20h 。

Mike_python小 发表于 2023-11-13 23:26:30

根据你提供的代码,我理解你的问题是关于栈空间和寄存器的设置。

在代码中,mov ss, ax 是将 ax 寄存器中的值(即 c 段的段地址)移动到 ss 寄存器中,mov sp, 20h 是将 20h 这个值设置为栈指针寄存器 sp 的值。这里的20h表示栈的大小,即设置栈空间为32字节。因此,通过设置 ss:sp 指向 c 段的偏移地址20h,实现了将 c 段作为栈空间的功能。

接下来,mov ds, ax 是将 ax 寄存器中的值(即 a 段的段地址)移动到 ds 寄存器中。这样,通过设置 ds 指向 a 段,就可以使用 ds:bx 访问 a 段中的数据。

然后,通过循环将 a 段中的数据依次入栈,再通过循环将栈中的数据依次出栈到 a 段中。

最后,int 21h 是调用 DOS 功能,具体是退出程序。4c00h 是 DOS 终止程序的功能号。

总结一下,这段代码的目的是利用 c 段作为栈空间,并使用 ds:bx 访问 a 段中的数据,实现数据的入栈和出栈操作。如果还有其他问题,请继续提问。

13977075227 发表于 2023-11-14 11:29:40

isdkz 发表于 2023-11-13 23:24
这个问题中涉及到汇编语言的一些概念和指令,主要是关于段寄存器和栈的操作。在这段代码中,我们可以看到   ...

请问dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;这句怎么知道它的字节长度是20h,我对栈的理解还是可以的,但这里我看的还是不清楚,请各位指教下。
页: [1]
查看完整版本: 求助,字节长度的定义