精华内容
下载资源
问答
  • 2020-11-04 14:00:32

    **

    实验项目:循环程序设计实验

    **
    一.实验目的
    1、掌握循环程序的结构;
    2、学习综合程序的设计、编写及调试;

    二.实验内容
    1、计算S=12+23+34+。。。+N(N+1);
    2、求某个数据区内负数的个数;

    三.试验程序
    1、

    DATAS SEGMENT
        RESULT  	DW ?			;计算结果
       DVAL DB 5 DUP(?);申请缓冲区,存放转换后的数据
       DLEN =$-RESULT ;地址偏移量
    DATAS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS
    START:
    	MOV DX,0001H
    	MOV BL,02H
    A0:     	
    	MOV AL,BL
    	INC BL
    	MUL BL
    	ADD DX,AX		;结果存于DX中
    	CMP AX,00C8H	;判断N(N+1)与200的大小
    	JB A0
    
    	MOV AX,DATAS		;保存计算结果
    	MOV DS,AX
    	MOV RESULT,DX
    
    ;16进制转10进制输出
    MOV SI,OFFSET RESULT;数据源地址
    MOV DX,[SI]
    MOV SI,OFFSET DLEN;目标数据地址  offset送回偏移地址
        A1:	
    DEC SI;自减
    MOV AX,DX
    MOV DX,0
    MOV CX,10;除数10
    DIV CX;商送AX,余数DX
    XCHG AX,DX;数据交换
    MOV [SI],AL;存入目标地址
    
    CMP DX,0000H
        JNE A1;判断转换结束否,未结束转A1   不等跳转
        A2:		
    CMP SI,OFFSET DVAL;与目标地址的首址比较
        JZ A3;等于首地址转A3,否则将剩余地址填00H  等0跳转
    DEC SI
    MOV AL,00H
    MOV [SI],AL
        JMP A2
        A3:	
    	MOV CX,5       	;循环次数
    	MOV SI,OFFSET DVAL;目标数据地址  offset送回偏移地址
    MLOOP: 	
    
    MOV AL,[SI];将SI地址的数依次赋值给AL
    	INC SI   
    	ADD AL,30h       	;ascii码
    	MOV DL,AL           ;输出
    	MOV AH,2
    	INT 21H
    LOOP MLOOP          ;循环
    MOV AH,4CH
        INT 21H
    CODES ENDS
    END START
    

    2、

    DATAS SEGMENT
        MSG0 DB 'Number of all nums:$'
        MSG1 DB 10,13,'Please input a num:$'
        MSG2 DB 10,13,'Number of negative nums is $'
        BUF DW ?;首单元为总数
    	RESULT DB ?			;统计后的负数个数
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        LEA DX,MSG0     ;MSG0地址存入DX
        MOV AH,9        ;显示字符串
        INT 21H
        MOV AH,1
        INT 21H           ;输入数据个数
        MOV AH,0
        SUB AL,48     
        MOV CX,AX
        PUSH CX
        MOV SI,OFFSET BUF
    AGAIN:
        LEA DX,MSG1     ;MSG1地址存入DX
        MOV AH,9        ;显示字符串
        INT 21H
        CALL INPUT
        MOV [SI],BX
        ADD SI,2 	
        LOOP AGAIN
        
        MOV DI,OFFSET BUF ;数据区首地址
        POP CX
    	MOV BL,0	
    A1:     	
    	MOV AX,[DI]
    	TEST AX,1000000000000000B		;检查数据首位是否为1
    	JZ A2
    	INC BL			;负数个数加1
    A2:     	
    	ADD DI,2
    LOOP A1
    
    	LEA DX,MSG2     ;MSG2地址存入DX
        MOV AH,9        ;显示字符串
        INT 21H
        MOV DI,OFFSET RESULT ;存结果
        MOV [DI],BL
    	ADD BL,48
    	MOV DL,BL
    	MOV AH,2
    	INT 21H 
    
    
    	MOV AH,4CH
    	INT 21H			;程序终止
    INPUT PROC
    	PUSH AX
    	PUSH CX
    	XOR BX,BX
    	XOR CX,CX   ;置0  BX保存结果  CX是正负标志
    	XOR DX,DX
    IN0:
    	MOV AH,1
    	INT 21H    ;输入
    	CMP AL,'+'
    	JZ  IN1     ;正数  继续输入
    	CMP AL,'-'
    	JNZ IN2
    	MOV CX,1      ;负数  cx置1
    IN1:
    	MOV AH,1     ;继续输入
    	INT 21H
    IN2:
    	CMP AL,'0'
    	JB IN3
    	CMP AL,'9'
    	JA IN3     ;<0  >9 结束
    	SUB AL,48
    	MOV AH,0
    	PUSH AX
    	MOV AX,BX
    	MOV DL,10
    	IMUL DX
    	POP AX
    	ADD BX,AX
    	JMP IN1
    IN3:
    	CMP CX,0   ;判断正负数
    	JZ IN4
    	NEG BX     ;负数求补
    IN4:
    	POP CX
    	POP AX
    	RET
    INPUT ENDP
    
    CODES ENDS
    END START
    

    四.试验中遇到的问题、试验结果分析
    实验一很简单!没有问题!
    实验二求负数个数的一开始没理解怎么存进去内存,后来问了老师也清楚了!还有就是写代码的时候,如果使用寄存器计数或者什么,一定要记得置0!!!尤其是你一开始存到AL后边用AX的时候,记得把AH置0!!我就是因为置0的问题,一直输出不正确,看了代码好长时间才发现!!

    五.实验总结与体会
    通过本次对循环问题的求解,使我更加熟悉了跳转、循环等指令的使用。还结合了前面输入输出的内容,温故知新。使用了新指令:NEG。自己写程序时老是犯一些比较低级的小错,要注意。

    更多相关内容
  • 汇编语言中的有符号数和无符号数

    千次阅读 2015-08-21 13:24:50
     在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分符号还是无符号然后用两个标准来...
    

    一、只有一个标准

           在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号然后用两个标准来处理,它统统当作有符号的!并且统统汇编成补码!也就是说,db -20 汇编后为:EC ,而 db 236 汇编后也为 EC 。这里有一个小问题,思考深入的朋友会发现,db 是分配一个字节,那么一个字节能表示的有符号整数范围是:-128 ~ +127 ,那么 db 236 超过了这一范围,怎么可以?是的,+236 的补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的字节更好了)是可以装下的,应为:00 EC,也就是说 +236的补码应该是00 EC,一个字节装不下,但是,别忘了“截断”这个概念,就是说最后的结果被截断了,00 EC 是两个字节,被截断成 EC ,所以,这是个“美丽的错误”,为什么这么说?因为,当你把 236 当作无符号数时,它汇编后的结果正好也是 EC ,这下皆大欢喜了,虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想输入有符号的数,比如 -20 那么汇编后的结果是正确的;如果你输入 236 那么你肯定当作无符号数来处理了(因为236不在一个字节能表示的有符号数的范围内啊),得到的结果也是正确的。于是给大家一个错觉:汇编器有两套标准,会区分有符号和无符号,然后分别汇编。其实,你们被骗了。:-)

     

    二、存在两套指令!

           第一点说明汇编器只用一个方法把整数字面量汇编成真正的机器数。但并不是说计算机不区分有符号数和无符号数,相反,计算机对有符号和无符号数区分的十分清晰,因为计算机进行某些同样功能的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备的。但是,这里要强调一点,一个数到底是有符号数还是无符号数,计算机并不知道,这是由你来决定的,当你认为你要处理的数是有符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理的数是无符号的,那就用处理无符号数的那一套指令。加减法只有一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指令:mul div movzx … 是处理无符号数的,而这些:imul idiv movsx … 是处理有符号的。

    举例来说:

           内存里有 一个字节x 为:0x EC ,一个字节 y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。当作无符号数看时,x = 236 ,y = 2 。下面进行加运算,用 add 指令,得到的结果为:0x EE ,那么这个 0x EE 当作有符号数就是:-18 ,无符号数就是 238 。所以,add 一个指令可以适用有符号和无符号两种情况。(呵呵,其实为什么要补码啊,就是为了这个呗,:-))

           乘法运算就不行了,必须用两套指令,有符号的情况下用imul 得到的结果是:0x FF D8 就是 -40 。无符号的情况下用 mul ,得到:0x 01 D8 就是 472 。(参看文后附录2例程)

     

    三、可爱又可怕的c语言。

           为什么又扯到 c 了?因为大多数遇到有符号还是无符号问题的朋友,都是c里面的 signed 和 unsigned 声明引起的,那为什么开头是从汇编讲起呢?因为我们现在用的c编译器,无论gcc 也好,vc6 的cl 也好,都是将c语言代码编译成汇编语言代码,然后再用汇编器汇编成机器码的。搞清楚了汇编,就相当于从根本上明白了c,而且,用机器的思维去考虑问题,必须用汇编。(我一般遇到什么奇怪的c语言的问题都是把它编译成汇编来看。)

           C 是可爱的,因为c符合kiss 原则,对机器的抽象程度刚刚好,让我们即提高了思维层面(比汇编的机器层面人性化多了),又不至于离机器太远 (像c# ,java之类就太远了)。当初K&R 版的c就是高级一点的汇编……:-)

           C又是可怕的,因为它把机器层面的所有的东西都反应了出来,像这个有没有符号的问题就是一例(java就不存在这个问题,因为它被设计成所有的整数都是有符号的)。为了说明c的可怕特举一例:

     

    #include <stdio.h> 
    #include <string.h> 
    
    int main()
    {
        int x = 2; 
        char * str = "abcd"; 
        int y = (x - strlen(str) ) / 2;
    
        printf("%d/n",y);
    
        return 0;
    }
    

           结果应该是 -1 但是却得到:2147483647 。为什么?因为strlen的返回值,类型是size_t,也就是unsigned int ,与 int 混合计算时类型被自动转换了,结果自然出乎意料...

           观察编译后的代码,除法指令为 div ,意味无符号除法。

           解决办法就是强制转换,变成 int y = (int)(x - strlen(str) ) / 2; 强制向有符号方向转换(编译器默认正好相反),这样一来,除法指令编译成 idiv 了。我们知道,就是同样状态的两个内存单位,用有符号处理指令 imul ,idiv 等得到的结果,与用 无符号处理指令mul,div等得到的结果,是截然不同的!所以牵扯到有符号无符号计算的问题,特别是存在讨厌的自动转换时,要倍加小心!(这里自动转换时,无论gcc还是cl都不提示!!!)

           为了避免这些错误,建议,凡是在运算的时候,确保你的变量都是 signed 的。(完)

     

     

    附录

    1:顺便指出楼上那位同志错误的地方,《IA-32 Intel Architecture Software Developer’s Manual》第2卷PDF文档表述为“sign-extended imm8”,这个sign-extended 是符号扩展的意思,他理解成有符号数了。。。

    说说符号扩展:当操作数进行长度扩展时,既要让操作数变长又不能改变原数值,所以就出现了符号扩展一说。比如 movsx ax, 0xEC ,执行扩展后,ax的值为:0xFFEC,长度变长了,结果没变,都是 -20 。

     

    2:两套乘法指令结果例程

     

    ;; 程序存储为 x.s 

    ;;--start--------------------------------------------------------

     

    extern printf 

    global main 

     

    section .data

            str1: db "%x",0x0d,0x0a,0 

            n: db 0x02

    section .text 

    main: 

            xor eax,eax

            mov al, 0xec

            mul byte [n] ;有符号乘法指令为: imul

     

            push eax

            push str1

            call printf 

            

            add esp,byte 4 

            ret 

    ;;--end---------------------------------------------------------------

     

    编译步骤:

    1. nasm -felf x.s 

    2. gcc x.o

     

    ubuntu7.04 下用nasm和gcc编译通过。结果符合文章所述。

     

    展开全文
  • (1)从外部扩展RAM中读取被乘数和乘数,乘数存放于0100H处开始,总共3个乘数,每个乘数是3字节的有符号数。被乘数存放于0200H处开始,总共3个被乘数,每个被乘数是3字节的有符号数。 (2)把结果储存到内部存储区,...

    问题:
    (1)从外部扩展RAM中读取被乘数和乘数,乘数存放于0100H处开始,总共3个乘数,每个乘数是3字节的有符号数。被乘数存放于0200H处开始,总共3个被乘数,每个被乘数是3字节的有符号数。
    (2)把结果储存到内部存储区,从40H开始的地址处。

    思路:
    汇编实现
    1.用DPTR双指针分别操作乘数和被乘数,R0存放的地址,存放结果,R2=3循环次数。
    2.先进行符号位的判断,如果为负数需要变成正数,在这里我编写了一个函数可以把负数变成正数,就可以分别把乘数和被乘数放入函数中判定。
    3.同时我设置了一个标志位R1,地址为0052H。若判定为负数,则加一,这样若两个数都为负数或者都为正数则末位为零,若其中一个为正数另一个为负数则末位为一。
    4.编写两字节无符号数相乘函数,送入变成正数的两字节数函数使之相乘。
    5.最后根据R1所在地址的数字末位为一还是零来确定最后结果的符号数。
    6.循环三次,得到三个乘数与三个被乘数乘积的结果。
    c语言实现详见代码
    汇编代码

    sfr AUXR =0x8e;
    ORG 0000H
    LJMP main
    ORG 100H	;定义主程序入口,主程序代码首地址
    main: 
    ;;;;;;;;;;;;;初始化,将被乘数与乘数输入到特定地址;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    init:;初始化,将被乘数与乘数输入到特定地址
    	ORL AUXR,#00000010B ;选择片外扩展ram
    	;存放三位乘数
    	mov dptr,#0100h
    	mov a,#044h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0101h
    	mov a,#055h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0102h
    	mov a,#-055h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0103h
    	mov a,#044h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0104h
    	mov a,#033h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0105h
    	mov a,#022h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    
    	;存放三位被乘数
    	mov dptr,#0200h
    	mov a,#-78h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0201h
    	mov a,#078h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0202h
    	mov a,#-012h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0203h
    	mov a,#012h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0204h
    	mov a,#044h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    	mov dptr,#0205h
    	mov a,#056h
    	movx @dptr,a	   ;将a寄存器的存放的数字存放到dptr存放的地址中
    ;;;;;;;;;;;;;;;;初始化双dptr指针的首地址和存放结果的首地址;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    	AUXR1 equ 0xA2;等值指令在以后可以用auxr1代替0xA2
    	ORL AUXR1,#00000001B;切换数据指针
    	MOV DPTR,#0100H	 ;初始化DPTR1首地址
    	INC AUXR1;		   
    	MOV DPTR,#0200H	;初始化DPTR0首地址	  
    	MOV A,#0043H	;初始化结果的低位
    	MOV R0,A     ;将保存结果的最低位地址传递给R0
    	MOV R2,#03;循环次数
    	MOV R1,#0052H    ;存储一个标志位,表示最后的正负
    ;;;;;;;;;;;判断正负并且把负数变成正数储存到原来的位置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LOOP:		
    ;;;;;;;;;;;;;判断乘数的正负并把负数变为正数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    	INC AUXR1;		   ;DPPTR1
    	MOVX A, @DPTR
    	MOV R6,A;   将最高位传入函数中判断正负
    	LCALL NEG;
    ;;;;;;;;;;;;;;;;;;;;;;;;判断被乘数的正负并把负数变为正数;;;;;;;;;;;;;;;;;;;;;;;;
    	INC AUXR1;		   ;DPTR0
    	MOVX A, @DPTR
    	MOV R6,A;将最高位传入函数中判断正负
    	LCALL NEG;
    
    ;;;;;;;;;;;;;将片外ram数据传送给r6r7,r4r5相乘;;;;;;;;;;;;;;;;;;;;;;;;
        INC AUXR1;		   ;DPTR1
    
    ; ;;;;;   将两个字节的数字放入R6R7中;;	 ;;;;;;
    	MOVX A,@DPTR;	;DPTR1
    	MOV R6,A;		;取高字节
    	INC DPTR;		;地址加一切换地址取低字节
    	MOVX A,@DPTR;
    	MOV R7,A;  取低字节  
     ;;;;将两个字节的数字放入R4R5中	;;	 ;;;;;
    	INC AUXR1;切换dptr指针 dptr0
    	MOVX A,@DPTR;
    	MOV R4,A;
    	INC DPTR;dptr存放的地址加一
    	MOVX A,@DPTR;
    	MOV R5,A;    
    	LCALL  MUL2BYTE	  ;调用两字节相乘函数
    
    ;;;;;;;;;;;;;;;确定最后的符号;;;;;;;;;;;;;;;;
    	 MOV A,@R1;
    	 JB ACC.0 ,NEGTIVE;若低位为1则转移说明为负数,调用函数把结果变为负数
    INIT1:
    ;;;;;;;;初始化下一次循环的地址;;;;;;;;;;;;;;;;;;;;;
    	 INC DPTR;DPTR0,将dptr指针加一为下一次循环做准备
    	 INC AUXR1;
    	 INC DPTR;DPTR1
    	 INC R0;
    	 INC R0
    	 INC R0
    	 INC R0
    	 INC R0;
    	 INC R0
    	 INC R0
    	 ;结果储存首地址更新
         DJNZ R2,LOOP;	乘数未取完则跳转到loop	,否则结束
     	 LJMP END1;结束
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;两字节相乘函数  测试数据0FFFh*0FFFH,0123H*0132H,7548H*4568H,01H*01H,00H*00H
    MUL2BYTE:		 
    	;乘数低位与被乘数低位相乘
    	MOV A,R7
    	MOV B,R5
    	MUL AB
    	ADDC A,@R0;
    	MOV @R0,A;将低位存储
    	DEC R0	 ;R0中存放的地址减一
    	MOV A,B;
    	ADDC A,@R0;
    	MOV @R0,A;将高位储存	
    	;乘数高位与被乘数低位相乘
    	MOV A,R6   ;
    	MOV B,R5   ;
    	MUL AB	   ;
    	ADDC A,@R0  ; 本次的低位与上一位高位相加
    	MOV @R0,A  ; 结果保存到特定位置
    	DEC R0	 ;R0中存放的地址减一
    	MOV A,B
    	ADDC A,@R0  ;若有进位加上进位
    	MOV @R0,A;将高位储存
    	;乘数低位与被乘数高位相乘
    	MOV A,R7	 ;
    	MOV B,R4	 ;
    	MUL AB		 ;
    	INC R0	     ;
    	ADD A,@R0    ;
    	MOV @R0,A	 ;	
    	MOV A,B      ;
    	ADDC A,#0    ;
    	DEC R0
    	ADD A,@R0;	加上上一位高位,这里不需要ADDC因为进位信号上面已经加入
    	MOV @R0,A;
    	DEC R0;
    	MOV A,#0;
    	ADDC A,@R0;
    	MOV @R0,A;
    	INC R0;  在这里最高位加上进位信号,这是因为在下面操作A寄存器的时候进位信号可能会被清除
    	;乘数高位与被乘数低位相乘
    	MOV A,R6	 ;
    	MOV B,R4	 ;
    	MUL AB		 ;
    	ADD A,@R0; 本次相乘低位与上次相乘高位相加
    	MOV @R0,A
    	MOV A,B
    	DEC R0  ;
    	ADDC A,@R0;
    	MOV @R0,A;
    	CLR C;
    	RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    ;判断数字的正负并且把负数改成整数
    NEG:
    	CLR C;			   cy清零
    	MOV A,R6 ;
    	JB ACC.7,CHANGE;	JB以直接寻址的位转移指令,如果bit==1则转移 ,否则顺序执行
    	RET
    ;将负数改成正数,因为51中储存负数是用补码进行存储的因此需要转变为原码,减一取反
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    CHANGE:
    	INC @R1  ;
    	MOV A,R6 ;
    	SUBB A,#01H ;
    	MOV R6,A  ;  减一
    
    	MOV A,R6
    	CPL A    ;
    	MOV R6,A ;
    	;取反
    	MOV A,R6;
    	MOVX @DPTR,A;将数据传送回原来的地址
    	RET		  
    
    ;;;;;;;;判断为负数加负号(将高位变成1);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;		
    NEGTIVE:
    	MOV A,@R0;
    	ORL A,#10000000B
    	MOV @R0,A
    	INC @R1;  将标志位位清除为0;
    	LJMP  INIT1;因为在这里不是用lcall调用的函数因此需要用LJMP返回去。	
    END1:
    END
    

    c语言代码

    #include <STC12C5A60S2.H>
    //定义三个乘数的地址
    xdata int a1 _at_  0x0100;
    xdata int a2 _at_  0x0102;
    xdata int a3 _at_  0x0104;
    //定义三个被乘数的地址
    xdata int b1 _at_  0x0200;
    xdata int b2 _at_  0x0202;
    xdata int b3 _at_  0x0204;
    main()
    {
    	int i;	
    	int xdata *a=0x100;	 //定义指针变量访问乘数
    	int xdata *b=0x200;	 //定义指针变量访问被乘数
    	long data  *c=0x40;	 //	定义指针变量访问结果,
    	//因为int*int有可能超多int的值域因此定义long类型
    	a1=0x1122; a2=-0x7fff; a3=-0x7fff;  //为乘数赋值 
    	//这里因为最高一位为符号位因此乘数范围为-0x7fff~0x7fff
    	b1=0x4455; b2=0x7fff; b3=-0x7fff;  //被乘数赋值
    	for(i=0;i<3;i++)
    	{
    		*c=(long)(*a)*(long)(*b);	//乘数与被乘数相乘,
    		//这里用了强制类型转化,都变成long类型相乘
    		c++;
    		a++;
    		b++; //乘完之后各地址自增,按照自己数据长度自增;
    		//比如b,c一次自增两个字节,c自增四个字节;
    	}
    	return 0;
    
    }
    
    
    展开全文
  • 汇编c语言变量

    2021-05-23 02:10:30
    在编译期间,编译器根据函数的参数类型确定实际的函数名称(或汇编语言中的函数名称). 与c不同,此命名规则更加复杂. 它仅在变量名称和函数名称之前添加下划线. 因此,在c文件中定义了名为name的全局变量或函数,并...

    f841ea9a3691b407537f68a684aebff6.png

    vsf88gj1zs.jpg广告

    Apple iPad,AirPods Pro,Bose耳机,机械键盘,健身环等着您

    由于c ++支持重载,因此可以使用相同的函数名称但不同的参数类型定义函数. 在编译期间,编译器根据函数的参数类型确定实际的函数名称(或汇编语言中的函数名称). 与c不同,此命名规则更加复杂. 它仅在变量名称和函数名称之前添加下划线. 因此,在c文件中定义了名为name的全局变量或函数,并在cpp文件中定义了...

    在嵌入式汇编中,您可以将c语言表达式指定为汇编指令的操作数,而不必担心如何将c语言表达式的值读取到寄存器中以及如何编写. 计算结果返回到c变量. 您只需要告诉c语言表达式和程序中汇编指令操作数之间的对应关系,gcc就会自动插入代码以完成必要的操作. 1.简单的内联汇编示例: __asm__ __volatile __(hlt); __asm__表示...

    第一个占位符%0对应于c语言变量addr,第二个占位符%1对应于c语言变量nr. 因此,以上汇编语句代码等效于以下伪代码: btsl nr,addr,此指令的两个操作数不能全部是存储变量,因此将nr的合格字符串指定为“ ir”,并将nr和立即数指定为或关联该寄存器,以便两个操作数中只有addr是一个内存变量. 4.限制字符4.1. 限制字符列表...

    1d7443064062b7f02af57501d12b4c9a.png

    C语言变量可以大致分为全局变量,局部变量,堆变量和静态局部变量. 这些不同的变量存储在不同的位置,并且具有不同的生命周期. 通用程序将内存分为数据段,代码段,堆栈段和堆段. 这些类型的变量存储在不同的段中,从而导致它们具有不同的生命周期. 全局变量全局变量的生命周期是整个程序的生命周期,存在于程序运行时...

    cc-by-nc-nd-4.0本文从编译,二进制程序文件和操作的角度逐步分析了Linux c语言程序中的几种变量类型. 吴章锦老师的“ 360度Linux Elf系列分析”: 吴章锦: 如何创建*可执行文件*共享库吴章锦: 深入分析Linux共享库的“位置无关”实现原理吴章锦: 添加前几天通过操作部分为Linux elf程序提供的数据背景说明...

    qdwx6iz1e.png

    计算机真正可以理解的是一种低级语言,专门用于控制硬件. 汇编语言是一种直接描述控制CPU操作的低级语言. 如果要确切了解CPU的功能以及代码步骤,则必须学习汇编语言. 汇编语言不容易学习,甚至简明的介绍也很难找到. 下面,我尝试编写一个最著名的汇编语言教程,该教程解释了CPU如何执行代码. ?一个...

    3bemxvxk9g.png

    ee38b6996d990ad5db44c7654f40d2dd.png

    计算机真正可以理解的是一种低级语言,专门用于控制硬件. 汇编语言是一种直接描述控制CPU操作的低级语言. 如果要确切了解CPU的功能以及代码步骤,则必须学习汇编语言. 汇编语言不容易学习,甚至简明的介绍也很难找到. 下面,我尝试编写一个最著名的汇编语言教程,该教程解释了CPU如何执行代码. ?一个...

    在阅读本文之前,请阅读gcc的相关文档,以确保您对如何在C语言中使用汇编语言有基本的了解. 文档地址为: https: gcc.gnu.orgonlinedocsgcc-9. 2. 0gccusing-assembly-language-with-c.html#using-assembly-language-with-c ---- 1.基本的asm和没有输出操作数的asm在默认情况下是易失的,因此它们不需要. ..

    gnu c内联汇编简介1.很久以前,我听说c语言可以直接嵌入汇编指令. 但是我之前没有详细介绍. 最近,由于一定的需求,我看到了相关的C语言代码. 简单地学习如何在C代码中嵌入汇编指令是很自然的. ---- asm__asm__关键字1.通常,在c代码中,我们使用asm__asm__关键字告诉编译器将指定的内容视为...

    由于变量__shrt是16位的short类型,因此编译后的汇编代码将使该变量使用%ax寄存器. 编译结果为: movw -2(%ebp),%ax#%ax = __shrt#appmovl%ax,%bx#no_app无论是输入或输出操作表达式约束,都可以使用寄存器约束. 下表列出了寄存器约束的常用缩写. 约束输入输出的意思是r i,o表示使用一个...

    以下是从百度百科转而来的c语言是一种计算机编程语言,它既具有高级语言的特征又具有汇编语言的特征. 它由美国贝尔实验室的Dennis M. Ritchie于1972年推出. 自1978年以来,C语言已被移植到大型,中型,小型和微型计算机中. 它可以用作编写系统应用程序的工作系统设计语言. 可以用作应用程序编程语言,编写不依赖于计算机硬件...

    5c8a58e5687e7ad1f52ecd38a3edacf1.png

    例如,当我最近在手臂上编写一个fir程序时,我需要使最终结果饱和,但是gcc没有提供ssat之类的功能,因此我不得不将汇编指令嵌入到c代码中. 1.在C语言中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联. 当然,gcc可以帮助我们考虑一下. 这是一个简单的例子. asm(“ fsinx%1,%0”: “ = f”(结果): “ f”(角度))...

    接下来,我们将通过汇编语言查看全局变量和局部变量之间的区别. 下面定义的C语言代码分别定义了局部变量和全局变量,并为每个变量赋值. 让我们看一下源代码部分,以定义初始化的全局变量int a1 = 1;整数a2 = 2;整数a3 = 3;整数a4 = 4;整数a5 = 5;定义未初始化的全局变量int b1,b2,b3c语言对应汇编语句,b4,b5;定义...

    khvu081jqx.jpeg

    一开始,pdp-11上的unix系统仍然是用汇编语言开发的,但是由于pdp-11和pdp-7仍然有很多更改,因此,开发人员计划用b重写它. 语言. 系统. b语言是由...编写的. c语言是一种高级编程语言,它更接近硬件底层,并且具有非常好的抽象性,表达性和灵活性. 此外,它具有非常有效的运行时性能. 因此,c语言从1970年开始至今...

    此时无法使用变量a的汇编地址,因为此时的ebp不再是主要的ebp mov ecx,dword ptr将a的值分配给ecx mov dword ptr,ecx temp = a = 2 mov edx ... swap函数大致处理如下: 将下一个地址压入堆栈,然后将参数压入堆栈,然后将所有寄存器压入堆栈,分配空间,清除空间c,然后启动具有变量分配的程序,然后进行堆栈平衡以清理堆栈...

    1d112269f5e0b12e13bc092443a02238.png

    b5t975wk75.png

    使用高级语言编程时,如果程序要处理一定数量的更改,通常必须使用更改的某种数据类型定义一个符号名称c语言对应汇编语句,该符号名称等于使用更改量. 汇编语言也是如此,不同之处在于它们的描述和引用不同. 4.1标识符在汇编语言中,标签,内存变量名称,子例程名称和宏名称都是标识符,通常是最多的标识符.

    例如C语言中的数字,字符串,变量和关键字的定义,例如main,if,else,while,{,},+,-,*等. 预编译程序需要通过词法分析和语法分析来完成工作...分析词法和语法,将高级语言指令转换为功能上等效的汇编代码,然后将汇编程序转换为机器语言,并遵循操作系统对可执行文件格式链接生成的要求可以是...

    02在第一次编译器大战之后,Hope继续在计算机的最前沿工作. 为了释放计算机的潜力,她设计了一种称为算术语言版本0的高级编程语言,称为a-0. 汇编和机器指令是的对应关系,但是可以将一行高级编程语言转换成几十个二进制指令,以实现这种复杂的转换,料斗在1952年创建了第一个编译器. 该编译器专门从事转换将高级语言转换为低级语言,例如...

    5z6b0mggpu.png

    反知识第14讲,(C语言的结尾)汇编一中的结构表达式,了解什么是结构,并计算结构成员的值和总大小(类也是如此)结构身体的特征1结构是一组由相同或不同类型的数据组成的数据集合. 2.在c语言中,结构是指c语言中的数据结构. 汇总数据类型(汇总数据...

    a4bq254mtm.jpeg

    c语言中,指针是一种变量. 可能有一个指向int的指针,一个指向float的指针,一个指向结构的指针以及一个非常重要的类型: 指向函数的指针. 例如,有以下函数: 什么是void函数(int a,char b){... ...}?编译上面的c语言源代码并生成一个汇编文件,以显示“功能”的外观: ?注意第五行,显然是函数功能...

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-163238-1.html

    展开全文
  • 编写汇编程序,求出首地址为BUF的10个有符号字的内容之和 ;并存入字变量SUM单元 DATA SEGMENT BUF DW 12H,34H,56H,43H,21H,98H,09H,78H,57H,95H SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:...
  •  程序中的变量是指其值在程序运行过程中可以改变的量ARM(Thumb)汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。  ·数字变量用于在程序运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示...
  • 三个排序,可用三个变量之间相互比较,按大小要求排序。 C语言伪代码: if(a>b) /*如果a大于b,借助中间变量t实现a与b值的互换*/ { t = a; a = b; b = t; } if(a>c) /*如果a大于c,借助中间变景t实现a...
  • 汇编语言】 变量

    千次阅读 多人点赞 2021-03-29 08:49:48
    汇编语言 变量 一、变量的概念 二、变量的定义 (1)变量名 (2)变量定义伪指令 1.助记符:BYTE 2.助记符:WORD 3.助记符:DWORD (3)初值表 三、多字节数据的存储顺序 (1)字节编址的主存储器 (2)数据的存储顺序 (3)小端...
  • 汇编语言实验报告
  • 汇编符号与无符号数以及CF,OF标志位的区分

    万次阅读 多人点赞 2016-05-01 20:04:20
    汇编符号与无符号数以及CF,OF标志位的区分
  • 汇编程序16位带符号变量计算

    千次阅读 2017-11-27 17:49:04
    用16位指令编写完整的程序,并上机测试,计算W=(x+y)*z,其中所有变量均为16位带符号变量。注意伪指令的使用。data segment x db 7 y db -3 z db 2 w db ? data ends;定义数据段,其中X,Y,Z为一个字节,V为16位结果...
  • 汇编语言的符号、标号和变量符号

    千次阅读 2018-06-13 22:02:07
    转自:https://blog.csdn.net/benny5609/article/details/2470132#commentBox计算机... 在宏汇编语言中所有变量名、标号名、记录名、指令助记符和寄存器名等统称符号.这些符号可通过汇编控制语句的伪操作命令重新命...
  • 有符号数与无符号数的加减法

    万次阅读 多人点赞 2017-04-24 14:41:58
    1、符号数与无符号数的人为规定性:一个数是符号还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。10000100+00001110 若规定为无符号数,即 132+146=146D 。若规定为...
  •  程序中的变量是指其值在程序运行过程中可以改变的量ARM(Thumb)汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。  ·数字变量用于在程序运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示...
  • 简单的汇编程序

    2018-03-07 17:07:07
    变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。 两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上...
  • 1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成...2、一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。
  • 编写一程序,实现两个三字节无符号数DATA1和DATA2的相加,结果送四字节变量ANS。上机调试程序,检查执行结果。
  • 12.2从汇编代码访问C全局变量汇编代码中访问C全局变量,只能通过地址间接访问全局变量。...对于无符号变量,使用:·LDRB/STRB:用于char型;·LDRH/STRH:用于short型(对于ARM体系结构v3,使用两个LDRB/STRB指令...
  • 汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分符号还是无符号然后用两个标准来处理...
  • 汇编 堆栈 变量存储 指针

    千次阅读 2018-09-10 22:22:25
    汇编 堆栈 变量存储 指针 先说栈的概念,栈其实也是一种。。。。。先说内存的概念吧。。。。。额 先说计算机吧,简单来说的话,可以把计算机理解成由 CPU,内存,硬盘组成, 而CPU内部又包括一种叫做内部寄存器的...
  • 这个问题我在学习汇编语言的过程中一直很苦恼,在网上看了很多帖子,基本上都是说是人自己设定是有符号数还是无符号数的。这样的回答是很扯淡的,TM计算机和人脑又不是一个东西,看来很多人学东西基本上都是一知半解...
  • 汇编语言(32位二进制数的减法、带符号数除法、字符串大小写转换、分段函数求值,含源程序)
  • 汇编指令实现两个数字相减,通过汇编指令实现输出
  • 单片机汇编语言--双字节二进制无符号数与单字节和双字节做除法,两个程序
  • 有符号数和无符号数

    千次阅读 2018-10-01 22:31:55
    专题:汇编语言中有符号数还是无符号数? 一、汇编语言在存储方面讲,有符号数和无符号数存储形式是一致的。 l 数据在内存或CPU的寄存器中都是按照有符号数的二进制补码方式存储的。  例如(在debug中测试): ...
  • 汇编符号与无符号数的区分

    千次阅读 2017-07-30 16:03:46
    origin: http://blog.chinaunix.net/uid-28458801-id-3576608.html 转载自:... 一、只有一个标准! ...在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统
  • 问题描述 在 BUF 和 BUF+1、BUF+2 单元分别放一个无符号字节型数,编...定义字节型buf变量并存入三个无符号数 MAX DB 2 DUP(?),'$';定义max变量存放结果的两位asii码,并以$符结尾,方便以字符串形式输出 MSG DB
  • 汇编语言程序设计.7z

    2019-06-19 22:46:30
    武汉理工大学汇编语言程序设计相关资源,包括实验报告,实验指导书,ppt,复习考卷
  • 两个有符号十进制相乘:从键盘输入两个有符号十进制相乘,显示结果。 include io32.inc .data .code start: call readsid ;读取的整数存放在寄存器eax mov ebx,eax ; 把上一个读取的整数放到寄存器ebx call...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,239
精华内容 21,695
关键字:

有符号数变量 汇编