Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在汇编语言中写入数组的问题_Arrays_Assembly_X86_Dos - Fatal编程技术网

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甚至结构。