程序的意思是 字符串str1与str2比较大小,当str1>str2 return >0
str1<str2 return <0 str1=str2 return =0
如果strcmp function return >0 则输出字符串 str1;
否则 输出字符串2 x后的输出结果 应该是指 字符x后的流 就是yz
;方法一:传统完整段定义结构
;利用DOS系统功能调用(INT 21H中断的4C功能)返回DOS
;
;程序框架结构(必不可少的语句)如下:
;data segment
;
;data ends
;stack segment para stack
;
;stack ends
;coseg segment
; assume cs:coseg,ds:data,ss:stack
;start:
; mov ax,data
; mov ds,ax
;
; mov ah,4ch
; int 21h
; (或者用INT 20H代替以上两行)
;coseg ends
; end start
;-------------------------------------------------------
;举例
;LEA,LDS,LES指令的练习
;题目:在DEBUG下单步运行下列程序的可执行程序,观察每步寄存器的内
;容是否与实际相符。程序如下:
data1 segment
table1 db 30h,31h,32h,33h,34h,35h,36h,37h
db 38h,39h,41h,42h,43h,44h,45h,46h
num1 db 61h,62h,63h,64h,65h,66h,67h,68h
data1 ends
data2 segment
table2 db 30h,31h,32h,33h,34h,35h,36h,37h
db 38h,39h,41h,42h,43h,44h,45h,46h
num2 db 68h,67h,66h,65h,64h,63h,62h,61h
data2 ends
stack1 segment para stack
dw 20h dup(0)
stack1 ends
coseg segment
assume cs:coseg,ds:data1,es:data2,ss:stack1
start:
mov ax,data1 ;1
mov ds,ax ;2
mov ax,data2 ;3
mov es,ax ;4
mov bx,offset num1 ;5==8
mov sp,[bx] ;6
xor bx,bx ;7
lea bx,num1 ;8==9
lea sp,[bx] ;9
xor bx,bx ;10
lea bx,num1
lds si,[bx]
lea bx,num2
les di,es:[bx]
mov ah,4ch
int 21h
coseg ends
end start
;
;方法二:简化段定义结构
;程序应在MASM 50,最好在MASM 60版下运行。
;利用DOS系统功能调用(INT 21H中断的4C功能)返回DOS
;
;程序框架结构(必不可少的语句)如下:
;TITLE text
;NAME module_name
;MODEL SMALL
;DATA [NAME]
;
;STACK [SIZE]
;CODE [NAME]
;start:
; mov ax,@data
; mov ds,ax
;
; mov ax,4c00h
; int 21h
;(或者用EXIT [Return_value]代替以上两行)
;(或者用INT 20H代替以上两行)
; END START
;举例
;题目:求两个数的和,结果存储到指定内存单元。
;要求:在DEBUG下单步运行下列程序的可执行程序,观察每步寄存器的内
;容和存放结果的内存单元。程序如下:
TITLE ADDER
MODEL SMALL
DATA
OPR1 DW 12
OPR2 DW 24
RESULT DW
CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV AX,OPR1
ADD AX,OPR2
MOV RESULT,AX
EXIT
END START
;
;方法三:程序段前缀结构:
; ①将应用程序定义成一个过程,其属性为FAR。
; ②在程序开始处保存PSP段地址和零偏移地址,即保护现场。
; ③在程序结束处使用RET指令返回DOS 。
;
;程序框架结构(必不可少的语句)如下:
;STACK SEGMENT PARA STACK 'STACK'
;
;STACK ENDS
;DATA SEGMENT PARA 'DATA'
;
;DATA ENDS
;CODE SEGMENT PARA 'CODE'
; ASSUME CS:CODE,DS:DATA,SS:STACK
;MAIN PROC FAR
;START: PUSH DS
; XOR AX,AX
; PUSH AX
; MOV AX,DATA
; MOV DS,AX
;
; RET
;MAIN ENDP
;CODE ENDS
; END START
;-------------------------------------------------------
;举例
;MOVSB指令的练习
;题目:在数据段中有一个字符串,将其复制到数据段的另一缓冲
;区中。程序如下:
STACK SEGMENT PARA STACK 'STACK'
DB 1024 DUP()
STACK ENDS
DATA SEGMENT PARA 'DATA'
HELLO DB 'Hello,world!',0dh,0ah,'$'
OK DB 16 DUP()
DATA ENDS
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN PROC FAR
START: PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET HELLO
MOV DI,OFFSET OK
MOV CX,OK-HELLO
; REP MOVSB
REP MOVS ES:BYTE PTR[DI],DS:[SI]
LEA DX,HELLO
MOV AH,9
INT 21H
RET
MAIN ENDP
CODE ENDS
END START
;
;方法四:COM文件格式。要求如下:
; ①COM文件不允许分段,程序大小不允许超过64KB。
; ②程序运行的起始点必须是100H,其前256个字节为程序段前缀所在地。
; ③不必设置堆栈段,程序装入后自动把SP建立在该段之末。
; ④对于所有过程则应定义为NEAR属性。
;
;程序框架结构如下:
;CODE SEGMENT
; ORG 100H
; ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
;MAIN PROC NEAR
;START:
; (程序代码部分)
;
; MOV AX,4C00H
; INT 21H
; (或者用INT 20H代替以上两行)
;
; (数据定义部分)
;
;MAIN ENDP
;CODE ENDS
; END START
;---------------------------------------------------
;对于MASM 50或MASM 60版也可采用如下程序框架结构:
;标题部分
;model tiny
;code
;
org 100H
;START: jmp begin
;
; (数据定义部分)
;
begin:
;
; (程序代码部分)
;
; MOV AX,4C00H
; INT 21H
; (或者用INT 20H代替以上两行)
; END START
;-------------------------------------------------------
;举例
;分支程序设计练习
;题目:将BX寄存器的内容以二进制格式显示在屏幕上,程序如下:
code segment
ORG 100H
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
MAIN PROC NEAR
begin: mov bx,1234h
mov cx,16
loop1: mov dl,'0'
rcl bx,1
jnc disp
mov dl,'1'
disp: mov ah,2
int 21h
loop loop1
mov ah,4ch
int 21h
MAIN ENDP
CODE ENDS
END begin
DATA SEGMENT ;定义数据段
BUF DB -3,1,2 ;定义变量
BUF1 DB 1000 DUP() ;预留1000字节的空间
DATA ENDS ;数据段定义结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;段寄存器关联说明
START: ;代码段第一条指令从这里开始
MOV AX,DATA ;数据段段址→ax
MOV DS,AX ;ax→ds,给数据段段寄存器赋值
LEA SI,BUF ;变量BUF有效地址→SI
MOV CX,1000 ;变量BUF元素个数→CX
MOV AX,[SI] ;变量BUF的第一个字数据→AX
LP: CMP AL,0 ;AL<0?
JL NEXT ;是,转NEXT处执行
INC SI ;变量BUF元素地址增1
DEC CL ;CL-1→CL
JNZ LP ;CL不等于0,转LP处执行循环体
NEXT: MOV BUF1,AL ;AL送变量BUF1保存
MOV AH,4CH ;结束程序
INT 21H ;dos功能调用
CODE ENDS ;代码段定义结束
END START ;编译到此结束
程序段功能: 从变量BUF的1000个有符号字节数种找到第一个负数,把这个负数存于BUF1单元。
从程序段来看,这段程序的编者必是初学汇编语言。提两点建议:
1、有一处错误:
DEC CL
从程序功能来看,此处必须要用:
DEC CX
因为你要从1000个有符号字节数中找出第一个负数,而8位计数器CL能存的最大无符号数是255,那么用指令:
DEC CL
实际上是只从前255个元素中查找,而漏掉了后面的745个元素。如果前255个元素中没有负数,执行结果必然是错误的。
2、Intel 8086/8088体系结构的内存管理是分段式的,教科书及老师都习惯于这种模式,这是正确的。但我们作为初学,只是练习,无论是数据量还是代码量,都很有限,没有必要分这个段、那个段的,完全可以在一个段里进行,即把DS、ES及SS,统统地设置成与代码段同段。下面,以另一种方式来实现这个功能,仅供参考。
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
BUF DB -3,1,2
Element equ ($-BUF)/type BUF ;元素个数
BUF1 DB
START:push cs
pop ds
push cs
pop es
lea si,BUF
mov cx,Elements
LP: lodsb
cmp al,0
jl $+4
loop LP
MOV BUF1,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
不知道对楼主有没有用。。。。
构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。
531 if语句的三种形式
1 第一种形式为基本形式:if
if(表达式) 语句
其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图。
main(){
int a,b,max;
printf("\n input two numbers: ");
scanf("%d%d",&a,&b);
max=a;
if (max<b) max=b;
printf("max=%d",max);
}
本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。
2 第二种形式为: if-else
if(表达式)
语句1;
else
语句2;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。
其执行过程可表示为下图。
main(){
int a, b;
printf("input two numbers: ");
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
输入两个整数,输出其中的大数。
改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。
3 第三种形式为if-else-if形式
前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
…
else if(表达式m)
语句m;
else
语句n;
其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。
#include"stdioh"
main(){
char c;
printf("input a character: ");
c=getchar();
if(c<32)
printf("This is a control character\n");
elseif(c>='0'&&c<='9')
printf("This is a digit\n");
elseif(c>='A'&&c<='Z')
printf("This is a capital letter\n");
elseif(c>='a'&&c<='z')
printf("This is a small letter\n");
else
printf("This is an other character\n");
}
本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分
支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。
4 在使用if语句中还应注意以下问题:
1) 在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。
例如:
if(a=5) 语句;
if(b) 语句;
都是允许的。只要表达式的值为非0,即为“真”。
如在:
if(a=5)…;
中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如,有程序段:
if(a=b)
printf("%d",a);
else
printf("a=0");
本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
2) 在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用之后不能再加分号。
例如:
if(a>b)
{a++;
b++;}
else
{a=0;
b=10;}
532 if语句的嵌套
当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。
其一般形式可表示如下:
if(表达式)
if语句;
或者为
if(表达式)
if语句;
else
if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。
例如:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
其中的else究竟是与哪一个if配对呢
应该理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
还是应理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
为了避免这种二义性,C语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。
main(){
int a,b;
printf("please input A,B: ");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b) printf("A>B\n");
else printf("A<B\n");
else printf("A=B\n");
}
比较两个数的大小关系。
本例中用了if语句的嵌套结构。采用嵌套结构实质上是为了进行多分支选择,实际上有三种选择即A>B、A<B或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此,在一般情况下较少使用if语句的嵌套结构。以使程序更便于阅读理解。
main(){
int a,b;
printf("please input A,B: ");
scanf("%d%d",&a,&b);
if(a==b) printf("A=B\n");
else if(a>b) printf("A>B\n");
else printf("A<B\n");
}
以上就是关于c语言程序段全部的内容,包括:c语言程序段、汇编语言 INT 20H的具体使用方法、微机原理3个数比较大小的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)