导航:首页 > 软件知识 > 如何把程序汇编成无限循环

如何把程序汇编成无限循环

发布时间:2023-01-01 07:03:12

‘壹’ 汇编循环程序

ASSUMECS:CODE,DS:DATA

DATASEGMENT

in_stringdb30,?;加上这行

STRINGDB30DUP('#');填满结束符
NUMDB30DUP(?)
BCHARDB30DUP(?)
LCHARDB30DUP(?)
OTHERDB30DUP(?)
DATAENDS

CODESEGMENT

START:
MOVAX,DATA
MOVDS,AX

leadx,in_string;加上这三行
movah,10
int21h

MOVBX,0
MOVCX,0
MOVDX,0
MOVBP,0
LEASI,STRING
NEXT:
MOVAL,[SI]
CMPAL,'#'
JEEXIT
CMPAL,'0'
JBOTHERLETTER
CMPAL,'9'
JANOTNUM

MOVDI,BX
MOVNUM[DI],AL
INCBX
JMPONCEDONE

NOTNUM:
CMPAL,'A'
JBOTHERLETTER
CMPAL,'Z'
JANOTBLETTER
MOVDI,CX
MOVBCHAR[DI],AL
INCCX
JMPONCEDONE

NOTBLETTER:
CMPAL,'a'
JBOTHERLETTER
CMPAL,'z'
JAOTHERLETTER
MOVDI,DX
MOVLCHAR[DI],AL
INCDX
JMPONCEDONE

OTHERLETTER:
MOVDI,BP
MOVOTHER[DI],AL
INCBP
ONCEDONE:
INCSI
JMPNEXT

EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART


大写的,是原来的程序。

小写的,是为你增加的。


加上后,即有了输入字符串功能。

‘贰’ 嵌入式系统中经常要用到无限循环,怎么用C编写死循环

这个问题用几个解决方案。我首选的方案是:

while(1){}

一些程序员更喜欢如下方案:

for(;;)
{}

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。

第三个方案是用 goto

Loop:
...
goto Loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Data declarations)

5. 用变量a给出下面的定义

a) 一个整型数(An integer)

b)一个指向整型数的指针( A pointer to an integer)

c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer)

d)一个有10个整型数的数组( An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:

a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?

Static


‘叁’ 汇编语言 循环程序


一个标准的循环程序应由以下四部分组成:循环准备、循环体、循环修改、循环控制。
循环准备是为循环做准备的,有循环次数和起始地址;循环体是循环程序解题所需的核心程序,题目要完成的功能在此进行;循环修改用来更新某些数据或修正循环控制的参数;循环控制是循环是否结束的控制。
如果在一个程序中的多个地方、或多个程序中的多个地方要用同一段程序,那么可以将这段程序单独设计,存放在某一存储区域,每当需要执行这段程序时,就调用指令转到这段程序去,执行完毕,再返回原来的程序。这段独立出来的程序叫做子程序或过程,调用它的程序称为主程序。采用子程序。使得设计结构清楚,程序的维护方便。当主程序需要执行这个子程序功能时,通过调用该子程序,执行子程序,子程序完成后返回主程序调用处,继续主程序后面的指令的执行。与子程序有关的指令有子程序的调用CALL、子程序返回RET两条指令。

‘肆’ 怎么用汇编语言实现for循环

汇编语言实现for循环十分容易,比如51汇编,用DJNZ指令就可以了,举例如下:
C语言:
for(i=0;i<10;i++)a=a+i;
汇编语言:
i equ 30h
m equ 31h
......
mov i,#0
mov m,#0
mov r2,#10
loop:
mov a,i

add a,m

mov m,a

djnz r2,loop

‘伍’ 反汇编一个程序,写一段汇编内嵌补丁将程序的一段功能循环

用 inline patch就行了。
地址你知道了,反汇编你也能看懂,写个这么个东西很难么?

找个nop填充的位置,一般在程序的最下边。
然后修改循环前的代码为jmp xxxx
xxx是你找到的nop段的地址
这时候你写入后,如果你用了OD,OD会自动nop填充来对齐代码,你写入的那个位置的汇编代码就覆盖掉了。
记住这个指令,然后在跳转后先执行这个,保证原始功能正常。
然后实现你自己的逻辑。
实现完了,用jmp指令调回你想调回的位置。
整个过程保证你的汇编代码的正确性,不要破坏寄存器的值。
基本过程就是这样了。
如果你想让一个循环无限执行,具体的写法你应该参考你的程序,核心思想就是修改源程序汇编指令,跳到程序nop填充的位置(程序为了字节对齐,一定会有一些nop填充段),执行你希望的逻辑,执行完后,用jmp将控制权正确转交个程序。程序是你写的,控制权在你手里,想怎么循环怎么循环。
这个是直接修改。用程序也能改,不过想写出个比较通用的inline hook代码,比较麻烦。你自用,手动来就行了。

‘陆’ 用汇编语言编写51单片机程序,让LED灯亮一秒灭一秒,无限循环,时钟是6

ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
CLR P1.0
MOV R2,#10
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E
CPL P1.0
MOV R2,#10
T0E:
RETI
END

‘柒’ 用汇编语言编写51单片机程序让LED灯亮0.5秒,灭2秒无限循环

ORG 0000H
MOV SP,#60H
E: CLR P1.0 ; P1.0 LED亮
ACALL DEL_1S ; 0.5 秒
SETB P1.0 ; P1.0 LED灭
ACALL DEL_2S ;2秒
SJMP E ; 循环
DEL_1S: MOV R2,#10 ; 0.5秒

JMP DEL_2S+2
DEL_2S: MOV R2,#40 ; 2秒
SETB TR1
LOOP: JNB TF1,$
MOV TL1,#0B0H
MOV TH1,#3CH
CLR TF1
DJNZ R2,LOOP
CLR TR1
RET
END

‘捌’ 在命令提示符中,如何使一段程序反复执行,请教大神啊,就是像无限循环一样的程序

在dos环境中,执行debug(程序).exer命令查看寄存器t命令单步跟踪g命令执行到某条指令地址u命令反汇编d命令查看数据?看帮助

‘玖’ 关于汇编语言的循环问题

你理解从程序上面执行下来到达 loop s后又去执行标号s处,这没错。然后就无限循环死,这就错了!汇编语言的循环指令LOOP是有条件的,这个隐含操作和条件就是每循环一次,CX=CX-1,如果CX=0,循环就结束了。在这个程序中,循环3次结束。

阅读全文

与如何把程序汇编成无限循环相关的资料

热点内容
枣庄技术员证书怎么考有用吗 浏览:634
有正负的波动数据用什么分析 浏览:309
湛江有哪些水产品种 浏览:384
数学十几减九的数学信息是什么 浏览:874
产品销售分享会怎么开头 浏览:380
错版币怎么鉴定拍卖交易 浏览:699
信息化建设是一个什么样的工作 浏览:666
怎么看塑料产品能不能降解 浏览:49
如何整合金融资产交易所 浏览:972
物联网发展核心技术是什么 浏览:492
什么是电网企业代理购电 浏览:302
玉石交易大厅系统开发需要多少钱 浏览:685
医疗信息交换标准是什么意思 浏览:937
如何提高叉车技术 浏览:97
欠钱最少多少可以走法律程序 浏览:583
哪个行业小程序比较多 浏览:18
楚留香新衣服为什么不能交易 浏览:959
招投标信息在哪些地方发布 浏览:73
如何将程序员说的高大上 浏览:390
海鲜鱿鱼仔零食批发市场都有哪里 浏览:973