汇编程序设计习题(1)

[!FAQ] 3.1 判断下列寻址方式

MOV AX,00H         ;立即寻址
SUB AX,AX          ;寄存寻址
MOV AX,[BX]        ;寄存器间接寻址
ADD AX,TABLE       ;TALBE是一个变量名,代表一个内存地址
					直接寻址
MOV AL,ARAY1[SI]   ;寄存器相对寻址
MOV AX,[BX+6]      ;寄存器相对寻址

[!FAQ] 3.2 若1KB的数据放在TABLE之下,试编程序将该数据搬到NEST之下

TABLE DB 1024 DUP(?)      ; 定义TABLE区域,1024B,初始值未指定 
NEST DB 1024 DUP(?)       ; 定义NEST区域

	MOV SI, OFFSET TABLE  ; SI 指向 TABLE 的起始地址 
	MOV DI, OFFSET NEST   ; DI 指向 NEST 的起始地址 
	MOV CX, 1024          ; 设置循环计数为 1024,
	CLD                   ; 清除方向标志,确保SI和DI在字符串操作中自增 

COPY_LOOP:                ; 循环标签 
	MOVSB                 ; 将DS:SI处的字节移动到ES:DI并且SI,DI根据方向标志加减一 
	LOOP COPY_LOOP        ; 减少 CX 的值,并且如果 CX != 0 就跳回标签 COPY_LOOP
	HLT

[!FAQ] 3.3 试编写10个字(16位二进制数)之和的程序

DATAS DW 10 DUP(?)      ; 定义DATA区域,10字 
	MOV SI, OFFSET DATAS ;
	MOV AX, 0 
	MOV CX, 10
SUM:
	ADC AX, [SI]
	INC SI
	INC SI
	DEC CX
	JNZ SUM
	MOV [SUM], AX
	HLT

[!FAQ] 3.4 某16位二进制放在 DATA 连续两单元中,试编写程序求其平方根和余数,将其分别存于 ANS 和 REMAIN 中

DATA DW 1 DUP(?)
	XOR AX, AX               ; 清零AX
	XOR CX, CX               ; 清零cx用来存储当前的试探值
	MOV SI, OFFSET DATA
	MOV DX, [SI]             ; DX存改二进制数

	MOV BX, 0xFF             ; 255,16位整数的平方根<=256
	SHR BX, 1                ; 除以2,即128作为初始试探平方根
	
TRY_SQRT:                    ; 减去BX*BX,看是否超出DX
	MOV CX, BX               ; 将试探平方根拷贝到CX
	MOV AX, CX
	MUL CX                   ; CX自乘,结果放在AX
	CMP DX, AX               ; 比较AX和DX
	JB NEXT_TRY              ; DX < CX 试探值太大,跳转下一个试探
	SUB DX, AX               ; DX - AX 
	JUMP FOUND               ; 找到了平方根 

NEXT_TRY:
	DEC BX                   ; 递减试探的平方根
	JMP TRY_SQRT             ; 继续尝试 

FOUND:
	MOV [ANS], BX            ; 存平方根结果
	MOV [REMAIN], DX         ; 存储余数
	HLT

[!FAQ] 3.5 试编程序将 BUFFER 中的一个8位二进制数转换为 ASCII 码,并按位数高低顺序存放 ANSWSER 之下

BUFFER DB 1 DUP(?)
ANSWER DB 8 DUP(0)
	LEA SI, [BUFFER]
	LEA DI, [ANSWER]
	MOV AL, [SI]
	MOV CX, 8            ; 循环次数即二进制位数

CONVERT_LOOP:
	ROL AL, 1            ; 将AL左移一位,最高位进CF标志位
	MOV BL, '0'         
	ADC BL, 0            ; 让BL加上进位CF,BF=‘0’ / ‘1’
	MOV [DI], BL
	INC DI
	LOOP CONVERT_LOOP
	
	MOV CX, 8            
	LEA DI, [ANSWER]
	REP MOVSB            ; 字符串操作拷贝字节
	HLT

[!FAQ] 3.6 在DATA1 之下顺序存放着以 ASCII 码表示的千位数,现欲将其转化成二进制数。试编写程序

;通过减去字符'0'(ASCII码为48)的方式来将ASCII字符转换为相应的数值,然后通过迭代这些数值,将整个数转换为一个二进制整数
DATA1 DB '1234', 0
	LEA SI, [DATA1]
	MOV CX, 0             ; 用CX储存转化结果
	MOV BX, 1            ; 数字的位权

CONVERT_LOOP:
	MOV AL, [SI]          ; 读源千位数字符进AL
	CMP AL, '0'           ; 检查是否到达字符串的结尾
	JE CONVERT_DONE       ; 如果到达字符串的末尾,转化完成
	SUB AL, '0'           ; 将ASCII字符转化为相应数字
	MUL BX
	ADD CX, AX            ; 添加当前数到结果中
	IMUL BX, BX, 10       ; 位权乘以10(之前的数需要左移一位)
	INC SI                ; 移动下一个字符
	JMP CONVERT_LOOP              

CONVERT_DONE:
	MOV [RESULT], CX      ; 存储结果
	HLT
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值