String 程序集:如何打印偏移值

String 程序集:如何打印偏移值,string,assembly,printing,int,offset,String,Assembly,Printing,Int,Offset,我正试图打印出偏移值。 (术语“打印”正确吗?是否还有其他术语 代码正确吗?我对汇编文档感到相当困惑 print_offsets: mov SI,0 mov CX,30 mov AH,2 int 21h jmp offsloop offsloop: cmp 0,Array[SI] ja print_offs

我正试图打印出偏移值。 (术语“打印”正确吗?是否还有其他术语

代码正确吗?我对汇编文档感到相当困惑

print_offsets:  mov  SI,0
                mov  CX,30
                mov  AH,2
                int  21h
                jmp  offsloop

offsloop:       cmp  0,Array[SI]
                ja   print_offset ;if the array element is nonzero
                inc  SI
                dec  CX
                jnz  offsloop

print_offset:   mov DL,SI
                mov  AH,2
                int  21h

如果您试图打印数字,则代码不正确

INT 21h,AH=2
输出一个。您的代码所做的是将偏移量值放入DL。DOS会将该偏移量值视为ASCII字符,并将其输出

例如,假设第一个非零元素的偏移量为7。您的代码将调用
INT 21h,AH=2
DL=07
。DOS将输出ASCII字符07h,即BEL(基本上是系统蜂鸣音)。相反,您可能需要
DL=37h
以输出代表数字7的ASCII字符37h

有几种方法可以解决这个问题

第一种方法很简单-如果数组中的元素从未超过10个,则只需在偏移量上添加30h,即可将偏移量值转换为正确的ASCII字符值:

print_offsets:  mov  SI,0          ; SI=offset
                mov  CX,10         ; CX = count (must be <= 10!!!!)

offsloop:       cmp  0,Array[SI]
                ja   print_offset ;if the array element is nonzero
next_element:   inc  SI
                dec  CX
                jnz  offsloop
                jmp finished

print_offset:   mov DL,SI
                add DL, 30h      ; convert offset to ASCII digit 0..9
                mov  AH,2
                ; save the registers in case INT 21h modifies them!
                push cx          ; save current count
                push si          ; save current offset
                int  21h
                pop si           ; restore current offset
                pop cx           ; restore current count
                jmp next_element
finished:
                ; do something else!
print_offset:mov-SI,0;SI=offset

mov CX,10;CX=count(必须是为什么需要保存当前计数?执行将继续到打印偏移量后的下一个数组元素。如果INT 21修改CX寄存器,则计数值(您仍在使用)将是错误的。我明白了。那么CX和si从何而来?它们自己的CX[]和si[]阵列?否。PUSH和POP是用于将数据放入堆栈(或从堆栈中取出数据)的通用x86指令。堆栈是SP寄存器指向的内存区域。您可能需要阅读更多有关基本x86体系结构的信息,才能真正了解这里发生的情况。