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体系结构的信息,才能真正了解这里发生的情况。