2015-10-14 73 views
-2

我认为错误是在循环或某处期待指针类型

.model small 
    Org 100h 
    .code 
    Mov cx, 0ah 
    Mov ah, 02h 
    Mov dl, 39h 
    Int 21h 
    Mov bl, dl 
    Mov dl, 0ah 
    Int 21h 
    Mov dl, 0dh 
    Int 21h 
    Mov dl, bl 
    Dec dl 
    Loop 0107 
    Int 20h 
    End 

我这样做是对还是错?

+0

'loop'可能期望一个标签,而不是一个数字。另外,你不能期望寄存器在调用'int 21h'的时候保持它们的值。返回时,他们很可能会有全新的价值。 –

+0

我不知道。你是否可以在你的问题中增加更多的信息,以便我们更清楚地知道你在问什么?我自己的代码片段,尤其是汇编中的代码片段不够好。另外,你没有提到你正在尝试做什么。 –

+0

嘿@BoPersson - 你是心灵上能够调试,只是:) –

回答

1

Loop 0107显然应该是一个绝对跳转只是为了偏移,但loop只能执行相对跃过-128的距离 - +127个字节。这个指令在这个地方的机器码是E2 EE,这意味着:“从这里跳回16个字节”(更准确地说:“从下一条指令跳回18个字节”)。你可以这个程序:loop $-16$代表“here”,所以​​是“这里减去16个字节”=“从这里返回的16个字节”。你必须考虑到这个指令必须保持在完全一样的地方,你不能不能之前插入代码,否则“从这里16个字节”将不会指向正确的地方。

更好的是定义一个标签并跳到那里。 TASM计算距离,并产生正确的loop

; The order of `.MODEL - .CODE - ORG - start` is relevant! 
.MODEL tiny     ; .model small was wrong 
.CODE 
ORG 100h 
start:      ; Start label 

    Mov cx, 0ah 
    Mov ah, 02h 
    Mov dl, 39h 
my_107:      ; Loop label 
    Int 21h 
    Mov bl, dl 
    Mov dl, 0ah 
    Int 21h 
    Mov dl, 0dh 
    Int 21h 
    Mov dl, bl 
    Dec dl 
    Loop my_107    ; Loop to label `my_107` 
    Int 20h 

END start     ; End of program with start label 

不要忘了参数/t的TLINK.EXE!