【浅尝辄止】《汇编语言》编写、调试具有多个段的程序

本文介绍了8086汇编语言中关于编写和调试具有多个段的程序,探讨了段地址计算、程序入口指定的影响以及段对齐规则。通过示例代码展示了如何进行段间数据操作,包括数据相加和数据逆序存储。


前言

参考书籍:
王爽。汇编语言。北京:清华大学出版社, 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 段地址
1XX - 2X - 1
2XX - 2X - 1
3XX + 3X + 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值