文章目录
前言
参考书籍:
王爽。汇编语言。北京:清华大学出版社, 2013:133-137
本人菜狗一枚,不敢咬文嚼字,只能站在巨人的肩膀上窥探一下未曾了解的世界。
代码示例
assume cs:code, ds:data, ss:stack
; 初始化 data 段数据
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, 10h
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
data segment
dw 0123h, 0456h
data ends
stack segment
dw 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
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
data segment
dw 0123H, 0456H
data ends
stack segment
dw 0, 0
stack ends
end
问题
设程序加载后,code 段地址为 X,data 段地址 和 stack 段地址分别为多少?
| 程序编号 | code 段地址 | data 段地址 | stack 段地址 |
|---|---|---|---|
| 1 | X | X - 2 | X - 1 |
| 2 | X | X - 2 | X - 1 |
| 3 | X | X + 3 | X + 4 |
若 “end start” 改为 “end”(即不指明程序入口),则哪个程序可正确执行
程序在 PSP 之后装入,程序地址被设为 SA + 10H:0,即认为 SA + 10H:0 为程序入口
分析以下代码
name segment
...
name ends
如果段中的数据占 N 个字节,则程序加载后,该段实际占有的空间为 (N / 16 + 1) * 16
在 8086CPU 架构上,段是以 paragraph(16-byte)对齐的。程序默认以 16 字节为边界对齐,所以不足 16 字节的部分数据也要填够 16 字节。
编程
编写代码,将 a 段和 b 段中的数据依次相加,将结果存在 c 段中
assume cs:code
a segment
db 1, 2, 3, 4, 5, 6, 7, 8
a ends
b segment
db 1, 2, 3, 4, 5, 6, 7, 8
b ends
c segment
db 0, 0, 0, 0, 0, 0, 0, 0
c ends
code segment
start:
mov ax, a
mov ds, ax
mov ax, c
mov es, ax
mov bx, 0
mov cx, 8
s:
mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, b
mov ds, ax
mov bx, 0
mov cx, 8
s0:
mov al, [bx]
add es:[bx], al
inc bx
loop s0
mov ax, 4c00h
int 21h
code ends
end start
编程,用 push 指令将 a 段中的前 8 个字型数据,逆序存储到 b 段中
assume cs:code
a segment
dw 1, 2, 3, 4, 5, 6, 7, 8, 9, 0ah, 0bh, 0ch, 0dh, 0eh, 0fh, 0ffh
a ends
b segment
dw 0, 0, 0, 0, 0, 0, 0, 0
b ends
code segment
start:
mov ax, a
mov ds, ax
mov bx, 0
mov ax, b
mov ss, ax
mov sp, 16
mov cx, 8
s:
push [bx]
inc bx
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end start
本文介绍了8086汇编语言中关于编写和调试具有多个段的程序,探讨了段地址计算、程序入口指定的影响以及段对齐规则。通过示例代码展示了如何进行段间数据操作,包括数据相加和数据逆序存储。

1528

被折叠的 条评论
为什么被折叠?



