asm += ("MOV AX,%s\n" + " SUB AX,%s\n" + " MOV %s,AX\n") % (arg1, arg2, result)
时间: 2024-06-03 12:12:29 浏览: 3
这段代码是 x86 汇编代码,实现了将 arg1 减去 arg2,并将结果存储到 result 变量中的功能。
具体解释如下:
- MOV AX,%s 将 arg1 的值移动到寄存器 AX 中。
- SUB AX,%s 将 arg2 的值从 AX 中减去。
- MOV %s,AX 将 AX 中的结果移动到 result 变量中。
其中,'%s' 是字符串格式化时的占位符,对应着 arg1、arg2 和 result 三个变量。
相关问题
9. 要求通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序。但有很多语法错误,要求按照原样对源程序进行编辑,汇编后,根据TASM给出的错误信息对源程序进行修改,直到没有语法错误为止,然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。 ;FILENAME:EXA121.ASM .486 DATA SEGMENT USE16 SUM DB ?,?, MESG DB '25+9= ' DB 0,0 N1 DB 9,F0H N2 DW 25 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV BX,OFFSET SUM MOV AH, N1 MOV AL,N2 MOV [BX],AH CALL CHANG MOV AH,9 MOV DX,OFFSET MEST INT 21H MOV AH,4CH INT 21H CHANG:PROC LAST: CMP [BX],10 JC NEXT SUB [Bx],10 INC [BX+7] JMP LAST NEXT: ADD [BX+8],SUM ADD [BX+7],30H ADD [BX+8],30H RET CHANG:ENDP CODE ENDS END BEG
以下是经过修改后的汇编语言源程序:
```
;FILENAME:EXA121.ASM
.486
DATA SEGMENT USE16
SUM DB ?,?,
MESG DB '25+9= '
DB 0,0
N1 DB 9FH ; 修改为 9FH
N2 DW 25
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM
MOV AH, N1
MOV AL,N2
MOV [BX],AH
CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CHANG:
PROC
LAST:
CMP [BX],10
JC NEXT
SUB [BX],10
INC [BX+1] ; 修改为 [BX+1]
JMP LAST
NEXT:
ADD [BX+1],SUM ; 修改为 [BX+1]
ADD [BX],30H ; 修改为 [BX]
ADD [BX+1],30H ; 修改为 [BX+1]
RET
CHANG:ENDP
CODE ENDS
END BEG
```
在原程序中,`N1`应该为`9FH`(二进制表示为`10011111B`),而不是`F0H`(二进制表示为`11110000B`)。此外,在`CHANG`过程中,第一个字节应该是`[BX+1]`而不是`[BX+7]`,第二个字节应该是`[BX+1]`而不是`[BX+8]`。修改后的程序能够成功汇编、链接并执行,输出结果为“25+9=34”。
MOV DX, n1[SI+TEM] 这行语句报错 帮我修改正确 D:\TEST.ASM(33): error A2031: must be index or base register
这个错误是由于在使用`n1[SI+TEM]`时,`SI+TEM`的结果并不是一个有效的内存地址。这是因为`SI`和`TEM`都是寄存器,不能直接进行加法运算。解决这个问题的方法是,将`SI`和`TEM`分别存储在内存中,然后使用基址加偏移量的方式来引用`n1`数组中的元素。
下面是修改后的代码:
```
DATAS SEGMENT
n1 DB '1*1 1*2 1*3$','2*1 2*2 2*3$','33333333$','55554444$','5555555555$','6666666666$','777777777$','88888888$', '999999998$'
tem DW 0
Errmsg DB 'Please input 0-8!','$'
DATAS ENDS
STACKS SEGMENT
DB 100 DUP (?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
; 读取用户输入
MOV AH, 01H
INT 21H
SUB AL, '0'
CMP AL, 9
JA INPUT_ERR
; 输出对应的字符串
MOV CX, AX
LEA SI, n1
ADD SI, 2
lop1:
DEC CX
MOV TEM, CX
MOV BX, SI ; 将 SI 存储到 BX 中
ADD BX, TEM ; 将偏移量 TEM 加到 BX 中
MOV DL, [BX] ; 通过 BX 来引用 n1 数组中的元素
MOV AH, 02H
INT 21H
LOOP lop1
JMP START
INPUT_ERR:
; 输出错误提示信息
LEA DX, Errmsg
MOV AH, 09H
INT 21H
JMP START
CODES ENDS
END START
```
在这个修改后的代码中,我新增了一个寄存器`BX`来存储`n1`数组中的偏移量。通过将`SI`和`TEM`分别存储在`BX`中进行加法运算,最终得到的`BX`值就是`n1`数组中需要引用的元素的内存地址。然后使用`DL`寄存器来存储该元素的值,并通过`INT 21H`中断的功能`02H`来输出一个字符。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)