繁体   English   中英

带有数据段和循环的汇编x86编码

[英]assembly x86 coding with a data segment and loop

下面的代码从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 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。 因此,您可以将someData直接关联到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

因为someData的类型为BYTE,所以您必须使用AL,而不是EAX,但是,如果要使用DWORD大小的EAX,请先清除它,这样它的所有字节中都将为零,并且以AL值为准在EAX中。

顺便说一句,您使用的是ASCII字符计数,我的意思是,您不是在计数1,2,3 ...而是“ 1”,“ 2”,“ 3” ...如果您要的话这不是问题停在9,但是如果您想转10、11 ...,则需要将someData从“ 1”更改为1。在这种情况下,为了在屏幕上显示someData,您将必须创建一个过程从数字转换为字符,也许这就是WriteDec所做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM