回 帖 发 新 帖 刷新版面

主题:我发现用assume就不用手工赋段值了~

这是我的第一个程序:
;my first asm program

dseg segment
    x db '1'
dseg ends

sseg segment stack
    db 100 dup (?)
sseg ends

cseg segment
    assume cs:cseg, ds:dseg, ss:sseg
start:
    mov bl, x
    mov ah, 4ch
    int 21     
cseg ends
    end start

编译连接都通过了!哈。只是运行时总出现“试图执行无效指令”……

回复列表 (共10个回复)

沙发

虽然编译能通过,但不手工段赋值,程序执行就有问题,数据段不确定。

板凳

是吗?可我赋段值后仍然是这个情况。

3 楼

你是怎么赋值的可以完整的写出来吗?

4 楼

……
start:    mov ax, dseg
    mov ds, ax
    mov ax, sseg
    mov ss, ax
……
这样

5 楼

exe 文件中的 ss 和 sp 值是由连接器确定的

6 楼

assume是给汇编器看的,实际操作时需要手工赋值。

7 楼

楼上两位说到了点子上,我顶一下。

8 楼


用简化段定义就不用assume了

9 楼

如果还是要手工操作,那ASSUME是不是可以不要啊?

10 楼

assume cs:cseg, ds:dseg, ss:sseg——这是给编译使用的;
程序中还要对段进行装填,因为很多指令都是按照默认段完成操作的。
比如: stosb——就是写al到ES:[DI],程序中不装填ES,那写到哪里去了???

小程序没必要设置堆栈段。

我来回复

您尚未登录,请登录后再回复。点此登录或注册