[!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