Assembly 使用数据段和循环的汇编x86编码
下面的代码从someData段打印出“1”。然后它打印出数字1到5。我想使用来自数据段的“1”,而不是mov eax设置的1,1。不知道怎么做。当我使用字符“1”时,我认为我可以将其相加以获得下一个数字,而不是对al寄存器进行运算和递增Assembly 使用数据段和循环的汇编x86编码,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,下面的代码从someData段打印出“1”。然后它打印出数字1到5。我想使用来自数据段的“1”,而不是mov eax设置的1,1。不知道怎么做。当我使用字符“1”时,我认为我可以将其相加以获得下一个数字,而不是对al寄存器进行运算和递增 INCLUDE Irvine32.inc .data someData BYTE "1",0dh,0ah,0 .code main PROC call TEST exit main ENDP TEST PROC mov edx,OFFSET so
INCLUDE Irvine32.inc
.data
someData BYTE "1",0dh,0ah,0
.code
main PROC
call TEST
exit
main ENDP
TEST PROC
mov edx,OFFSET someData ; this is just for testing
call WriteString ; just for testing
mov ecx,5
mov eax,1
L1:
call WriteDec ; EAX is a counter
call Crlf
inc al ; next character
Loop L1
ret
TEST ENDP
END main
检查您的代码,我看到您使用的是AL(inc AL),而不是EAX。因此,您可以将某些数据直接分配给AL。或者您可以通过先清除它来使用EAX。我修改您的代码以进行以下更改:
.stack 100h
.data
someData BYTE "1",0dh,0ah,0
.code
main PROC
call TEST
mov ax,4c00h
int 21h
main ENDP
TEST PROC
mov dx,OFFSET someData ; this is just for testing
mov ah,9
int 21h ;DISPLAY SOMEDATA.
mov ecx,5
mov eax,0 ;CLEARING EAX, NOW SOMEDATA
mov al,someData ;IS IN WHOLE EAX.
L1:
call WriteDec ; EAX is a counter
call Crlf
inc al ; next character
Loop L1
ret
TEST ENDP
END main
因为有些数据是BYTE类型的,所以必须使用AL,而不是EAX,但是,如果要使用EAX(大小为DWORD),只需先清除它,这样它的所有字节中都将有零,并且在EAX中以AL值为准
顺便说一下,你是在用ASCII字符计数,我的意思是,你不是在计算1,2,3。。。但是“1”,“2”,“3”。。。如果您想在9点停止,这不是问题,但是如果您想在10点、11点……停止,您需要将某些数据从“1”更改为1。在这种情况下,为了在屏幕上显示一些数据,您必须创建一个从数字到字符的转换过程,可能WriteDec就是这样做的。您忘记发布包含的文件“Irvine32.inc”。我想WriteString、WriteDec和Crlf程序应该在那里。没有它们我无法运行你的程序。我在另一台机器上有它们,我会发回。非常抱歉。我需要使用someData中的“1”