HJ汇编第五章 通用数据处理指令

文章详细解释了汇编语言中的基本指令,如MOV、INC、DEC、ADD、ADC、MUL、DIV等的使用及其错误情况,涉及内存操作、算术运算结果处理和字符串处理,以及从键盘输入和姓名转换为大写的示例。
摘要由CSDN通过智能技术生成

1.MOV

下列指令中,哪些是正确的,哪些是错误的,并指明错误原因

MOV AL,315     错误溢出  AL是八位寄存器  最大只能为FFH=255

MOV DS,2000H    错误,不能⽤⽴即数给段寄存器赋值

MOV [BP],2019  错误  [bp]类型不明确

MOV CS,BX 错误  CS不能自行改

MOV AX,DL  错误,AX十六位,DL八位

MOV BX,1234H  正确

MOV DS,SS 错误  DS,SS都是段寄存器

MOV BL,OFFSET STRING  错误  长度不一

MOV DX,STRING  错误 长度不一

MOV [DI],STRING  错误  两个内存数据

2.INC ,DEC

INC 寄存器/内存单元    相当于i++

DEC 寄存器/内存单元   相当于i--

3.ADD,SUB

ADD 通用寄存器,立即数

ADD 通用寄存器,通用寄存器

ADD 内存单元,立即数

ADD 内存单元,通用寄存器

4.ADC(带进位的加法)SBB(带错位的减法)

12345678H+0000FFFFH=12355677H

MOV AX,WORD PTR X;   5678H 赋值给AX

MOV DX,WORD PTR X+2;  1234H赋值为DX

ADD AX,WORD PTR X;    

ADC DX,WORD PTR X+2;

MOV WORD PTR Z,AX;

MOV WORD PTR X+2,DX;

5.小写转大写(ACSLL码减32=20H)

DATA SEGMENT
	STRING  DB  "whu"    //数据段
DATA ENDS
 
CODE SEGMENT
	ASSUME	CS:CODE, DS:DATA    //定义CS指向代码段,DS指向数据段
START:
	MOV AX,DATA                    //代码段
	MOV DS,AX
    MOV BX,0             //"whu"看做数组,BX看作C语言循环中的i
    SUB STRING[BX],20H
    INC BX
    SUB STRING[BX],20H
    INC BX
    SUB STRING[BX],20H
	MOV AH,4CH         //代码结束必须加上最后这两行,相当于return 0;
	INT 21H
 
CODE ENDS
	END START

6.LOOP(循环)

求2的10次方

DATA SEGMENT
    //数据段
DATA ENDS
 
CODE SEGMENT
	ASSUME	CS:CODE, DS:DATA    //定义CS指向代码段,DS指向数据段
START:
	MOV AX,1
    MOV CX.10                            //CX表示循环次数 10次
    PEPEAT:
    ADD AX,AX
    LOOP REPEAT
	MOV AH,4CH         //代码结束必须加上最后这两行,相当于return 0;
	INT 21H
 
CODE ENDS
	END START

7.MUL(无符号数的乘法),IMUL(有符号数的乘法)

MUL 8位   结果在AX                             AL(被乘数)

MUL 16位   结果在DX,AX                        AX(被乘数)

MUL 32位   结果在EDX,EAX                EAX(被乘数)

MOV AL,20
MOV BL,5
MUL BL    20*5=100=64H  AX=0064H   结果都放AX中
MOV CX,10H
MOV AX,2000H
MUL CX       AX=0002 0000H(但是ax显示0000,DX显示0002)  结果在DX,AX中
MOV AL,+2
MOV BL,-5
IMUL BL  AX=-10=0FFF6H

 8.DIV(无符号的除法),IDIV(有符号的除法)

DIV 8位   商在AL余数在AH                      AX(被除数)

DIV 16位 商在AX余数在DX                    DX,AX(被除数)

DIV 32位 商在EAX余数在EDX                EDX,EAX(被除数)

MOV DX,0001H
MOV AX,0008H
MOV BX,100H
DIC BX    00010008H/100H=0100H.......0008H
MOV AX,1000H
MOV BL,10H
IDIV BL     1000H/10H=100H  超出FFH。程序中断。

9.内部数据类型

DB 8位

DW 16位

DD 32位

DF 48位

DQ 64位

DT 80位

数据的定义书p150-p152

 10.计算100+10并在屏幕显示

DATA SEGMENT
	LIST DB 4 DUP("$")
DATA ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:
	MOV AX,DATA
	MOV DS,AX
	MOV AL,100
	ADD AL,10
	MOV BL,10
	MOV CX,3
	MOV SI,2
REPEAT:
	MOV AH,0
	DIV BL
	ADD AH,48
	MOV LIST[SI],AH
	DEC SI
	LOOP REPEAT
	MOV DX,OFFSET LIST
	MOV AH,9
	INT 21H
	MOV AH,4CH
	INT 21H
CODE ENDS
END START

11.

1.X、Z、Y、V均为有符号字节变量,试编写出完整的汇编语言源程序完成以下功能:

(1) 计算表达式值[(V+X)*3]/Z->Y,最终的计算结果保存在变量Y中。

(2) 将上述表达式运算结果在屏幕上输出。

    参考数据段如下:(X、Z、Y、V的初值同学们可以修改,验证代码的正确性)

     DATA  SEGMENT

         X  DB  -4

         Z  DB  5

         V  DB  6

         Y  DB  ?,?

;?用来“占位置”,没有初值。变量Y中低字节存储商与高字节存储余数

     DATA  ENDS

//这种代码是知道计算后的答案为1.2   list1输出答案。1.2不用16进制转10进制。
6/5=1......1 等到个位。    余数1*10/5=2 等到小数点后一位
DATA SEGMENT
	X DB -4
	Z DB 5
	V DB 6
	Y DB ?,? 
	LIST1 DB 4 DUP("$")
DATA ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:
	MOV AX,DATA
	MOV DS,AX
	MOV AL,X
	ADD AL,V       ;AL=02
	MOV BL,3
	MUL BL          ;AX
	MOV BL,Z
	DIV BL          ;AH=1 YU   AL=1  SHANG
	MOV LIST1[0],AL
	MOV Y[0],AL
	MOV AL,AH
	MOV BH,10
	MUL BH			;AX=1*10=10
	DIV BL			;10/5=2(小数) AL=2
	MOV LIST1[2],AL
	MOV Y[1],AL
	ADD LIST1[0],48
	MOV LIST1[1],"."
	ADD LIST1[2],48
	MOV DX,OFFSET LIST1
	MOV AH,9
	INT 21H
	MOV AH,4CH
	INT 21H
CODE ENDS
END START
//这种更加规范但更加麻烦
DATA SEGMENT
    X DB -4
    Z DB 5
    V DB 6
    Y DB ?,?
	LIST1 DB 4 DUP("$")
	LIST2 DB 4 DUP("$")
DATA ENDS

CODE SEGMENT
	ASSUME	CS:CODE, DS:DATA
START:
	MOV AX,DATA
	MOV DS,AX
	MOV AL, V
    ADD AL, X
    MOV BL, 3
    MUL BL
    MOV BL, Z
    DIV BL
	MOV Y+1, AH
	MOV Y, AL 
	MOV SI,2
	MOV CX,3
	MOV DL,10
	
REPEAT1:MOV AH,0
	DIV DL
	ADD AH,30H
	MOV LIST1[SI],AH
	DEC SI
	LOOP REPEAT1
	MOV DX,OFFSET LIST1
	MOV AH,09H
	INT 21H
	
	MOV AL,Y+1
	MOV SI,2
	MOV CX,3
	MOV DL,10
REPEAT2:MOV AH,0
	DIV DL
	ADD AL,30H
	MOV LIST2[SI],AL
	DEC SI
	LOOP REPEAT2
	MOV DX,OFFSET LIST2
	MOV AH,09H
	INT 21H
	MOV AH, 4CH
    INT 21H
CODE ENDS
	END START

 12.从键盘输入自己的姓名拼音(用小写输入),将其变为大写后在屏幕上输出。

DATA	SEGMENT
	N EQU 20
	MAXLEN DB N
	ACTLEN DB ?
	STRING DB N DUP(?)
DATA	ENDS
CODE  SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA	;设置DS指向DATA段
	MOV DS, AX
	MOV AH,0AH
	MOV DX,OFFSET MAXLEN
	INT 21H
	MOV BL,ACTLEN
	MOV BH,0
	MOV STRING[BX],'$'
	MOV DL,0AH
	MOV AH,02H
	INT 21H
	MOV SI,0
	MOV CX,BX
REPEAT:
	SUB STRING[SI],32
	INC SI
	LOOP REPEAT
	MOV DX,OFFSET STRING
	MOV AH ,9
	INT 21H
	MOV AH, 4CH		;退出程序
	INT 21H
CODE  ENDS
	END START

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值