一道pascal编程题:汇编语言(ASM)

汇编语言的程序有两类语句,顺序执行语句和跳转语句。跳转语句的格式为:jmp 行号,作用是跳到行号所指的那一行去执行。顺序语句执行后不会对程序的执行顺序作任何改变。
比如下面的这个程序:
mov ax, @data
mov ds, ax
jmp 5
jmp 2
mov ax, 4C00H
int 21H
这个程序一共有6条语句,其中第三和第四条是跳转语句。
程序从第一行开始执行,执行到第三行后就跳到第五行执行,执行到第六行后程序结束。
你的任务是编写一个程序,判断一个汇编程序会执行多少行语句后退出,或者会进入死循环。
【输入数据】
第一行是一个数字n,表示程序行数(1<=n<=200)
下面的n行,每行是一条语句,语句前没有多余空格。
【输出数据】
一个数字,表示程序执行的行数。如果程序进入了死循环,则输出数字0。
【样例】
asm.in
6
mov ax, @data
mov ds, ax
jmp 5
jmp 2
mov ax, 4C00H
int 21H

asm.out
5

var a:array[0..210]of string;
b:array[0..210]of boolean;
n,i,step:longint;
begin
readln(n);
for i:=1 to n do readln(a[i]);
i:=1;
while i<=n do
begin
if b[i] then
begin
writeln(0);
halt;
end;
b[i]:=true;
inc(step);
if copy(a[i],1,4)='jmp ' then
begin
delete(a[i],1,4);
val(a[i],i);
end
else inc(i);
end;
writeln(step);
end.
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-23
能再详细的,行吗
第2个回答  2011-07-23
很简单.建图..抽象成点...一般点向下一个点连边..表示顺序执行...jmp连边到目标..表示跳跃..之后tarjan(dfs)判环,有环就无解
第3个回答  2011-08-03
var a:array[0..210]of string;
b:array[0..210]of boolean;
n,i,step:longint;
begin
readln(n);
for i:=1 to n do readln(a[i]);
i:=1;
while i<=n do
begin
if b[i] then
begin
writeln(0);
halt;
end;
b[i]:=true;
inc(step);
if copy(a[i],1,4)='jmp ' then
begin
delete(a[i],1,4);
val(a[i],i);
end
else inc(i);
end;
writeln(step);
end.
相似回答
大家正在搜