实验5(3)code=x??
assume cs:code,ds:data,ss:stackcode segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
push ds:
push ds:
pop ds:
pop ds:
mov ax, 4c00h
int 21h
code ends
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
end start
3.设程序加载后,code段的段地址为X,则data段的段地址为___,stack段的段地址为___。
A:X+3, X+4
明明是定义了三段,为什么不是x+2,x+3????
根据程序加载时的内存分配规则,每个段都会占用16字节的倍数(即1个段落)。计算code段的大小时,需要考虑指令的实际编码长度。
在您的代码中,push ds: 和 pop ds: 可能被汇编为操作内存的指令(例如 push word ptr 和 pop word ptr ),每条指令占用4字节。加上其他指令,code段的总字节数约为34字节,向上取整到16的倍数后占用48字节(即3个段落)。
因此,若code段的段地址为X,则:
- data段从X+3开始(因为code段占用X、X+1、X+2三个段落)。
- stack段从X+4开始(data段占用1个段落)。
所以正确答案是 A: X+3, X+4。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 鱼油要知道不是按“段的个数+1”算,而是按每段占多少个16字节(Paragraph)算。
段地址单位 = 16字节
你的code段机器码≈34字节 ⇒ 需要 ceil(34/16)=3个Paragraph,所以 data段 = X+3
data段只有4字节 ⇒ 占1个Paragraph,所以 stack段 = X+4
因此答案就是:data=X+3,stack=X+4,不是X+2、X+3。 FishC 发表于 2026-1-27 16:25
根据程序加载时的内存分配规则,每个段都会占用16字节的倍数(即1个段落)。计算code段的大小时,需要考虑 ...
assume cs:codesg, ds:datasg, es:tablesg
datasg segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982' ;;21年字符串,共计84个字节
db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990' ;;十六进制地址:00H~53H 十进制地址:00~83
db '1991', '1992', '1993', '1994', '1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 ;;以下为21年每年的总收入,共计84个字节
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;;十六进制地址:54H~a7H 十进制地址:84~167
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 ;;以下表示21年每年雇员人数,共计42个字节
dw 11542,14430,15257,17800 ;;十六进制地址:a8H~d2H 十进制地址:168~210
datasg ends
tablesg segment
db 21 dup ('year summ ne ?? ') ;;表格初始数值
tablesg ends
codesg segment
start:
mov ax,datasg ;;分配ds数据、es表格段地址
mov ds,ax
mov ax,tablesg
mov es,ax
mov ax,0 ;;清空相关寄存器
mov bx,0 ;;ax,bx,dx 用于中转、计算数据
mov dx,0
mov di,0 ;;di指向源数据地址,年份、收入
mov si,0 ;;si指向源、流数据地址,雇员数、表格年份、表格收入、表格雇员、表格人均地址
mov bp,0 ;;bp指向流表格行地址
mov cx,21
Count_copy_s:
mov ax,ds: ;;年份低位复制
mov es:,ax
mov ax,ds: ;;年份高位复制
mov es:,ax
mov ax,ds: ;;收入低位ax暂存并复制
mov es:,ax
mov dx,ds: ;;收入高位dx暂存并复制
mov es:,dx
mov bx,ds: ;;雇员人数bx暂存并复制
mov es:,bx
div bx ;;16位除法运算,商存放在ax,余数存放在dx
mov es:,ax ;;运算结果ax商复制到表格地址
add di,4 ;;指向下个双字型数据地址
add si,2 ;;指向下个字型数据地址
add bp,10H ;;指向表格下行地址
loop Count_copy_s
mov ax,4c00H
int 21H
codesg ends
end start
ds=0e04为什么cs=0e27???
不二如是 发表于 2026-1-27 16:36
鱼油要知道不是按“段的个数+1”算,而是按每段占多少个16字节(Paragraph)算。
段地址单位 = 16字节
{:5_108:}谢谢 531035528 发表于 2026-01-28 10:37
FishC 发表于 2026-1-27 16:25
根据程序加载时的内存 ...
根据程序加载时的内存分配规则,每个段占用 16 字节的倍数(即 1 个段落)。通过计算各段大小可得:
datasg 段:
年份:21 × 4 = 84 字节
收入:21 × 4 = 84 字节
雇员:21 × 2 = 42 字节
总计:210 字节 → 210 ÷ 16 = 13.125 → 向上取整为 14 个段落
tablesg 段:
21 × 16 = 336 字节 → 336 ÷ 16 = 21 → 正好 21 个段落
因此,从 datasg 到 tablesg 共占用 14 + 21 = 35 个段落。
设 datasg 的段地址为 DS = X,则 tablesg 段地址为 X + 14,codesg 段地址为 X + 14 + 21 = X + 35。
已知 DS = 0E04H,则:
CS = 0E04H + 35 = 0E04H + 23H = 0E27H。
故 DS 为 0E04 时,CS 为 0E27。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]