Arrays 在汇编语言中写入数组的问题
我试图学习汇编语言,但我有一个简单的问题,写数组。 我的程序应该读取命令行参数,显示它们并写入数组。在下面的代码中有一个标记行。如果我用这行代码编译它,注释程序工作得很好,但如果我取消注释它,它会在显示几个字符后挂起。这里怎么了?当有较短的参数行时,它可以工作,但是这个数组应该足够大,可以包含整个命令行。我是不是遗漏了什么Arrays 在汇编语言中写入数组的问题,arrays,assembly,x86,dos,Arrays,Assembly,X86,Dos,我试图学习汇编语言,但我有一个简单的问题,写数组。 我的程序应该读取命令行参数,显示它们并写入数组。在下面的代码中有一个标记行。如果我用这行代码编译它,注释程序工作得很好,但如果我取消注释它,它会在显示几个字符后挂起。这里怎么了?当有较短的参数行时,它可以工作,但是这个数组应该足够大,可以包含整个命令行。我是不是遗漏了什么 assume cs:kod, ds:dane kod segment .286 start:
assume cs:kod, ds:dane
kod segment
.286
start:
mov ax,seg wstos
mov ss,ax
mov sp,offset wstos
xor cx,cx
xor ax,ax
mov si,80h
mov dl,[si]
mov cl,dl
mov ah,2h
int 21h
inc si
xor di,di
petla:
inc si
mov dl,[si]
;mov [tablica + di],dl <<<< this line
test dl,dl
jz sprawdz
int 21h
inc di
dalej:
loop petla
sprawdz:
mov al,[si+1]
cmp al,0
jne dalej
koniecprogramu:
mov ax,4c00h
int 21h
dane segment
tablica db 128 dup(0)
dane ends
stos1 segment STACK
dw 256 dup(?)
wstos dw ?
stos1 ends
假设cs:kod,ds:dane
kod段
.286
开始:
mov ax,seg wstos
mov-ss,ax
mov sp,偏移量WSTO
异或
xor ax,ax
mov-si,80h
mov-dl[si]
mov cl,dl
mov啊,2h
int 21h
国际公司
异或di,di
佩特拉:
国际公司
mov-dl[si]
;mov[tablica+di],dl“mov[tablica+di]”
那么ES呢?我认为偏移量tablica==0
,但ds==cs。如果这些线路按预期工作,至少必须:
mov si, 80h
mov al, [si];
要使其兼容,必须初始化ds(在这种情况下,使用mov al,cs:[si]
访问命令行),或者只需将数据保留在代码段中,只需注释两行:
;dane segment
tablica db 128 dup(0)
;dane ends
是的……那么
ds
呢?您可以在开始处初始化堆栈:
标签(这可能不是必需的)但是不要初始化ds
或es
。假设
指令不适合你。在启动时,DOS将初始化ds
和es
到你的PSP段-这是你的命令行参数所在-但是你的tablica
在段dane
中。我想你需要在这种或那种情况下,段重写。不可能;他有多个段,因此,这是一个EXE程序。谢谢帮助。我昨天已经自己解决了。;)问题不是初始化ds寄存器。现在一切正常。我一直认为“假定命令”是为我做的。那么这个命令实际上在做什么呢?在任何地方都找不到。当汇编程序试图计算label(在ds:segment中)的地址/偏移量时,它会参考ASSUBE指令中的参数进行计算。当然,这是以ds包含假定段的值为前提的。另一个用途是在调用宏中,可以假定指针(如di)指向字节、字、dword甚至结构。