‘壹’ 汇编循环程序
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次结束。